Docker 搭建 Hadoop集群

docker 编译hadoop 和 docker 创建一个新的网段,取名为 my-net 详见

Hadoop-3.3.6 编译-CSDN博客

Hadoop 集群至少3台服务器(或至少3个docker容器实例)

为了保证数据的可靠性和完整性,Hadoop的分布式存储系统要求每个文件至少应有三个副本。因此,至少需要三台DataNode主机来满足这一需求。

启动容器

hadoop01

docker run --name hadoop01 --hostname=hadoop01 -d -v /Users/zhanglianming/workspace/Docker/ssh:/root/.ssh -v /Users/zhanglianming/workspace/Docker/hadoop:/root/hadoop --privileged --network=my-net -p 10022:22 iwill220182/anolisos-hadoop3.3.6:v1.0 /usr/sbin/init

hadoop02 

docker run --name hadoop02 --hostname=hadoop02 -d -v /Users/zhanglianming/workspace/Docker/ssh:/root/.ssh -v /Users/zhanglianming/workspace/Docker/hadoop:/root/hadoop --privileged --network=my-net -p 10023:22 iwill220182/anolisos-hadoop3.3.6:v1.0 /usr/sbin/init

hadoop03 

docker run --name hadoop03 --hostname=hadoop03 -d -v /Users/zhanglianming/workspace/Docker/ssh:/root/.ssh -v /Users/zhanglianming/workspace/Docker/hadoop:/root/hadoop --privileged --network=my-net -p 10024:22 iwill220182/anolisos-hadoop3.3.6:v1.0 /usr/sbin/init

上面每个容器实例都挂载了两个目录

/root/hadoop 主要从本地宿主机获取一下文件,比如修改好的配置

/root/.ssh 放置一下内容,用来解决node节点间通信需要的ssh密钥(是为了偷懒)

使用 docker network inspect bigdata 查看网段内的容器进行验证:

docker network inspect my-net

输出

