Docker-Compose搭建Hadoop集群

3,627 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第2天,点击查看活动详情

一、前言

在许多大数据实验中,需要使用到hdfs集群,但是创建按照教程一步步配置虚拟机并搭建一个可用的集群有些过于繁琐了,而通过Docker-Compose就能借用大佬们创建的镜像快速实现集群的搭建。

本文安装的版本为Hadoop3.2.1,在DockerHub上还有更多版本的镜像,有需要的话可以自行替换版本,配置上都是大同小异的

二、docker-compose.yml

Hadoop集群共分配了5个节点,包括:namenode(管理命名空间)、datanode(提供读写请求)、nodemanager(运行程序并监控节点)、resourcemanager(全局资源监控)、historyserver(记录作业信息)节点各一个。

镜像使用了DockerHub上开源的bde2020/hadoop系列镜像,所使用的Hadoop版本为3.2.1,Hadoop集群配置如下:

services:
  namenode:
    image: bde2020/hadoop-namenode:2.0.0-hadoop3.2.1-java8
    container_name: namenode
    ports:
      - 9870:9870
      - 9000:9000
    volumes:
      - ./hadoop/dfs/name:/hadoop/dfs/name
      - ./input:/input
    environment:
      - CLUSTER_NAME=test
    env_file:
      - ./hadoop.env

  datanode:
    image: bde2020/hadoop-datanode:2.0.0-hadoop3.2.1-java8
    container_name: datanode
    depends_on:
      - namenode
    volumes:
      - ./hadoop/dfs/data:/hadoop/dfs/data
    environment:
      SERVICE_PRECONDITION: "namenode:9870"
    env_file:
      - ./hadoop.env
  
  resourcemanager:
    image: bde2020/hadoop-resourcemanager:2.0.0-hadoop3.2.1-java8
    container_name: resourcemanager
    environment:
      SERVICE_PRECONDITION: "namenode:9000 namenode:9870 datanode:9864"
    env_file:
      - ./hadoop.env

  nodemanager1:
    image: bde2020/hadoop-nodemanager:2.0.0-hadoop3.2.1-java8
    container_name: nodemanager
    environment:
      SERVICE_PRECONDITION: "namenode:9000 namenode:9870 datanode:9864 resourcemanager:8088"
    env_file:
      - ./hadoop.env
  
  historyserver:
    image: bde2020/hadoop-historyserver:2.0.0-hadoop3.2.1-java8
    container_name: historyserver
    environment:
      SERVICE_PRECONDITION: "namenode:9000 namenode:9870 datanode:9864 resourcemanager:8088"
    volumes:
      - ./hadoop/yarn/timeline:/hadoop/yarn/timeline
    env_file:
      - ./hadoop.env

上面是docker-compose.yml的相关配置,其中通过volumes,可以将hdfs的文件映射到本地,这样一来即使我们删除了容器,只要compose目录下的文件都在,那么我们在创建了新的集群后,原有的hdfs文件就会恢复,不需要重新上传了。

另外,还留了一个input目录与namenode节点相映射,我们在主机将文件传入input后,namenode节点容器的input路径下也会出现相同文件,方便我们上传文件到hdfs。

其中,namenode节点暴露出来两个端口,9000端口和9870端口。

9000端口用于hdfs的连接,例如:使用pyspark读取数据如下:

df = spark.read.csv('hdfs://namenode:9000/data.csv')

(由于在同一集群下,可以用容器名指代地址)

而通过访问9000端口,可以在浏览器中查看到hdfs的状态(启动后的):

image.png

三、hadoop.env

然后还需要配置hadoop环境,在同一路径下创建一个hadoop.env文件(对应docker-compose.yml中的env_file)用于同一配置hadoop环境:

CORE_CONF_fs_defaultFS=hdfs://namenode:9000
CORE_CONF_hadoop_http_staticuser_user=root
CORE_CONF_hadoop_proxyuser_hue_hosts=*
CORE_CONF_hadoop_proxyuser_hue_groups=*
CORE_CONF_io_compression_codecs=org.apache.hadoop.io.compress.SnappyCodec

