当前位置:   article > 正文

[零基础]用docker搭建Hadoop集群_hadoop docker

hadoop docker

目录

前言:为什么要用docker搭建Hadoop集群?

准备:下载VMware、VMwareTools(或Xftp、Xshell)、Ubuntu或者CentOS映像文件、Hadoop和jdk压缩包

一、创建虚拟机

        (1)点击新建虚拟机

       (2)下一步

        (3)下一步

         (4)选择映像文件

        (5)自定义信息

         (6)自定义信息,位置最好放在非C盘

        (7)设置处理器内核总数

        (8) 后面五步都选下一步即可。

         (9)设置磁盘大小

         (10)点击下一步,再点击完成

         (11)自动加载默认配置

二、安装docker并生成相关的镜像

        (1)安装docker

        (2)拉取CentOS镜像(Ubuntu镜像也行)

         (3)通过build Dockfile生成带ssh功能的centos镜像

        1、MAINTAINER hadoop

        2、root:a123456

         (4)将下载的文件上传虚拟机

         1、在主机下载ssh,在终端输入:

       2、 查看ip地址,在终端输入:

        3、用Xshell和Xftp连接虚拟机主机

         4、解压文件(把目录和文件名改成你自己的)

        (5)生成带有ssh、hadoop和jdk环境的CentOS镜像

三、创建网桥,并启动docker容器

        (1)创建网桥,在终端输入:

        (2)查看网桥,在终端输入:

        (3)启动三个容器并指定网桥

四、登录容器,配置ip地址映射和ssh免密登录

        (1)登录容器(Hadoop服务器)

        (2)在每个hadoop服务器中配置ip地址映射

         (3)在每台hadoop服务器中配置ssh免密登录

        (4)测试是否成功配置ssh免密登录,ssh + hadoop服务器名:

五、修改Hadoop配置文件

        (1)创建文件夹,配置时要用

        (2)编辑hadoop_env.sh,修改下面三个参数,按照你自己的改

         (3)编辑core-site.xml

        (4)编辑mapred-site.xml

        (5)编辑hdfs-site.xml

        (6)编辑yarn-site.xml

        (7)编辑workers,把原先的默认值localhost删除

        (8)配置环境变量,在终端输入:

        (9)把文件拷贝到hadoop2和hadoop3上

        (10)给文件赋权

六、启动Hadoop集群

        (1)在hadoop1上执行以下命令:

        1、格式化hdfs

        2、一键启动Hadoop集群

        (2)测试Hadoop集群

        (3)磁盘空间占用


前言:为什么要用docker搭建Hadoop集群

        1、磁盘空间的占用

        docker搭建的集群占用电脑磁盘空间较小,对电脑的硬件要求也不高,搭建一个Hadoop集群(一主两从)只需要17GB左右的磁盘空间,而常规的开启多台虚拟机搭建的方法,可能搭建一台Hadoop服务器就需要将近20GB的磁盘空间。

        2、稳定性

        docker搭建的Hadoop集群不容易宕机,用常规的方法搭建的话,可能会有一台或者多台虚拟机宕机,稳定性较差。

准备:下载VMware、VMwareTools(或Xftp、Xshell)、Ubuntu或者CentOS映像文件、Hadoop和jdk压缩包

给大家准备了Ubuntu映像文件、Hadoop和jdk压缩包,点击链接下载即可。没有Xftp和Xshell的同学可以用VMwareTools替代,只要把压缩包添加到虚拟机主机上即可。

链接:Ubuntu、jdk、Hadoop 
提取码:2v56

一、创建虚拟机

