好处: 学习大数据时,可以先利用docker搭建一个集群,练练手,节省计算机资源。不过有条件的话,还是建议买几台便宜云服务器练手(几大云服务器厂商的都可以注册一下,哈哈哈,初次使用便宜~~),毕竟具体操作上还是有些不同的。
前置环境: 安装了docker的centos7服务器一台。
目的: 利用docker配置一个三节点的hadoop集群,一主二从。
具体操作如下:
-
宿主机端拉取centos8镜像(发布文章时,默认就是是centos8)
docker pull centos
-
宿主机端创建网段
docker network create --subnet=172.200.0.0/16 hadoopNet
-
在宿主机上创建映射目录
# 存放压缩包的目录 mkdir -p /home/hadoops/soft # 存放解压后的文件 mkdir -p /home/hadoops/install1 mkdir -p /home/hadoops/install2 mkdir -p /home/hadoops/install3
-
将下面三个软件包上传到宿主机/home/hadoops/soft目录下
软件包百度云下载链接 提取码: w22bls 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
-
将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/
-
创建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
- 利用刚才自己创建的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
-
创建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
-
创建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
-
进入每一个容器开启ssh中服务,以hd-master为例
docker exec -it hd-master/bin/bash /usr/sbin/sshd
-
在每一个容器中都进行ssh链接测试
ssh hd-slave1 ssh hd-slave2 ssh hd-master
-
创建普通用户(可选)
-
安装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
-
安装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
- 安装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>
- 编辑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
-
创建文件存放目录(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
-
将(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文件!(过程略)
- 为普通用户修改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
-
格式化Hadoop(hd-master)容器中。
# 切换成普通用户,如果设置了的话(可选) su hadoop hdfs namenode -format ----------------------------------------- # 此处省略部分日志 /************************************************************ SHUTDOWN_MSG: Shutting down NameNode at hd-master/172.200.0.100 ************************************************************/ -----------------------------------------
-
启动集群(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界面.
- 运行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中
-
停止集群(hd-master)容器中
stop-all.sh
完毕!