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

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

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

具体操作如下:

  1. 宿主机端拉取centos8镜像(发布文章时,默认就是是centos8)
docker pull centos
  1. 宿主机端创建网段
docker network create --subnet=172.200.0.0/16 hadoopNet
  1. 在宿主机上创建映射目录
# 存放压缩包的目录
mkdir -p /home/hadoops/soft 
# 存放解压后的文件
mkdir -p /home/hadoops/install1 
mkdir -p /home/hadoops/install2
mkdir -p /home/hadoops/install3
  1. 将下面三个软件包上传到宿主机/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
  1. 将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/
  1. 创建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
  1. 创建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
  1. 进入每一个容器开启ssh中服务,以hd-master为例
docker exec -it hd-master/bin/bash
/usr/sbin/sshd
  1. 在每一个容器中都进行ssh链接测试
ssh hd-slave1
ssh hd-slave2
ssh hd-master
  1. 创建普通用户(可选)
  2. 安装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
  1. 安装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
  1. 将(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
************************************************************/
-----------------------------------------
  1. 启动集群(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
  • 在浏览器地址栏中输入http://宿主机IP地址:50070/dfshealth.html#tab-overview查看namenode的web界面.
  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

完毕!