用VMware创建一台新的虚拟机(CentOS或Ubuntu都可以)

        (1)点击新建虚拟机

       (2)下一步

       
        (3)下一步

         (4)选择映像文件

        选择自己的映像文件(CentOS或者Ubuntu都可以),后面第11步开启虚拟机时可能要加载20分钟左右,不想等待加载的话,可以选择稍后安装操作系统,自定义安装可以快一点,不过很多东西得自己配置和下载,后续使用可能麻烦一点。

        (5)自定义信息

 

         (6)自定义信息,位置最好放在非C盘

        (7)设置处理器内核总数

        处理器数量 x 每个处理器的内核数量 = 处理器内核总数,依据自己电脑的配置设定,在任务管理器的性能页面中可以查看自己电脑的处理器数量,我的是8个,直接设置最大值,防止后续使用虚拟机时卡顿。

 

        (8) 后面五步都选下一步即可。

 

 

         (9)设置磁盘大小

        设置磁盘大小为50GB,只搭建Hadoop集群的话20GB就足够了,但后面还需要搭建其他集群所以设置磁盘大小为50GB,可以根据自己的需求设定。将虚拟磁盘拆分成多个文件。

 

         (10)点击下一步,再点击完成

  

         (11)自动加载默认配置

        这个过程可能需要二十分钟左右。如果不想等待加载,可以在第4步选择自己的映像文件那里选择稍后安装操作系统,不过很多东西得自己配置和下载,后续使用可能麻烦一点。成功开启虚拟机页面如下所示:

 

二、安装docker并生成相关的镜像

        (1)安装docker

        CentOS:在 CentOS | 上安装 Docker 引擎码头工人文档

        Ubuntu: 在 Ubuntu | 上安装 Docker 引擎码头工人文档

        只要在终端输入:sudo docker run hello-world,后出现如下图的内容就证明安装docker成功了

        (2)拉取CentOS镜像(Ubuntu镜像也行)

         在终端输入:sudo docker pull centos

         在终端输入:sudo docker images,可以看到刚刚拉取的两个镜像

         每次执行docker语句都要在前面加sudo,比较麻烦,直接将hadoop用户加入docker用户组,就不用再输入sudo了。

  1. sudo gpasswd -a $USER docker #将当前用户加入到docker用户组中
  2. newgrp docker #重新加载docker用户组

        一般安装时会自动创建docker用户组,如果docker用户组不存在的话,在终端输入: 

sudo groupadd docker     #创建docker用户组

        注意,此时只有执行上述两条命令行的终端可以不用输入sudo,其他终端仍要输入,得重启虚拟机后所有终端才不用输入sudo。

         (3)通过build Dockfile生成带ssh功能的centos镜像

先创建Dockfile文件,在终端输入:

vi Dockerfile

在Dockfile文件中添加以下内容:

  1. FROM centos
  2. MAINTAINER hadoop
  3. RUN cd /etc/yum.repos.d/
  4. RUN sed -i 's/mirrorlist/#mirrorlist/g' /etc/yum.repos.d/CentOS-*
  5. RUN sed -i 's|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g' /etc/yum.repos.d/CentOS-*
  6. RUN yum makecache
  7. RUN yum update -y
  8. RUN yum install -y openssh-server sudo
  9. RUN sed -i 's/UsePAM yes/UsePAM no/g' /etc/ssh/sshd_config
  10. RUN yum install -y openssh-clients
  11. RUN echo "root:a123456" | chpasswd
  12. RUN echo "root ALL=(ALL) ALL" >> /etc/sudoers
  13. RUN ssh-keygen -t dsa -f /etc/ssh/ssh_host_dsa_key
  14. RUN ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key
  15. RUN mkdir /var/run/sshd
  16. EXPOSE 22
  17. CMD ["/usr/sbin/sshd", "-D"]

Dockfile文件的内容解释:基于centos镜像,生成带有spenssh-server、openssh-clients的镜像,用户为root,密码为a123456,镜像维护者(作者)为hadoop。为了防止出现Error: Failed to download metadata for repo 'appstream': Cannot prepare internal mirrorlist: No URLs in mirrorlist
错误,我更改了yum下载依赖的镜像baseurl。注意:如果拉取的镜像是Ubuntu的话,得修改下载spenssh-server、openssh-clients的命令行。

 你可能需要修改的地方:

        1、MAINTAINER hadoop

        MAINTAINER+空格+作者的信息,用于指定镜像作者的信息,我的用户名是hadoop,改成你自己的

        2、root:a123456

        设置镜像的密码,改成你自己的