[
    {
        "Name": "my-net",
        "Id": "41ce032bdf2a4a4e38d5cca8121c08d72c373d72b711b812615e401ef6497b70",
        "Created": "2024-01-11T12:04:05.155861138Z",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": {},
            "Config": [
                {
                    "Subnet": "172.18.0.0/16",
                    "Gateway": "172.18.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {
            "3c05748ea1be28e9e45052104bf06f87a3bdfeb0f57bf061cba5f4a368468321": {
                "Name": "hadoop2",
                "EndpointID": "fb5e5fecd703b91b943dcf69de6717a07e947da43ebe0fe80742e962c4b8a62d",
                "MacAddress": "02:42:ac:12:00:03",
                "IPv4Address": "172.18.0.3/16",
                "IPv6Address": ""
            },
            "44c5c5ae915ed61b2248aaec2f460f013aaf8d5a2456c3035b874609ac404395": {
                "Name": "hadoop",
                "EndpointID": "b1194b0fee5e957131419cffc7161baa97f981b1154ea6921ac73fe94c037f7c",
                "MacAddress": "02:42:ac:12:00:02",
                "IPv4Address": "172.18.0.2/16",
                "IPv6Address": ""
            },
            "c8095a8b8fd1233a2a23a61239c99ac7b4332ec74c8c761199255d0ab1a1b1c7": {
                "Name": "hadoop3",
                "EndpointID": "3f4144f47a5b30f1e84ba2c050c1d9ba23c258440021ae445283d02a4dbfb95e",
                "MacAddress": "02:42:ac:12:00:04",
                "IPv4Address": "172.18.0.4/16",
                "IPv6Address": ""
            }
        },
        "Options": {},
        "Labels": {}
    }
]

环境变量及配置

以下配置环境变量在所有容器实例都要配置和设置。

修改环境变量

export HADOOP_HOME=/opt/hadoop-3.3.6/
export PATH=$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH

修改host文件

172.18.0.2 hadoop01
172.18.0.3 hadoop02
172.18.0.4 hadoop03

修改配置

代码设置

*-site.xml

*-default.xml

要实现完全分布式的配置,需要配置以下文件:

  • hadoop-env.sh
  • yarn-env.sh
  • core-site.xml
  • hdfs-site.xml
  • mapred-site.xml
  • yarn-site.xml

在Hadoop安装完成后,会在$HADOOP_HOME/share路径下,有若干个*-default.xml文件,这些文件中记录了默认的配置信息。同时,在代码中,我们也可以设置Hadoop的配置信息。这些位置配置的Hadoop,

优先级为: 代码设置 > *-site.xml > *-default.xml

本次部署的集群规划如下:

Node

Applications

hadoop01 

NameNode、DataNode、ResourceManager、NodeManager

hadoop02

SecondaryNameNode、DataNode、NodeManager

hadoop03

DataNode、NodeManager

mkdir -p /home/admin/hadoop/tmp

cd $HADOOP_HOME/etc/hadoop/

core-site.xml

<configuration>
    <property>
        <name>fs.defaultFS</name>
        <value>hdfs://hadoop01:8020</value>
    </property>
    <!-- hdfs的基础路径,被其他属性所依赖的一个基础路径 -->
    <property>
        <name>hadoop.tmp.dir</name>
        <value>/home/admin/hadoop/tmp</value>
    </property>
</configuration>

fs.defaultFS:HDFS对外提供服务的主机及端口号

hdfs-site.xml

<configuration>
    <!-- namenode守护进程管理的元数据文件fsimage存储的位置-->
    <property>
        <name>dfs.namenode.name.dir</name>
        <value>file://${hadoop.tmp.dir}/dfs/name</value>
    </property>
    <!-- 确定DFS数据节点应该将其块存储在本地文件系统的何处-->
    <property>
        <name>dfs.datanode.data.dir</name>
        <value>file://${hadoop.tmp.dir}/dfs/data</value>
    </property>
    <!-- 块的副本数-->
    <property>
        <name>dfs.replication</name>
        <value>3</value>
    </property>
    <!-- 块的大小(128M),下面的单位是字节-->
    <property>
        <name>dfs.blocksize</name>
        <value>134217728</value>
    </property>
    <!-- secondarynamenode守护进程的http地址:主机名和端口号。参考守护进程布局-->
    <property>
        <name>dfs.namenode.secondary.http-address</name>
        <value>hadoop02:50090</value>
    </property>
  	<!-- namenode守护进程的http地址:主机名和端口号。参考守护进程布局-->
	<property>
  	  <name>dfs.namenode.http-address</name>
  	  <value>hadoop01:50070</value>
	</property>  
</configuration>

dfs.namenode.name.dir:fsimage存储的位置

dfs.datanode.data.dir:块的存储位置

dfs.replication:HDFS为了保证属性不丢失,会保存块的副本

dfs.blocksize:块大小,在hadoop1.x版本中为64M,在hadoop2.x的版本汇总默认128M

dfs.namenode.secondary.http-address:指定secondarynamenode的节点服务器位置

dfs.namenode.http-address:webui查看时的地址端口

mapred-site.xml

<configuration>
    <!-- 指定mapreduce使用yarn资源管理器-->
    <property>
        <name>mapreduce.framework.name</name>
        <value>yarn</value>
    </property>
    <!-- 配置作业历史服务器的地址-->
    <property>
        <name>mapreduce.jobhistory.address</name>
        <value>hadoop01:10020</value>
    </property>
    <!-- 配置作业历史服务器的http地址-->
    <property>
        <name>mapreduce.jobhistory.webapp.address</name>
        <value>hadoop01:19888</value>
    </property>
    <property>
      <name>yarn.app.mapreduce.am.env</name>
      <value>HADOOP_MAPRED_HOME=/opt/hadoop-3.3.6</value>
    </property>
    <property>
      <name>mapreduce.map.env</name>
      <value>HADOOP_MAPRED_HOME=/opt/hadoop-3.3.6</value>
    </property>
    <property>
      <name>mapreduce.reduce.env</name>
      <value>HADOOP_MAPRED_HOME=/opt/hadoop-3.3.6</value>
    </property>
</configuration>

yarn-site.xml

<configuration>
    <!-- 指定yarn的shuffle技术-->
    <property>
        <name>yarn.nodemanager.aux-services</name>
       <value>mapreduce_shuffle</value>
    </property>
    <!-- 指定resourcemanager的主机名-->
    <property>
        <name>yarn.resourcemanager.hostname</name>
        <value>hadoop01</value>
    </property> 
    <!--下面的可选-->
    <!--指定shuffle对应的类 -->
	<property> 
	<name>yarn.nodemanager.aux-services.mapreduce_shuffle.class</name>
     <value>org.apache.hadoop.mapred.ShuffleHandler</value> 
	</property>

	<!--配置resourcemanager的内部通讯地址-->
	<property>
	<name>yarn.resourcemanager.address</name>
	<value>hadoop01:8032</value>
	</property>

	<!--配置resourcemanager的scheduler的内部通讯地址-->
	<property>
	<name>yarn.resourcemanager.scheduler.address</name>
	<value>hadoop01:8030</value>
	</property>

	<!--配置resoucemanager的资源调度的内部通讯地址-->
	<property>
	<name>yarn.resourcemanager.resource-tracker.address</name>
	<value>hadoop01:8031</value>
	</property>

	<!--配置resourcemanager的管理员的内部通讯地址-->
	<property>
	<name>yarn.resourcemanager.admin.address</name>
	<value>hadoop01:8033</value>
	</property>

	<!--配置resourcemanager的web ui 的监控页面-->
	<property>
	<name>yarn.resourcemanager.webapp.address</name>
	<value>hadoop01:8088</value>
	</property>
</configuration>

hadoop-env.sh

配置hadoop运行的jdk环境路径

export JAVA_HOME=/opt/jdk1.8.0_391

yarn-env.sh

配置yarn运行的jdk环境路径

export JAVA_HOME=/opt/jdk1.8.0_391

workers

配置集群的从节点

vim workers

hadoop01
hadoop02
hadoop03

分发配置到其他容器

格式化

如果之前格式化过集群,需要删除上次配置的hadoop.tmp.dir属性对应位置的tmp文件夹,hadoop.tmp.dir属性值见core-site.xml文件

在hadoop01上运行

hdfs namenode -format

格式化信息解读

生成一个集群唯一标识符:clusterid

生成一个块池唯一标识符:blockPoolId

生成namenode进程管理内容(fsimage)的存储路径:

默认配置文件属性hadoop.tmp.dir指定的路径下生成dfs/name目录

生成镜像文件fsimage,记录分布式文件系统根路径的元数据

他信息都可以查看一下,比如块的副本数,集群的fsOwner等。

目录所在位置及内容查看

/home/admin/hadoop/tmp/dfs/name/current

启动集群

增加容器实例端口映射

发现容器实例需要增加使用的端口映射

hadoop 增加如下端口

9864:9864

8020:8020

8030:8030

8031:8031

8032:8032

8033:8033

8088:8088

50070:50070

10020:10020

19888:19888

hadoop2 增加如下端口

50090:50090

hadoop3 增加如下端口

1. 启动脚本
	-- start-dfs.sh			:用于启动hdfs集群的脚本
	-- start-yarn.sh		:用于启动yarn守护进程
	-- start-all.sh			:用于启动hdfs和yarn
2. 关闭脚本
	-- stop-dfs.sh			:用于关闭hdfs集群的脚本
	-- stop-yarn.sh			:用于关闭yarn守护进程
	-- stop-all.sh			:用于关闭hdfs和yarn
3. 单个守护进程脚本
	-- hadoop-daemons.sh	:用于单独启动或关闭hdfs的某一个守护进程的脚本
	-- hadoop-daemon.sh		:用于单独启动或关闭hdfs的某一个守护进程的脚本
	reg:
		hadoop-daemon.sh [start|stop] [namenode|datanode|secondarynamenode]
	
	-- yarn-daemons.sh	:用于单独启动或关闭hdfs的某一个守护进程的脚本
	-- yarn-daemon.sh		:用于单独启动或关闭hdfs的某一个守护进程的脚本
	reg:
		yarn-daemon.sh [start|stop] [resourcemanager|nodemanager]

修改环境变量

以 root 用户身份操作 HDFS 的 Namenode, 没有定义 HDFS_NAMENODE_USER 环境变量,会报错

Starting namenodes on [hadoop]
ERROR: Attempting to operate on hdfs namenode as root
ERROR: but there is no HDFS_NAMENODE_USER defined. Aborting operation.
Starting datanodes
ERROR: Attempting to operate on hdfs datanode as root
ERROR: but there is no HDFS_DATANODE_USER defined. Aborting operation.
Starting secondary namenodes [hadoop02]
ERROR: Attempting to operate on hdfs secondarynamenode as root
ERROR: but there is no HDFS_SECONDARYNAMENODE_USER defined. Aborting operation.

export HDFS_NAMENODE_USER=root
export HDFS_DATANODE_USER=root
export HDFS_JOURNALNODE_USER=root
export HDFS_SECONDARYNAMENODE_USER=root
export YARN_RESOURCEMANAGER_USER=root
export YARN_NODEMANAGER_USER=root
source/etc/profile.d/my_env.sh

启动HDFS

使用start-dfs.sh,启动hdfs

- 启动集群中的各个机器节点上的分布式文件系统的守护进程
  一个namenode和resourcemanager以及secondarynamenode
  多个datanode和nodemanager
- 在namenode守护进程管理内容的目录下生成edit日志文件
- 在每个datanode所在节点下生成${hadoop.tmp.dir}/dfs/data目录,参考下图:

注意! 如果哪台机器的相关守护进程没有开启,那么,就查看哪台机器上的守护进程对应的日志log文件,注意,启动脚本运行时提醒的日志后缀是*.out,而我们查看的是*.log文件。此文件的位置:${HADOOP_HOME}/logs/里

[root@44c5c5ae915e sbin]# ./start-dfs.sh
Starting namenodes on [hadoop]
Last login: Sat Jan 27 07:06:08 UTC 2024 on pts/1
hadoop: namenode is running as process 2924.  Stop it first and ensure /tmp/hadoop-root-namenode.pid file is empty before retry.
Starting datanodes
Last login: Sat Jan 27 07:12:00 UTC 2024 on pts/1
hadoop03: WARNING: /opt/hadoop-3.3.6/logs does not exist. Creating.
hadoop02: WARNING: /opt/hadoop-3.3.6/logs does not exist. Creating.
hadoop01: datanode is running as process 3115.  Stop it first and ensure /tmp/hadoop-root-datanode.pid file is empty before retry.
Starting secondary namenodes [hadoop02]
Last login: Sat Jan 27 07:12:01 UTC 2024 on pts/1

jps查看进程

hadoop01

hadoop02

hadoop03

启动yarn

使用start-yarn.sh脚本

[root@44c5c5ae915e sbin]# ./start-yarn.sh
Starting resourcemanager
Last login: Sat Jan 27 07:12:03 UTC 2024 on pts/1
Starting nodemanagers
Last login: Sat Jan 27 07:23:03 UTC 2024 on pts/1

jps查看进程

hadoop01

hadoop02

hadoop03

web UI查看

HDFS

http://127.0.0.1:50070/


YARN

http://127.0.0.1:8088/

其他

Mac 系统修改 Docker 容器实例的端口号

linux 比较容易,网上很多资料。

查看容器实例id

docker ps -a

找到完整的实例id 

docker inspect 44c5c5ae915e | grep Id

MAC OS中,docker有两层虚拟机,一层是docker本身的虚拟层(linux),然后是docker里容器的虚拟层,所以网上文章提到的/var/lib/docker 文件夹在MAC系统中是找不到的。下面记录如何在mac系统中修改配置文件。

停止容器

进入docker虚拟的linux

cd ~/Library/Containers/com.docker.docker/Data/vms/0/

目录中,有一个tty文件,可以通过这个文件登录到docker内部的linux:

1.如果没有tty文件或者执行出现screen is terminating这个提示,进行如下处置

docker run -it --privileged --pid=host justincormack/nsenter1

执行成功后会进入容器

2.screen tty 执行成功也会进入容器

后续步骤两者相同如下:

cd /var/lib/docker/containers && ls

cd 44c5c5ae915ed61b2248aaec2f460f013aaf8d5a2456c3035b874609ac404395

修改config.v2.json和hostconfig.json文件对应的端口映射部分

⑴ 修改config.v2.json

找到要修改的关键字ExposedPorts,
原先的内容如下:

那我们要增加暴露的端口

⑵ 修改hostconfig.json

找到要修改的关键字PortBindings,

重启docker

启动容器实例查看是否生效

  • 29
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
搭建Hadoop集群需要进行以下步骤: 1. 安装DockerDocker Compose 在搭建Hadoop集群之前,需要先安装DockerDocker Compose。在Linux系统中,可以使用以下命令来安装: ``` sudo apt-get update sudo apt-get install docker sudo apt-get install docker-compose ``` 2. 创建Docker镜像 在安装完DockerDocker Compose之后,需要创建Hadoop镜像。Docker镜像可以通过Dockerfile文件进行创建。以下是一个简单的Dockerfile文件示例: ``` FROM ubuntu:18.04 RUN apt-get update && \ apt-get install -y ssh && \ apt-get install -y rsync && \ apt-get install -y openjdk-8-jdk && \ apt-get clean && \ rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* RUN useradd -ms /bin/bash hadoop && \ echo 'hadoop:hadoop' | chpasswd && \ usermod -aG sudo hadoop RUN ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa && \ cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys && \ chmod 0600 ~/.ssh/authorized_keys ADD hadoop-2.10.1.tar.gz /opt RUN cd /opt && \ ln -s hadoop-2.10.1 hadoop && \ chown -R hadoop:hadoop hadoop-2.10.1 && \ chown -R hadoop:hadoop hadoop ENV JAVA_HOME /usr/lib/jvm/java-8-openjdk-amd64 ENV PATH $PATH:/opt/hadoop/bin:/opt/hadoop/sbin CMD ["/usr/sbin/sshd", "-D"] ``` 在该Dockerfile文件中,我们使用了Ubuntu 18.04作为基础镜像,然后安装了SSH、rsync和OpenJDK-8。我们还创建了一个名为hadoop的用户和一个SSH密钥对。接着,我们下载并解压Hadoop二进制文件,并设置环境变量。最后,我们启动SSH服务。 在生成Dockerfile文件之后,我们可以使用以下命令创建Hadoop镜像: ``` docker build -t hadoop . ``` 3. 编写Docker Compose文件 在创建完Docker镜像之后,需要编写Docker Compose文件来定义Hadoop集群的拓扑结构。以下是一个简单的Docker Compose文件示例: ``` version: '2.3' services: namenode: image: hadoop container_name: namenode hostname: namenode ports: - "50070:50070" - "8088:8088" volumes: - ./data/namenode:/opt/hadoop-2.10.1/data/namenode environment: - HADOOP_ROLE=NAMENODE - NAMENODE_HOST=namenode - RESOURCEMANAGER_HOST=resourcemanager command: ["/opt/hadoop/bin/hadoop", "namenode"] networks: hadoop: ipv4_address: 172.16.238.10 datanode1: image: hadoop container_name: datanode1 hostname: datanode1 volumes: - ./data/datanode1:/opt/hadoop-2.10.1/data/datanode environment: - HADOOP_ROLE=DATANODE - NAMENODE_HOST=namenode - RESOURCEMANAGER_HOST=resourcemanager command: ["/opt/hadoop/bin/hadoop", "datanode"] depends_on: - namenode networks: hadoop: ipv4_address: 172.16.238.11 datanode2: image: hadoop container_name: datanode2 hostname: datanode2 volumes: - ./data/datanode2:/opt/hadoop-2.10.1/data/datanode environment: - HADOOP_ROLE=DATANODE - NAMENODE_HOST=namenode - RESOURCEMANAGER_HOST=resourcemanager command: ["/opt/hadoop/bin/hadoop", "datanode"] depends_on: - namenode networks: hadoop: ipv4_address: 172.16.238.12 resourcemanager: image: hadoop container_name: resourcemanager hostname: resourcemanager ports: - "8080:8080" environment: - HADOOP_ROLE=RESOURCEMANAGER - NAMENODE_HOST=namenode - RESOURCEMANAGER_HOST=resourcemanager command: ["/opt/hadoop/bin/yarn", "resourcemanager"] depends_on: - namenode networks: hadoop: ipv4_address: 172.16.238.20 nodemanager1: image: hadoop container_name: nodemanager1 hostname: nodemanager1 environment: - HADOOP_ROLE=NODEMANAGER - NAMENODE_HOST=namenode - RESOURCEMANAGER_HOST=resourcemanager command: ["/opt/hadoop/bin/yarn", "nodemanager"] depends_on: - namenode - resourcemanager networks: hadoop: ipv4_address: 172.16.238.21 nodemanager2: image: hadoop container_name: nodemanager2 hostname: nodemanager2 environment: - HADOOP_ROLE=NODEMANAGER - NAMENODE_HOST=namenode - RESOURCEMANAGER_HOST=resourcemanager command: ["/opt/hadoop/bin/yarn", "nodemanager"] depends_on: - namenode - resourcemanager networks: hadoop: ipv4_address: 172.16.238.22 networks: hadoop: driver: bridge ipam: driver: default config: - subnet: 172.16.238.0/24 ``` 在该Docker Compose文件中,我们定义了一个包含一个NameNode、两个DataNode、一个ResourceManager和两个NodeManager的集群。我们使用了Hadoop镜像,并指定了容器名称、主机名、端口映射、数据卷、环境变量和命令。我们还使用了depends_on来定义容器之间的依赖关系。最后,我们定义了一个名为hadoop的网络,并指定了IP地址。 4. 启动Hadoop集群 在编写完Docker Compose文件之后,我们可以使用以下命令启动Hadoop集群: ``` docker-compose up -d ``` 该命令会启动Hadoop集群,并在后台运行。运行完该命令后,可以使用以下命令检查容器是否已经启动: ``` docker ps ``` 5. 访问Hadoop集群 启动完Hadoop集群之后,可以在浏览器中访问以下地址来查看Hadoop集群的状态: ``` http://localhost:50070/dfshealth.html http://localhost:8088/ ``` 至此,完成了在Docker搭建Hadoop集群的过程。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值