HDFS_CONF_dfs_webhdfs_enabled=true
HDFS_CONF_dfs_permissions_enabled=false
HDFS_CONF_dfs_namenode_datanode_registration_ip___hostname___check=false

YARN_CONF_yarn_log___aggregation___enable=true
YARN_CONF_yarn_log_server_url=http://historyserver:8188/applicationhistory/logs/
YARN_CONF_yarn_resourcemanager_recovery_enabled=true
YARN_CONF_yarn_resourcemanager_store_class=org.apache.hadoop.yarn.server.resourcemanager.recovery.FileSystemRMStateStore
YARN_CONF_yarn_resourcemanager_scheduler_class=org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CapacityScheduler
YARN_CONF_yarn_scheduler_capacity_root_default_maximum___allocation___mb=8192
YARN_CONF_yarn_scheduler_capacity_root_default_maximum___allocation___vcores=4
YARN_CONF_yarn_resourcemanager_fs_state___store_uri=/rmstate
YARN_CONF_yarn_resourcemanager_system___metrics___publisher_enabled=true
YARN_CONF_yarn_resourcemanager_hostname=resourcemanager
YARN_CONF_yarn_resourcemanager_address=resourcemanager:8032
YARN_CONF_yarn_resourcemanager_scheduler_address=resourcemanager:8030
YARN_CONF_yarn_resourcemanager_resource__tracker_address=resourcemanager:8031
YARN_CONF_yarn_timeline___service_enabled=true
YARN_CONF_yarn_timeline___service_generic___application___history_enabled=true
YARN_CONF_yarn_timeline___service_hostname=historyserver
YARN_CONF_mapreduce_map_output_compress=true
YARN_CONF_mapred_map_output_compress_codec=org.apache.hadoop.io.compress.SnappyCodec
YARN_CONF_yarn_nodemanager_resource_memory___mb=16384
YARN_CONF_yarn_nodemanager_resource_cpu___vcores=8
YARN_CONF_yarn_nodemanager_disk___health___checker_max___disk___utilization___per___disk___percentage=98.5
YARN_CONF_yarn_nodemanager_remote___app___log___dir=/app-logs
YARN_CONF_yarn_nodemanager_aux___services=mapreduce_shuffle

MAPRED_CONF_mapreduce_framework_name=yarn
MAPRED_CONF_mapred_child_java_opts=-Xmx4096m
MAPRED_CONF_mapreduce_map_memory_mb=4096
MAPRED_CONF_mapreduce_reduce_memory_mb=8192
MAPRED_CONF_mapreduce_map_java_opts=-Xmx3072m
MAPRED_CONF_mapreduce_reduce_java_opts=-Xmx6144m
MAPRED_CONF_yarn_app_mapreduce_am_env=HADOOP_MAPRED_HOME=/data/docker-compose/hadoop-3.2.1/
MAPRED_CONF_mapreduce_map_env=HADOOP_MAPRED_HOME=/data/docker-compose/hadoop-3.2.1/
MAPRED_CONF_mapreduce_reduce_env=HADOOP_MAPRED_HOME=/data/docker-compose/hadoop-3.2.1/

如果9000端口和其他服务冲突了,可以将CORE_CONF_fs_defaultFS进行修改,换成其他端口,但是对应的,在原有的docker-compose.yml上也需要进行相关修改。

四、启动集群

在docker-compose.yml的目录下执行docker-compose up -d命令,启动集群(第一运行需要下载镜像):

image.png

对于文件上传,首先将数据文件传入本地的input目录下:

image.png

由于在Docker Compose中设置了input目录到Hadoop集群的namenode节点目录的映射,因此进入namenode可以看到相关文件已经上传至namenode节点中:

image.png

使用hdfs dfs -put <flie> <hdfs:path>命令完成实验数据的上传:

image.png

查看已经上传的文件:

image.png