建好Dockerfile文件后,生成镜像,在终端输入:

docker build -t="centos7-ssh" .
查看生成的centos7-ssh镜像,在终端输入:

docker images

         (4)将下载的文件上传虚拟机

没有Xftp和Xshell的同学可以用VMwareTools替代,只要把压缩包添加到虚拟机主机上即可。安装VMwareTools后,复制本地主机的文件粘贴到虚拟机主机指定目录下。下面演示的是Xftp和Xshell的操作。

         1、在主机下载ssh,在终端输入:

sudo apt-get install -y openssh-server
        下载完后,查看ssh进程的运行状态,在终端输入:

ps -e|grep ssh

        

        再查看ssh的运行状态,在终端输入:

systemctl status sshd

       2、 查看ip地址,在终端输入:

ip a

 我的ip地址是:192.168.237.131

        3、用Xshell和Xftp连接虚拟机主机

Xshell(测试是否能正常连接,其实只需要用Xftp传输文件):

         用户名填hadoop(换成你自己的),root可能会登不上,如果ssh运行状态没问题,还连接不上的话,可能是防火墙没关。

 Xftp:

         将压缩包上传到/home/hadoop(有Dockerfile的目录),如果上传失败,可能是目录没有传输文件的权限,在终端输入:chmod 777 /home/hadoop/

         4、解压文件(把目录和文件名改成你自己的)

在终端输入:

tar -zxvf /home/hadoop/hadoop-3.1.3.tar.gz -C /home/hadoop

tar -zxvf /home/hadoop/jdk-8u212-linux-x64.tar.gz -C /home/hadoop

        (5)生成带有ssh、hadoop和jdk环境的CentOS镜像

移除原有的Dockerfile文件,在终端输入:

mv Dockerfile Dockerfile.bak

再重新创建一个Dockerfile文件,在终端输入:

vi Dockerfile

或者直接在Xftp上用记事本编辑原来的Dockerfile文件,更加方便(推荐)

将下面内容填入Dockerfile文件(记得保存)

  1. FROM centos7-ssh
  2. COPY jdk1.8.0_212 /usr/local/jdk
  3. ENV JAVA_HOME /usr/local/jdk
  4. ENV PATH $JAVA_HOME/bin:$PATH
  5. COPY hadoop-3.1.3 /usr/local/hadoop
  6. ENV HADOOP_HOME /usr/local/hadoop
  7. ENV PATH $HADOOP_HOME/bin:$PATH

构建Dockerfile,在终端输入:

docker build -t="hadoop" .

 

        成功生成名字为hadoop的镜像。

三、创建网桥,并启动docker容器

        因为集群的服务器之间需要通信,而且每次虚拟机给集群分配的ip地址都不一样,所以需要创建网桥,给每台服务器分配固定的ip映射,这样就可以通过使用服务器名进行通信了,而且ip地址也不会变动。

        (1)创建网桥,在终端输入:

        docker network create hadoop

        (2)查看网桥,在终端输入:

        docker network ls

        其他三个网桥是安装docker时自带的,hadoop是刚刚创建的。

        (3)启动三个容器并指定网桥

依次在终端执行下面三条命令行:

docker run -itd --network hadoop --name hadoop1 -p 50070:50070 -p 8088:8088 hadoop

docker run -itd --network hadoop --name hadoop2 hadoop

docker run -itd --network hadoop --name hadoop3 hadoop

参数解释:

        -itd:在后台运行交互式容器

        --network:指定网桥

        --name:指定生成的容器名

        -p:指定端口映射,主机端口号:容器端口号,第一个是hdfs服务,第二个是yarn 服务

        末尾的hadoop是运行的镜像名

查看生成的容器,在终端输入:

docker ps -a

查看网桥使用情况,在终端输入:

docker network inspect hadoop

 

 记录每台服务器的ip地址,后面要用,每个人的可能不一样,换成你自己的

