docker搭建三节点的hadoop集群(包含:hdfs、yarn、zookeeper、mapreduce程序测试)

好处: 学习大数据时,可以先利用docker搭建一个集群,练练手,节省计算机资源。不过有条件的话,还是建议买几台便宜云服务器练手(几大云服务器厂商的都可以注册一下,哈哈哈,初次使用便宜~~),毕竟具体操作上还是有些不同的。

前置环境: 安装了docker的centos7服务器一台。

目的: 利用docker配置一个三节点的hadoop集群,一主二从。

具体操作如下:

  1. 宿主机端拉取centos8镜像(发布文章时,默认就是是centos8)

    docker pull centos
    
  2. 宿主机端创建网段

    docker network create --subnet=172.200.0.0/16 hadoopNet
    
  3. 在宿主机上创建映射目录

    # 存放压缩包的目录
    mkdir -p /home/hadoops/soft 
    # 存放解压后的文件
    ​mkdir -p /home/hadoops/install1 
    ​mkdir -p /home/hadoops/install2
    ​mkdir -p /home/hadoops/install3
    
  4. 将下面三个软件包上传到宿主机/home/hadoops/soft目录下
    软件包百度云下载链接 提取码: w22b

    ls
    jdk-8u141-linux-x64.tar.gz
    zookeeper-3.4.5-cdh5.14.2.tar.gz
    hadoop-2.6.0-cdh5.14.2_after_compile.tar.gz 
    
  5. 将4中的三个文件解压到install1中

    tar -zxvf hadoop-2.6.0-cdh5.14.2_after_compile.tar.gz -C /home/hadoops/install1/
    tar -zxvf zookeeper-3.4.5-cdh5.14.2.tar.gz -C /home/hadoops/install1/
    tar -zxvf jdk-8u141-linux-x64.tar.gz -C /home/hadoops/install1/	
    
  6. 创建hd-centos8镜像,并实现免密登录

  • hd-centos8镜像我已经创建好了,不想自己创建的话,跳过此步骤,直接拉取使用即可

  • docker pull maxwellwk/hadoop_images:hd-centos8

  • 自己创建hd-centos8镜像

    # 查看刚才拉取的centos8镜像id(0d120b6ccaa8)
    docker images
    # 利用镜像id创建镜像
    docker run -d -it --privileged=true --restart always --name hd-centos8 0d120b6ccaa8 /bin/bash
    
  • 进入hd-centos8容器中安装必要的软件包

    yum -y install net-tools openssh-server psmisc iproute wget vim openssh-clients passwd sudo
    
  • 处理报错信息Failed to set locale, defaulting to C.UTF-8

    dnf install langpacks-en glibc-all-langpacks -y
    
  • docker 中将时区更改为上海时区

  • rm -f /etc/localtime
    ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
    
  • 在hd-centos8中修改root用户密码

    echo "123456" |passwd --stdin root
    
  • 在hd-centos8中创建公私钥

    ssh-keygen -t rsa
    cd ~/.ssh/
    cp id_rsa.pub  authorized_keys
    
  • 在hd-centos8中初次开启ssh时,执行下面的语句

    ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key
    ssh-keygen -t dsa -f /etc/ssh/ssh_host_dsa_key
    ssh-keygen -t rsa -f /etc/ssh/ssh_host_ecdsa_key
    ssh-keygen -t rsa -f /etc/ssh/ssh_host_ed25519_key
    -----------------------------------------------------
    # 开启ssh服务
    /usr/sbin/sshd
    
  • 将新创建的(hd-centos8)容器,提交成新的镜像,后期的hadoop容器都基于此容器创建

    # 1.查看容器的id
    docker ps 
    # 2.登录自己的 docker 账户
    docker login
    # 3.提交新的镜像
    # sudo docker commit 容器ID 目标镜像仓库的用户名/仓库名:标签
    sudo docker commit 77c7b0ab9802  maxwellwk/hadoop_images:hd-centos8
    # 4.自己创建的镜像推送到docker hub中(可选)
    docker push maxwellwk/hadoop_images
    
  1. 利用刚才自己创建的hd-centos8镜像创建 hd-master 主节点容器。
  • 宿主机开放端口号

  • firewall-cmd --zone=public --add-port=8020/tcp -add-port=80090/tcp -add-port=80070/tcp -add-port=10020/tcp -add-port=19988/tcp --permanent

  • 重启防火墙

  • firewall-cmd --reload

  • 查看开放的端口

  • firewall-cmd --list-ports

  • 创建hd-master 主节点容器

    docker run -d -it --privileged=true --restart always -v /home/hadoops/install1:/home/hadoops/install --name hd-master -p 8020:8020 -p 50090:50090 -p 50070:50070  -p 10020:10020 -p 19888:19888 -h hd-master --net hadoopNet --ip 172.200.0.100 78b644789575 /bin/bash
    
  1. 创建hd-slave1从节点

    docker run -d -it --privileged=true --restart always -v /home/hadoops/install2:/home/hadoops/install --name hd-slave1 -h hd-slave1 --net hadoopNet --ip 172.200.0.110 78b644789575 /bin/bash
    
  2. 创建hd-slave2从节点

    docker run -d -it --privileged=true --restart always -v /home/hadoops/install3:/home/hadoops/install --name hd-slave2 -h hd-slave2 --net hadoopNet --ip 172.200.0.120 78b644789575 /bin/bash
    
  3. 进入每一个容器开启ssh中服务,以hd-master为例

    docker exec -it hd-master/bin/bash
    /usr/sbin/sshd
    
  4. 在每一个容器中都进行ssh链接测试

    ssh hd-slave1
    ssh hd-slave2
    ssh hd-master
    
  5. 创建普通用户(可选)

  6. 安装jdk

    vim /etc/profile
    # 添加以下配置内容,配置jdk环境变量
    export JAVA_HOME=/home/hadoops/install/jdk1.8.0_141
    export PATH=:$JAVA_HOME/bin:$PATH
    ---------------------------------------
    # 让配置环境生效
    source /etc/profile
    java -version
    
  7. 安装zookeeper集群

  • 修改hd-master的配置文件(三个容器上分别执行以下任务)

    cd /home/hadoops/install/zookeeper-3.4.5-cdh5.14.2/conf
    # 复制文件
    cp zoo_sample.cfg zoo.cfg
    # 创建zkdatas文件夹
    mkdir -p /home/hadoops/install/zookeeper-3.4.5-cdh5.14.2/zkdatas
    # 编辑zoo.cfg
    vim  zoo.cfg
    ---------------------------------------
    dataDir=/home/hadoops/install/zookeeper-3.4.5-cdh5.14.2/zkdatas
    autopurge.snapRetainCount=3
    autopurge.purgeInterval=1
    server.1=hd-master:2888:3888
    server.2=hd-slave1:2888:3888
    server.3=hd-slave2:2888:3888
    
  • 在hd-master中添加myid配置(hd-master 为1,hd-slave1 为 2,hd-slave2 为3)

    # hd-master
    echo 1 > /home/hadoops/install/zookeeper-3.4.5-cdh5.14.2/zkdatas/myid
    # hd-slave1 
    echo 2 > /home/hadoops/install/zookeeper-3.4.5-cdh5.14.2/zkdatas/myid
    # hd-slave2 
    echo 3 > /home/hadoops/install/zookeeper-3.4.5-cdh5.14.2/zkdatas/myid
    
  • 在三台容器上分别启动zookeeper服务

    # 开启
    /home/hadoops/install/zookeeper-3.4.5-cdh5.14.2/bin/zkServer.sh start
    # 查看状态
    /home/hadoops/install/zookeeper-3.4.5-cdh5.14.2/bin/zkServer.sh status
    
  1. 安装Hadoop集群
  • 配置环境变量

    vim /etc/profile
    ----------------------------------------
    JAVA_HOME=/home/hadoops/install/jdk1.8.0_141
    HADOOP_HOME=/home/hadoops/install/hadoop-2.6.0-cdh5.14.2
    PATH=$PATH:$HOME/bin:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
    export JAVA_HOME
    export HADOOP_HOME
    export PATH
    ----------------------------------------
    # 是环境变量生效
    source /etc/profile
    java -version
    hadoop version
    
  • 配置hadoop-env.sh

    vim  /home/hadoops/install/hadoop-2.6.0-cdh5.14.2/etc/hadoop/hadoop-env.sh
    ----------------------------------------
    export JAVA_HOME=/home/hadoops/install/jdk1.8.0_141
    
  • 配置core-site.xml

    vim /home/hadoops/install/hadoop-2.6.0-cdh5.14.2/etc/hadoop/core-site.xml
    ----------------------------------------
    <configuration>
            <property>
                    <name>fs.defaultFS</name>
                    <value>hdfs://hd-master:8020</value>
            </property>
            <property>
                    <name>hadoop.tmp.dir</name>
                    <value>/home/hadoops/install/hadoop-2.6.0-cdh5.14.2/hadoopDatas/tempDatas</value>
            </property>
            <!--  缓冲区大小,实际工作中根据服务器性能动态调整 -->
            <property>
                    <name>io.file.buffer.size</name>
                    <value>4096</value>
            </property>
            <property>
                    <name>fs.trash.interval</name>
                    <value>10080</value>
                    <description>检查点被删除后的分钟数。 如果为零,垃圾桶功能将被禁用。
         该选项可以在服务器和客户端上配置。 如果垃圾箱被禁用服务器端,则检查客户端配置。
         如果在服务器端启用垃圾箱,则会使用服务器上配置的值,并忽略客户端配置值。
                    </description>
            </property>
    
            <property>
                    <name>fs.trash.checkpoint.interval</name>
                    <value>0</value>
                    <description>垃圾检查点之间的分钟数。 应该小于或等于fs.trash.interval。
         如果为零,则将该值设置为fs.trash.interval的值。 每次检查指针运行时,
         它都会从当前创建一个新的检查点,并删除比fs.trash.interval更早创建的检查点。
                    </description>
            </property>
    </configuration> 
    
  • 配置hdfs-site.xml

    vim /home/hadoops/install/hadoop-2.6.0-cdh5.14.2/etc/hadoop/hdfs-site.xml
    ----------------------------------------
    <configuration>
        <!-- NameNode存储元数据信息的路径,实际工作中,一般先确定磁盘的挂载目录,然后多个目录用,进行分割   -->
        <!--   集群动态上下线 
        <property>
            <name>dfs.hosts</name>
            <value>/home/hadoops/install/hadoop-2.6.0-cdh5.14.2/etc/hadoop/accept_host</value>
        </property>
        
        <property>
            <name>dfs.hosts.exclude</name>
            <value>/home/hadoops/install/hadoop-2.6.0-cdh5.14.2/etc/hadoop/deny_host</value>
        </property>
         -->
    
         <property>
                <name>dfs.namenode.secondary.http-address</name>
                <value>hd-master:50090</value>
        </property>
    
        <property>
            <name>dfs.namenode.http-address</name>
            <value>hd-master:50070</value>
        </property>
        <property>
            <name>dfs.namenode.name.dir</name>
            <value>file:///home/hadoops/install/hadoop-2.6.0-cdh5.14.2/hadoopDatas/namenodeDatas</value>
        </property>
        <!--  定义dataNode数据存储的节点位置,实际工作中,一般先确定磁盘的挂载目录,然后多个目录用,进行分割  -->
        <property>
            <name>dfs.datanode.data.dir</name>
            <value>file:///home/hadoops/install/hadoop-2.6.0-cdh5.14.2/hadoopDatas/datanodeDatas</value>
        </property>
    
        <property>
            <name>dfs.namenode.edits.dir</name>
            <value>file:///home/hadoops/install/hadoop-2.6.0-cdh5.14.2/hadoopDatas/dfs/nn/edits</value>
        </property>
        <property>
            <name>dfs.namenode.checkpoint.dir</name>
            <value>file:///home/hadoops/install/hadoop-2.6.0-cdh5.14.2/hadoopDatas/dfs/snn/name</value>
        </property>
        <property>
            <name>dfs.namenode.checkpoint.edits.dir</name>
            <value>file:///home/hadoops/install/hadoop-2.6.0-cdh5.14.2/hadoopDatas/dfs/nn/snn/edits</value>
        </property>
        <property>
            <name>dfs.replication</name>
            <value>3</value>
        </property>
        <property>
            <name>dfs.permissions</name>
            <value>false</value>
        </property>
        <property>
            <name>dfs.blocksize</name>
            <value>134217728</value>
        </property>
    </configuration>
    
  • 配置mapred-site.xml

  • 默认没有mapred-site.xml文件,这里需要从模板中复制一份出来进行修改配置

  • cd /home/hadoops/install/hadoop-2.6.0-cdh5.14.2/etc/hadoop/
    cp  mapred-site.xml.template mapred-site.xml
    
  • 配置mapred-site.xml

  • vim /home/hadoops/install/hadoop-2.6.0-cdh5.14.2/etc/hadoop/mapred-site.xml
    ----------------------------------------------
    <!--指定运行mapreduce的环境是yarn -->
    <configuration>
            <property>
                    <name>mapreduce.framework.name</name>
                    <value>yarn</value>
            </property>
            <property>
                    <name>mapreduce.job.ubertask.enable</name>
                    <value>true</value>
            </property>
            <property>
                    <name>mapreduce.jobhistory.address</name>
                    <value>hd-master:10020</value>
            </property>
            <property>
                    <name>mapreduce.jobhistory.webapp.address</name>
                    <value>hd-master:19888</value>
            </property>
    </configuration>
    
  • 配置yarn-site.xml

    vim /home/hadoops/install/hadoop-2.6.0-cdh5.14.2/etc/hadoop/yarn-site.xml
    ----------------------------------------------
    <configuration>
            <property>
                    <name>yarn.resourcemanager.hostname</name>
                    <value>hd-master</value>
            </property>
            <property>
                    <name>yarn.nodemanager.aux-services</name>
                    <value>mapreduce_shuffle</value>
            </property>
    
    
            <property>
                    <name>yarn.log-aggregation-enable</name>
                    <value>true</value>
            </property>
    
    
            <property>
                     <name>yarn.log.server.url</name>
                     <value>http://hd-master:19888/jobhistory/logs</value>
            </property>
    
            <!--多长时间聚合删除一次日志 此处-->
            <property>
            <name>yarn.log-aggregation.retain-seconds</name>
            <value>2592000</value><!--30 day-->
            </property>
            <!--时间在几秒钟内保留用户日志。只适用于如果日志聚合是禁用的-->
            <property>
            <name>yarn.nodemanager.log.retain-seconds</name>
            <value>604800</value><!--7 day-->
            </property>
            <!--指定文件压缩类型用于压缩汇总日志-->
            <property>
            <name>yarn.nodemanager.log-aggregation.compression-type</name>
            <value>gz</value>
            </property>
            <!-- nodemanager本地文件存储目录-->
            <property>
            <name>yarn.nodemanager.local-dirs</name>
            <value>/home/hadoops/install/hadoop-2.6.0-cdh5.14.2/hadoopDatas/yarn/local</value>
            </property>
            <!-- resourceManager  保存最大的任务完成个数 -->
            <property>
            <name>yarn.resourcemanager.max-completed-applications</name>
            <value>1000</value>
            </property>
    
    </configuration>
    
  1. 编辑slaves
  • 此文件用于配置集群有多少个数据节点,我们把hd-slave1,hd-slave2作为数据节点,hd-master作为集群管理节点

  • vim /home/hadoops/install/hadoop-2.6.0-cdh5.14.2/etc/hadoop/slaves
    ------------------------------------------------
    #将localhost这一行删除掉
    hd-master
    hd-slave1
    hd-slave2
    
  1. 创建文件存放目录(hd-master)

    mkdir -p /home/hadoops/install/hadoop-2.6.0-cdh5.14.2/hadoopDatas/tempDatas
    mkdir -p /home/hadoops/install/hadoop-2.6.0-cdh5.14.2/hadoopDatas/namenodeDatas
    mkdir -p /home/hadoops/install/hadoop-2.6.0-cdh5.14.2/hadoopDatas/datanodeDatas
    mkdir -p /home/hadoops/install/hadoop-2.6.0-cdh5.14.2/hadoopDatas/dfs/nn/edits
    mkdir -p /home/hadoops/install/hadoop-2.6.0-cdh5.14.2/hadoopDatas/dfs/snn/name
    mkdir -p /home/hadoops/install/hadoop-2.6.0-cdh5.14.2/hadoopDatas/dfs/nn/snn/edits
    
  2. 将(hd-master)主服务器中的Hadoop复制到所有的slave容器中

  • 方法一:

    # 1.切换到/home/hadoops/目录下
    cd /home/hadoops/
    # 2.进入install/hadoop-2.6.0-cdh5.14.2/share/目录下删除doc用户文档(比较大),如果没有删除下面进行scp复制的时候时间会很长
    cd install/hadoop-2.6.0-cdh5.14.2/share/
    rm -rf doc/
    # 3.切换到/home/hadoops/目录下
    cd /home/hadoops/
    scp -r install hd-slave1:$PWD
    scp -r install hd-slave2:$PWD
    # 4.分发全局环境变量配置文件
    scp /etc/profile hd-slave1:/etc/profile                                                          100% 2028   608.8KB/s   00:00    
    scp /etc/profile hd-slave2:/etc/profile                                                          100% 2028     1.0MB/s   00:00    
    # 5.使得hd-slave1上的环境变量生效(每个容器都一样)
    ssh hd-slave1
    source /etc/profile
    # 6.检查hadoop环境变量配置是否成功.(每个容器都一样)
    hadoop version
    # 显示hadoop的版本为cdh版本,说明环境变量配置成功
    Hadoop 2.6.0-cdh5.14.2
    Subversion Unknown -r Unknown
    Compiled by root on 2019-08-07T08:39Z
    Compiled with protoc 2.5.0
    From source with checksum 302899e86485742c090f626a828b28
    This command was run using /home/hadoops/install/hadoop-2.6.0-cdh5.14.2/share/hadoop/common/hadoop-common-2.6.0-cdh5.14.2.jar
    
  • 方法二:

  • 退出容器,在宿主机的映射目录上复制copy文件!(过程略)

  1. 为普通用户修改hadoop安装目录的权限。(可选)
  • 每个容器下的普通用户都是hadoop,密码都是123456.

  • hd-master、hd-slave1、hd-slave2容器分别执行以下操作,以hd-master为例

    # 1.修改目录所属用户和组为hadoop:hadoop
    chown -R hadoop:hadoop /home/hadoops
    # 2.修改目录所属用户和组的权限值为755
    chmod -R 755  /home/hadoops
    
  1. 格式化Hadoop(hd-master)容器中。

    # 切换成普通用户,如果设置了的话(可选)
    su hadoop
    hdfs namenode -format
    -----------------------------------------
    # 此处省略部分日志
    /************************************************************
    SHUTDOWN_MSG: Shutting down NameNode at hd-master/172.200.0.100
    ************************************************************/
    -----------------------------------------
    
    
  2. 启动集群(hd-master)容器中。

    start-all.sh
    -----------------------------------------
    hd-slave2: starting nodemanager, logging to /home/hadoops/install/hadoop-2.6.0-cdh5.14.2/logs/yarn-root-nodemanager-hd-slave2.out
    hd-slave1: starting nodemanager, logging to /home/hadoops/install/hadoop-2.6.0-cdh5.14.2/logs/yarn-root-nodemanager-hd-slave1.out
    hd-master: starting nodemanager, logging to /home/hadoops/install/hadoop-2.6.0-cdh5.14.2/logs/yarn-root-nodemanager-hd-master.out
    
  1. 运行mapreduce程序(hd-master)容器中。
  • mapreduce程序(行话程为词频统计程序(中文名),英文名:wordcount),就是统计一个文件中每一个单词出现的次数,也是我们学习大数据技术最基础,最简单的程序。我们接下来要运行的程序(wordcount)是一个分布式运行的程序,是在一个大数据集群中运行的程序。wordcount程序能够正常的运行成功,输入结果,意味着我们的大数据环境正确的安装和配置成功。

  • # 1.使用hdfs dfs -ls /  命令浏览hdfs文件系统,集群刚开始搭建好,由于没有任何目录所以什么都不显示.
    hdfs dfs -ls /
    # 2.创建测试目录 -p递归创建
    hdfs dfs -mkdir -p /home/hadoops/test 
    # 3.在此使用hdfs dfs -ls 发现我们刚才创建的test目录 -R 递归查询
    hdfs dfs -ls -R /home/hadoops/
    # 4.查询/目录下的所有文件和文件夹
    hdfs dfs -ls /   
    # 5.使用vim命令在linux本地目录创建一个words文件,并写入以下内容
    vim /home/hadoops/words
    -----------------------------------------
    i love you
    are you ok
    # 6.将创建的本地words文件上传到hdfs的test目录下
    cd /home/hadoops
    hdfs dfs -put words /test
    # 7.查看上传的文件是否成功
    hdfs dfs -ls -r /test
    # 8.运行词频统计程序(/test/words 是hdfs上的文件存储路径 /test/output是mapreduce程序的输出路径,这个输出路径是不能已经存在的路径,mapreduce程序运行的过程中会自动创建输出路径,数据路径存在的话会报错.)
    hadoop jar /home/hadoops/install/hadoop-2.6.0-cdh5.14.2/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.0-cdh5.14.2.jar wordcount /test/words /test/output
    # 9.查看词频统计后的结果
    hdfs dfs -cat /test/output/part-r-00000
    -----------------------------------------
    are	1
    i	1
    love	1
    ok	1
    you	2
    

    PS:

    1、查询命令
      hadoop dfs -ls /   查询/目录下的所有文件和文件夹
      hadoop dfs -ls -R 以递归的方式查询/目录下的所有文件
    2、创建文件夹
      hadoop dfs -mkdir /test    创建test文件夹
    3、创建新的空文件
      hadoop dfs -touchz /aa.txt   在/目录下创建一个空文件aa.txt
    4、增加文件
      hadoop dfs -put aa.txt /test  将当前目录下的aa.txt文件复制到/test目录下(把-put换成-copyFromLocal效果一样-moveFromLocal会移除本地文件)
    5、查看文件内容
      hadoop dfs -cat /test/aa.txt     查看/test目录下文件aa.txt的内容(将-cat 换成-text效果一样)
    6、复制文件 
      hadoop dfs -copyToLocal /test/aa.txt ./test/aa.txt文件复制到当前目录(.是指当前目录,也可指定其他的目录)
    7、删除文件或文件夹
      hadoop dfs -rm -r /test/aa.txt   删除/test/aa.txt文件(/test/aa.txt可以替换成文件夹就是删除文件夹)
    8、重命名文件
      hadoop dfs -mv /aa.txt /bb.txt   将/aa.txt文件重命名为/bb.txt
    9、将源目录中的所有文件排序合并到一个本地文件
      hadoop dfs -getmerge /   local-file/目录下的所有文件合并到本地文件local-file
  1. 停止集群(hd-master)容器中

    stop-all.sh
    

完毕!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值