172.18.0.2 hadoop1

172.18.0.3 hadoop2

172.18.0.4 hadoop3

四、登录容器,配置ip地址映射和ssh免密登录

        (1)登录容器(Hadoop服务器)

开启三个终端,在每个终端分别输入:

docker exec -it hadoop1 bash
docker exec -it hadoop2 bash
docker exec -it hadoop3 bash

        (2)在每个hadoop服务器中配置ip地址映射

每台hadoop服务器的终端输入:

vi /etc/hosts

然后填入刚刚记录的ip地址

 

         每台Hadoop服务器都配置好后,可以互相ping一下(ctrl + c停止ping),看看是否配置成功。hadoop1 ping hadoop2 如下图所示:

         (3)在每台hadoop服务器中配置ssh免密登录

每台hadoop服务器终端输入:

ssh-keygen

然后一直回车即可,再在每台hadoop服务器终端中输入:

ssh-copy-id -i /root/.ssh/id_rsa -p 22 root@hadoop1
填yes后,输入第二(3)步时设置的密码,a123456
ssh-copy-id -i /root/.ssh/id_rsa -p 22 root@hadoop2
填yes后,输入第二(3)步时设置的密码,a123456
ssh-copy-id -i /root/.ssh/id_rsa -p 22 root@hadoop3
填yes后,输入第二(3)步时设置的密码,a123456

        (4)测试是否成功配置ssh免密登录,ssh + hadoop服务器名:

ssh hadoop1

ssh hadoop2

ssh hadoop3

五、修改Hadoop配置文件

        在hadoop1中,进入Hadoop配置目录,我的是:/usr/local/hadoop/etc/hadoop,查看目录下的文件,不同版本的Hadoop可能文件数量和名字会不同,在终端输入:

ls

        (1)创建文件夹,配置时要用

mkdir /home/hadoop
mkdir /home/hadoop/tmp /home/hadoop/hdfs_name /home/hadoop/hdfs_data

        (2)编辑hadoop_env.sh,修改下面三个参数,按照你自己的改

         (3)编辑core-site.xml

  1. <configuration>
  2. <property>
  3. <name>fs.defaultFS</name>
  4. <value>hdfs://hadoop1:9000</value>
  5. </property>
  6. <property>
  7. <name>hadoop.tmp.dir</name>
  8. <value>file:/home/hadoop/tmp</value>
  9. </property>
  10. <property>
  11. <name>io.file.buffer.size</name>
  12. <value>131702</value>
  13. </property>
  14. </configuration>

        (4)编辑mapred-site.xml

  1. <configuration>
  2. <property>
  3. <name>mapreduce.framework.name</name>
  4. <value>yarn</value>
  5. </property>
  6. <property>
  7. <name>mapreduce.jobhistory.address</name>
  8. <value>hadoop1:10020</value>
  9. </property>
  10. <property>
  11. <name>mapreduce.jobhistory.webapp.address</name>
  12. <value>hadoop1:19888</value>
  13. </property>
  14. </configuration>

        (5)编辑hdfs-site.xml

  1. <configuration>
  2. <property>
  3. <name>dfs.namenode.name.dir</name>
  4. <value>file:/home/hadoop/hdfs_name</value>
  5. </property>
  6. <property>
  7. <name>dfs.datanode.data.dir</name>
  8. <value>file:/home/hadoop/hdfs_data</value>
  9. </property>
  10. <property>
  11. <name>dfs.replication</name>
  12. <value>2</value>
  13. </property>
  14. <property>
  15. <name>dfs.namenode.http-address</name>
  16. <value>hadoop1:9001</value>
  17. </property>
  18. <property>
  19. <name>dfs.namenode.secondary.http-address</name>
  20. <value>hadoop2:9002</value>
  21. </property>
  22. <property>
  23. <name>dfs.webhdfs.enabled</name>
  24. <value>true</value>
  25. </property>
  26. </configuration>

Hadoop的Web UI界面访问地址:1、namenode:hadoop1:9001(会自动跳转到9000端口,如果直接访问9000端口号可能会访问异常)2、secondarynamenode:hadoop2:9002         

  (6)编辑yarn-site.xml

  1. <configuration>
  2. <!-- Site specific YARN configuration properties -->
  3. <property>
  4. <name>yarn.nodemanager.aux-services</name>
  5. <value>mapreduce_shuffle</value>
  6. </property>
  7. <property>
  8. <name>yarn.nodemanager.auxservices.mapreduce.shuffle.class</name>
  9. <value>org.apache.hadoop.mapred.ShuffleHandler</value>
  10. </property>
  11. <property>
  12. <name>yarn.resourcemanager.address</name>
  13. <value>hadoop1:8032</value>
  14. </property>
  15. <property>
  16. <name>yarn.resourcemanager.scheduler.address</name>
  17. <value>hadoop1:8030</value>
  18. </property>
  19. <property>
  20. <name>yarn.resourcemanager.resource-tracker.address</name>
  21. <value>hadoop1:8031</value>
  22. </property>
  23. <property>
  24. <name>yarn.resourcemanager.admin.address</name>
  25. <value>hadoop1:8033</value>
  26. </property>
  27. <property>
  28. <name>yarn.resourcemanager.webapp.address</name>
  29. <value>hadoop1:8088</value>
  30. </property>
  31. </configuration>

        (7)编辑workers,把原先的默认值localhost删除

  1. hadoop2
  2. hadoop3

        (8)配置环境变量,在终端输入:

vi /etc/profile

在文件尾部添加配置

  1. export JAVA_HOME=/usr/local/jdk
  2. export PATH=$JAVA_HOME/bin:$PATH
  3. export HADOOP_HOME=/usr/local/hadoop
  4. export PATH=$HADOOP_HOME/bin:$PATH
  5. export PATH=$HADOOP_HOME/sbin:$PATH
  6. export HDFS_NAMENODE_USER=root
  7. export HDFS_DATANODE_USER=root
  8. export HDFS_SECONDARYNAMENODE_USER=root
  9. export YARN_RESOURCEMANAGER_USER=root
  10. export YARN_NODEMANAGER_USER=root

保存退出后,再输入下面的命令行使配置生效:

source /etc/profile

        (9)把文件拷贝到hadoop2和hadoop3上

依次执行以下命令:

scp -r $HADOOP_HOME/ hadoop2:/usr/local/
scp -r $HADOOP_HOME/ hadoop3:/usr/local/

scp -r /home/hadoop hadoop2:/
scp -r /home/hadoop hadoop3:/

scp -r /etc/profile hadoop2:/
scp -r /etc/profile hadoop3:/

        (10)给文件赋权

每台hadoop服务器的终端执行下面两条命令行:

chmod -R 777 /usr/local/hadoop

chmod -R 777 /usr/local/jdk


六、启动Hadoop集群

        (1)在hadoop1上执行以下命令:

        1、格式化hdfs

hdfs namenode -format

        2、一键启动Hadoop集群

start-all.sh

        (2)测试Hadoop集群

每台服务器都输入:

jps
hadoop1:

hadoop2: 

hadoop3:

 

        hadoop1是名称结点,hadoop2是第二名称节点和数据节点,hadoop3是数据节点。网上很多人把名称节点和第二名称节点配置在同一台服务器上,我觉得这样配置是错的,这样配置根本发挥不了第二名称节点的作用:作为名称节点的检查点,定期合并日志和镜像。

        (3)磁盘空间占用

        现在hadoop集群已经搭建好了,我们看看磁盘空间占用了多少。前面是剩余磁盘空间,后面是总磁盘空间,可以得出只用了17GB左右。

 参考:使用docker部署hadoop集群_upupfeng的博客-CSDN博客

感谢浏览!如果搭建过程中出现问题,欢迎评论,一起讨论一起进步!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/211313
推荐阅读
相关标签
  

闽ICP备14008679号