大数据技术的学习任重而道远,很多小伙伴都会卡在诸多的基础问题上,因此作为大数据技术方面的布道者,我将开启一个全新的学习实践与指导计划:
从零开始,一步步由浅入深,系统化的开展大数据技术实践的学习指导,手把手的教会我们怎么应用大数据技术框架,再配合上大数据技术、分布式架构的原理研究、系统优化、框架协作等高级内容,使得我们能更深刻的掌握大数据技术。期待能促进更多的工程师朝着大数据、人工智能、物联网等新一代技术方向前进与突破。
全文一万七千字,三十幅示意图,内容包括:CentOS7集群构建、ZooKeeper集群部署、HDFS HA(高可用)部署、YARN HA(高可用)部署、Hadoop集群验证、MapReduce代码样例验证等。
手机微信打开浏览器网址预览https://zhuanlan.zhihu.com/p/451266781?
目录
1. 准备工作
前期准备工作包括了
-
CenOS 7虚拟化安装与配置,
-
Java虚拟机的安装,
-
Hadoop相关部署包的下载,
-
Hadoop集群所需基础环境的配置。
第一点CenOS 7虚拟化安装与配置和第二点Java虚拟机的安装:
需要我们参考第一章:大数据技术训练舱——从零开始安装、配置CentOS 7
第三点Hadoop相关部署包的下载:
这就包括了ZooKeeper部署包、Hadoop部署包。ZooKeeper是分布式协调系统,主要用于Hadoop的高可用(HA)协调;
Hadoop部署包括了HDFS(Hadoop分布式文件系统)和YARN(Hadoop资源管理者)。
第四点Hadoop集群所需基础环境的配置,包括:
1) 复制节点构建集群
2) 集群节点间ssh免密登陆
我们本次集群实践至少需要三个CentOS节点,我们有两种办法实现,第一种办法就是按照中的安装步骤连续安装三个节点;
第二种办法比较简单,需要将第一次安装后的CentOS虚拟化文件再复制两份,然后进行二次修改。
1) 复制节点构建集群
步骤:
(1) MacOS的VMware Fusion会生成一份虚拟机文件,如下图2.1所示,我将“CentOS 7 64 位”文件又复制了两份。Windows的VMware Workstaion则会将很多虚拟机文件放在一个目录里,因此我们需要再复制两份目录。
图2.1
(2) 我们需要对复制过的文件进行IP和主机名修改,MacOS的VMware Fusion直接打开复制后的文件,Windows的VMware Workstaion则打开复制后目录里的.vmx文件。需要注意一点:修改IP之前尽量关闭第一个节点。
我们打开后,VMware会提示“复制”或“移动”,请选择复制。
(3) 系统启动后,通过与第一个节点相同设定root用户名和密码登陆,我们首先修改IP,参考大数据技术训练舱——从零开始安装、配置CentOS 7中第3部分的网络配置,修改ifcfg-ens33配置文件,将新的两个节点的IP从192.168.83.4修改为192.168.83.5和192.168.83.6,
#新增的两个节点修改此IP为192.168.83.5或192.168.83.6
IPADDR=192.168.83.4
(4) 然后我们进行主机名的修改,在192.168.83.5节点上执行:
hostnamectl set-hostname datanode-2
在192.168.83.6节点上执行:
hostnamectl set-hostname datanode-3
各个节点重启后,我们将形成主机/IP的映射关系如下:
192.168.83.4 datanode-1
192.168.83.5 datanode-2
192.168.83.6 datanode-3
(5) 请将上面这三条IP/主机名映射关系记录分别追加到这三个节点的/etc/hosts文件里:
vim /etc/hosts
如下图2.2所示:
图2.2
2) 集群节点间ssh免密登陆
Hadoop集群具有远程节点控制的需要,因此集群节点之间需要设置为ssh免密登录模式。
步骤:
(1) 通过ssh分别登陆datanode-1、datanode-2、datanode-3,若/root/.ssh目录不存在,创建此目录并修改目录权限属性。
mkdir /root/.ssh
chmod -R 0600 /root/.ssh
(2) 登陆datanode-1节点制作公私密钥。生成ssh登陆公私密钥id_rsa、id_rsa.pub,追加authorized_keys,修改目录内的文件权限属性。
ssh-keygen -t rsa -P '' -f /root/.ssh/id_rsa
cat ~/.ssh/id_rsa.pub >> /root/.ssh/authorized_keys
chmod 0600 /root/.ssh/id_rsa
chmod 0600 /root/.ssh/authorized_keys
(3) 复制id_rsa、authorized_keys到其他节点。
scp /root/.ssh/authorized_keys root@datanode-2:/root/.ssh/
scp /root/.ssh/id_rsa root@datanode-2:/root/.ssh/
scp /root/.ssh/authorized_keys root@datanode-3:/root/.ssh/
scp /root/.ssh/id_rsa root@datanode-3:/root/.ssh/
做到这一步,我们准备工作已经完成,我们可以在这三个节点上用ssh datanode-(序号)的命令执行测试,看看互相之间ssh登陆是否已经不需要密码了。 注意只要/root/.ssh目录及下面的密钥没有实现0600权限属性,就无法实现免密登陆。
2. ZooKeeper集群部署
ZooKeeper是Hadoop高可用环境的分布式协调系统,因此我们搭建Hadoop HA集群之前一定先部署ZooKeeper集群。
1) 上传解压
首先我们需要将下载到本机的ZooKeeper部署包上传至这三个节点,Mac系统如下:
scp /Users/你的用户名/Downloads/apache-zookeeper-3.7.0-bin.tar.gz root@192.168.83.4:/root
scp /Users/你的用户名/Downloads/apache-zookeeper-3.7.0-bin.tar.gz root@192.168.83.5:/root
scp /Users/你的用户名/Downloads/apache-zookeeper-3.7.0-bin.tar.gz root@192.168.83.6:/root
Windows平台请参考大数据技术训练舱——从零开始安装、配置CentOS 7中Java环境安装的jdk包上传。
我们选择了这三个节点同时为ZooKeeper的集群节点,分别ssh登陆datanode-1、datanode-2、datanode-3,解压到/opt目录,并做好软链,三节点分别执行:
tar -zxvf /root/apache-zookeeper-3.7.0-bin.tar.gz -C /opt/
ln -s /opt/apache-zookeeper-3.7.0-bin /opt/zookeeper
2) 环境配置
登陆datanode-1节点编辑/etc/profile:
vim /etc/profile
追加 ZooKeeper bin目录到PATH,实现ZK命令全局可执行:
export ZOOKEEPER_HOME=/opt/zookeeper
export PATH=$PATH:$ZOOKEEPER_HOME/bin
并使其执行生效:
source /etc/profile
Profile文件复制给其他两个节点:
scp /etc/profile root@datanode-2:/etc
scp /etc/profile root@datanode-3:/etc
生成ZooKeeper配置文件,并编辑:
cp /opt/zookeeper/conf/zoo_sample.cfg /opt/zookeeper/conf/zoo.cfg
vim /opt/zookeeper/conf/zoo.cfg
配置zoo.cfg,ZK数据放在在/home/data/zkdata下,端口为2888,3888
dataDir=/home/data/zkdata
server.1=datanode-1:2888:3888
server.2=datanode-2:2888:3888
server.3=datanode-3:2888:3888
如下图2.3蓝框所示:
图2.3
分发zoo.cfg到其他节点:
scp /opt/zookeeper/conf/zoo.cfg root@datanode-2:/opt/zookeeper/conf
scp /opt/zookeeper/conf/zoo.cfg root@datanode-3:/opt/zookeeper/conf
创建数据目录和集群标识:
mkdir -p /home/data/zkdata
echo "1" > /home/data/zkdata/myid
登陆datanode-2,执行上面操作,但集群标识为2
mkdir -p /home/data/zkdata
echo "2" > /home/data/zkdata/myid
登陆datanode-3,执行上面操作,但集群标识为3
mkdir -p /home/data/zkdata
echo "3" > /home/data/zkdata/myid
分别登陆三个节点,启动zookeeper:
zkServer.sh start
3).测试
每台机器jps查看验证zk进程:
jps
如下图2.3蓝色框所示:
图2.3
任意节点登陆ZK客户端,验证zk客户端,获取配置路径ZNode信息,并退出:
zkCli.sh
get /zookeeper/config
quit
如下图2.4蓝色框所示:
图2.4
我们也可以分别三个节点验证当前ZK节点属于Leader还是Follower,注:ZK集群只有一个Leader:
zkServer.sh status
如下图2.5所示,datanode-3节点为ZK集群的Leader节点:
图2.5
4).加入自启动
登陆datanode-1节点增加并编辑systemctl自启动文件:
vim /etc/systemd/system/zookeeper.service
编辑内容:
[Unit]
Description=zookeeper.service
After=network.target
ConditionPathExists=/opt/zookeeper/conf/zoo.cfg
[Service]
Type=forking
Environment=JAVA_HOME=/usr/jdk1.8.0_311
User=root
Group=root
ExecStart=/opt/zookeeper/bin/zkServer.sh start
ExecStop=/opt/zookeeper/bin/zkServer.sh stop
[Install]
WantedBy=multi-user.target
分发到其他节点:
scp /etc/systemd/system/zookeeper.service root@datanode-2:/etc/systemd/system
scp /etc/systemd/system/zookeeper.service root@datanode-3:/etc/systemd/system
分别ssh登陆datanode-1、datanode-2、datanode-3,增加到系统自启动服务,并kill掉ZK进程,该用systemctl启动验证:
systemctl enable zookeeper
jps |grep QuorumPeerMain|awk '{print $1}'|xargs kill -9
systemctl start zookeeper
jps
3. HDFS高可用集群部署
HDFS(Hadoop分布式文件系统)是Hadoop生态的数据底座,很多上层大数据技术框架最终会依赖对HDFS的读与写,HDFS是Hadoop部署的关键部分。HDFS为集中式元数据管理,其中主服务NameNode部署可以分为单机版和高可用版(HA)两种,作为以高可靠为目的的大数据存储系统,高可用性非常关键,因此作为训练目的,我们应该掌握高可用版的部署,同样我们也要面对高可用的部署复杂度。
1) 上传解压
首先我们需要将下载到本机的Hadoop部署包上传至这三个节点,Mac系统如下:
scp /Users/你的用户名/Downloads/hadoop-3.3.1.tar.gz root@192.168.83.4:/root
scp /Users/你的用户名/Downloads/hadoop-3.3.1.tar.gz root@192.168.83.5:/root
scp /Users/你的用户名/Downloads/hadoop-3.3.1.tar.gz root@192.168.83.6:/root
我们选择了这三个节点为HDFS的集群节点,通过ssh分别登陆datanode-1、datanode-2、datanode-3,解压到/opt目录,并做好软链,三节点分别执行:
tar -zxvf hadoop-3.3.1.tar.gz -C /opt
ln -s /opt/hadoop-3.3.1 /opt/hadoop
2) 环境配置
登陆datanode-1节点编辑/etc/profile:
vim /etc/profile
追加 Haddop bin目录到PATH,实现Hadoop命令全局可执行:
export HADOOP_HOME=/opt/hadoop
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
并使其执行生效:
source /etc/profile
将profile分发到其他节点:
scp /etc/profile root@datanode-2:/etc
scp /etc/profile root@datanode-3:/etc
编辑hadoop环境变量
vim /opt/hadoop/etc/hadoop/hadoop-env.sh
vi非编辑模式,查询关键字“export JAVA_HOME”,输入下面关键字、回车、查询:
/export JAVA_HOME
查询到"#export JAVA_HOME=",vi进入编辑模式取消注释,修改为:
export JAVA_HOME=/usr/jdk1.8.0_311
vi非编辑模式,查询关键字“export HADOOP_HOME”,输入下面关键字、回车、查询:
/export HADOOP_HOME
查询到“#export HADOOP_HOME=”,vi进入编辑模式取消注释,修改为:
export HADOOP_HOME=/opt/hadoop
编辑HDFS参数配置文件:
vim /opt/hadoop/etc/hadoop/hdfs-site.xml
在<configuration></configuration>之间增加如下内容:
<property>
<!--为高可用配置逻辑名称,名称自定义,当前为:fsnss -->
<name>dfs.nameservices</name>
<value>fsnss</value>
</property>
<property>
<!-- 禁用权限 -->
<name>dfs.permissions.enabled</name>
<value>false</value>
</property>
<property>
<!-- 配置namenode节点逻辑名称,两个NameNode节点用逗号分割,nn1,nn2形成高可用 -->
<name>dfs.ha.namenodes.fsnss</name>
<value>nn1,nn2</value>
</property>
<property>
<!-- namenode nn1对外RPC监听地址和端口号 -->
<name>dfs.namenode.rpc-address.fsnss.nn1</name>
<value>datanode-1:9820</value>
</property>
<property>
<!-- namenode nn2对外RPC监听地址和端口号 -->
<name>dfs.namenode.rpc-address.fsnss.nn2</name>
<value>datanode-2:9820</value>
</property>
<property>
<!-- namenode nn1 HTTP协议的管理地址和端口 -->
<name>dfs.namenode.http-address.fsnss.nn1</name>
<value>datanode-1:9870</value>
</property>
<property>
<!-- namenode nn2 HTTP协议的管理地址和端口 -->
<name>dfs.namenode.http-address.fsnss.nn2</name>
<value>datanode-2:9870</value>
</property>
<property>
<!-- namenode HA共享的EditLogs目录,使用QJM管理,配置journalnode集群的服务器名称与端口 -->
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://datanode-1:8485;datanode-2:8485;datanode-3:8485/fsnss</value>
</property>
<property>
<!-- 客户端用ConfiguredFailoverProxyProvider类作为namenode故障转移的高可用代理类 -->
<name>dfs.client.failover.proxy.provider.fsnss</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<property>
<!-- 高可用隔离方法使用ssh隔离-->
<name>dfs.ha.fencing.methods</name>
<value>sshfence</value>
</property>
<property>
<!-- ssh隔离所需的私钥,就是第一部分配置的id_rsa -->
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/root/.ssh/id_rsa</value>
</property>
<property>
<!-- journalnode存储数据的位置/home/data/dfs下 -->
<name>dfs.journalnode.edits.dir</name>
<value>/home/data/dfs/journal/node/local/data</value>
</property>
<property>
<!-- 配置namenode故障自动切换 -->
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
编辑core-site.xml
vim /opt/hadoop/etc/hadoop/core-site.xml
在<configuration></configuration>之间增加如下内容:
<property>
<!-- 为Hadoop客户端配置默认的高可用路径 -->
<name>fs.defaultFS</name>
<value>hdfs://fsnss</value>
</property>
<!-- 为Hadoop配置临时数据目录/home/data/dfs/hadoop/ -->
<property>
<name>hadoop.tmp.dir</name>
<value>/home/data/dfs/hadoop/</value>
</property>
<property>
<!-- 指定zookeeper所在的节点地址和端口 -->
<name>ha.zookeeper.quorum</name>
<value>datanode-1:2181,datanode-2:2181,datanode-3:2181</value>
</property>
4. YARN高可用集群配置
YARN是Hadoop资源管理和和作业调度的核心组件,是MapReduce V2框架的主要组成部分。
按照高可用计算架构部署,datanode-1、datnode-2两个节点组成ResourceManager(RM) HA,负责整个集群的资源管理和调度。
编辑yarn-site.xml
vim /opt/hadoop/etc/hadoop/yarn-site.xml
在<configuration></configuration>之间增加如下内容:
<property>
<!-- NodeManager上可运行MapReduce程序 -->
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<!-- 允许NodeManager继承的环境属性 -->
<name>yarn.nodemanager.env-whitelist</name>
<value>JAVA_HOME,HADOOP_COMMON_HOME,HADOOP_HDFS_HOME,HADOOP_CONF_DIR,CLASSPATH_PREPEND_DISTCACHE,HADOOP_YARN_HOME,HADOOP_MAPRED_HOME</value>
</property>
<property>
<!-- 配置yarn为高可用 -->
<name>yarn.resourcemanager.ha.enabled</name>
<value>true</value>
</property>
<property>
<!-- 集群的唯一标识 -->
<name>yarn.resourcemanager.cluster-id</name>
<value>mycls</value>
</property>
<property>
<!-- ResourceManager HA 逻辑名称,两个ResourceManager节点用逗号分割,rm1,rm2形成高可用-->
<name>yarn.resourcemanager.ha.rm-ids</name>
<value>rm1,rm2</value>
</property>
<property>
<!-- 指定ResourceManager rm1所在的节点主机名-->
<name>yarn.resourcemanager.hostname.rm1</name>
<value>datanode-1</value>
</property>
<property>
<!-- 指定ResourceManager rm2所在的节点主机名-->
<name>yarn.resourcemanager.hostname.rm2</name>
<value>datanode-2</value>
</property>
<property>
<!-- 指定yarn的http web管理端为rm1,端口8088-->
<name>yarn.resourcemanager.webapp.address.rm1</name>
<value>datanode-1:8088</value>
</property>
<property>
<!-- 指定yarn的http web管理端为rm2,端口8088-->
<name>yarn.resourcemanager.webapp.address.rm2</name>
<value>datanode-2:8088</value>
</property>
<property>
<!-- 指定zookeeper所在的节点 -->
<name>yarn.resourcemanager.zk-address</name>
<value>datanode-1:2181,datanode-2:2181,datanode-3:2181</value>
</property>
<property>
<!-- 启用节点的内容和CPU自动检测,最小内存为1G -->
<name>yarn.nodemanager.resource.detect-hardware-capabilities</name>
<value>true</value>
</property>
<!-- 开启日志聚合 -->
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>
<!-- 日志聚合目录 -->
<property>
<name>yarn.nodemanager.remote-app-log-dir</name>
<value>/user/container/logs</value>
</property>
<property>
<!-- 单个Map任务的内存范围,1.5GB是以节点总内存4G为依据 -->
<name>mapreduce.map.memory.mb</name>
<value>1536</value>
</property>
编辑mapred-site.xml:
vim /opt/hadoop/etc/hadoop/mapred-site.xml
在<configuration></configuration>之间增加如下内容:
<property>
<!-- MapReduce引擎选择默认框架-->
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<property>
<!-- 配置MapReduce工作任务写入并存储的地址与端口-->
<name>mapreduce.jobhistory.address</name>
<value>datanode-1:10020</value>
</property>
<property>
<!--配置查看已经结束的工作任务的web地址与端口 -->
<name>mapreduce.jobhistory.webapp.address</name>
<value>datanode-1:19888</value>
</property>
<property>
<!--配置存放当前正在运行的工作任务记录的目录 -->
<name>mapreduce.jobhistory.intermediate-done-dir</name>
<value>/mr-history/tmp</value>
</property>
<property>
<!--配置存放运行结束的工作任务记录的目录,可用于自定义分析 -->
<name>mapreduce.jobhistory.done-dir</name>
<value>/mr-history/done</value>
</property>
5. 结束配置与初始化
1) 配置文件分发
scp /opt/hadoop/etc/hadoop/hadoop-env.sh root@datanode-2:/opt/hadoop/etc/hadoop
scp /opt/hadoop/etc/hadoop/hadoop-env.sh root@datanode-3:/opt/hadoop/etc/hadoop
scp /opt/hadoop/etc/hadoop/hdfs-site.xml root@datanode-2:/opt/hadoop/etc/hadoop
scp /opt/hadoop/etc/hadoop/hdfs-site.xml root@datanode-3:/opt/hadoop/etc/hadoop
scp /opt/hadoop/etc/hadoop/core-site.xml root@datanode-2:/opt/hadoop/etc/hadoop
scp /opt/hadoop/etc/hadoop/core-site.xml root@datanode-3:/opt/hadoop/etc/hadoop
scp /opt/hadoop/etc/hadoop/yarn-site.xml root@datanode-2:/opt/hadoop/etc/hadoop
scp /opt/hadoop/etc/hadoop/yarn-site.xml root@datanode-3:/opt/hadoop/etc/hadoop
scp /opt/hadoop/etc/hadoop/mapred-site.xml root@datanode-2:/opt/hadoop/etc/hadoop
scp /opt/hadoop/etc/hadoop/mapred-site.xml root@datanode-3:/opt/hadoop/etc/hadoop
2) 初始化
(1) 登陆datanode-1,连接ZooKeeper,格式化ZKFC(ZK故障转移控制):
hdfs zkfc -formatZK
下图2.6 日志打印中的蓝色框代表初始化成功。
图2.6
登陆ZooKeeper,检查hadoop-ha节点是否创建:
zkCli.sh
ls /hadoop-ha
quit
下图2.7 ZooKeeper中创建的ZNode节点/hadoop-ha/fsnss
图2.7
通过ssh分别登陆datanode-1、datanode-2、datanode-3,启动journalnode:
hdfs --daemon start journalnode
通过jps命令,查看journalnode节点进程是否启动正常,如下图2.8所示:
图2.8
重返datanode-1节点,格式化namenode nn1:
hdfs namenode -format nn1
如下图2.9所示,代表格式化成功:
图2.9
启动namenode nn1,准备namenode nn2格式化同步:
hdfs --daemon start namenode
通过jps命令,查看namenode节点进程是否启动正常,如下图2.10所示:
图2.10
登陆datanode-2节点,执行namenode nn2格式化同步:
hdfs namenode -bootstrapStandby
如下图2.11所示,代表格式化同步成功:
图2.11
启动namenode nn2,组成高可用:
hdfs --daemon start namenode
通过jps命令,查看namenode节点进程是否启动正常,如下图2.12所示:
图2.12
我们查看一下高可用的状态:
hdfs haadmin -getAllServiceState
这时候,我们得到的是nn1、nn2都属于准备状态:
datanode-1:9820 standby
datanode-2:9820 standby
我们将namenode nn1变为激活状态成为主服务:
hdfs haadmin -transitionToActive --forcemanual nn1
如下图2.13所示,执行过程选择‘Y’,然后再查看一下高可用状态,我们会发现nn1已经变为active状态。
图2.13
我们打开客户端浏览器,输入nn1的地址(谁处于Active状态就输入谁的IP地址):
http://192.168.83.4:9870
就能看到HDFS管理界面,如下图2.14所示,只不过这时候还没有任何DataNode节点:
图2.14
重返datanode-1节点,编辑works列表:
vim /opt/hadoop/etc/hadoop/workers
删除localhost,增加这三个节点为DataNode节点:
datanode-1
datanode-2
datanode-3
编辑start-dfs.sh、stop-dfs.sh:
vim /opt/hadoop/sbin/start-dfs.sh
vim /opt/hadoop/sbin/stop-dfs.sh
在第一行之后处加入root和Hadoop用户的绑定:
HDFS_DATANODE_USER=root
HDFS_DATANODE_SECURE_USER=hdfs
HDFS_NAMENODE_USER=root
HDFS_SECONDARYNAMENODE_USER=root
HDFS_JOURNALNODE_USER=root
HDFS_ZKFC_USER=root
如下图2.15所示:
图2.15
编辑start-yarn.sh、stop-yarn.sh:
vim /opt/hadoop/sbin/start-yarn.sh
vim /opt/hadoop/sbin/stop-yarn.sh
在第一行之后处加入root和Hadoop用户的绑定:
YARN_RESOURCEMANAGER_USER=root
HADOOP_USER_NAME=root
HADOOP_SECURE_DN_USER=yarn
YARN_NODEMANAGER_USER=root
如下图2.16所示:
图2.16
配置文件分发:
scp /opt/hadoop/etc/hadoop/workers root@datanode-2:/opt/hadoop/etc/hadoop
scp /opt/hadoop/etc/hadoop/workers root@datanode-3:/opt/hadoop/etc/hadoop
scp /opt/hadoop/sbin/start-dfs.sh root@datanode-2:/opt/hadoop/sbin
scp /opt/hadoop/sbin/start-dfs.sh root@datanode-3:/opt/hadoop/sbin
scp /opt/hadoop/sbin/stop-dfs.sh root@datanode-2:/opt/hadoop/sbin
scp /opt/hadoop/sbin/stop-dfs.sh root@datanode-3:/opt/hadoop/sbin
scp /opt/hadoop/sbin/start-yarn.sh root@datanode-2:/opt/hadoop/sbin
scp /opt/hadoop/sbin/start-yarn.sh root@datanode-3:/opt/hadoop/sbin
scp /opt/hadoop/sbin/stop-yarn.sh root@datanode-2:/opt/hadoop/sbin
scp /opt/hadoop/sbin/stop-yarn.sh root@datanode-3:/opt/hadoop/sbin
通过ssh分别登陆datanode-1、datanode-2、datanode-3,jps命令显示的Java进程中,除了保留ZooKeeper进程之外,其他全部Kill:
jps |grep -v 'QuorumPeerMain\|Jps'|awk '{print $1}'|xargs kill -9
6. 启动与验证
1) 启动HDFS
登陆datanode-1节点,执行HDFS集群启动:
start-dfs.sh
如下图2.17所示,NameNode高可用[datanode-1、datanode-2],Journal集群[datanode-1、datanode-2、datanode-3],ZKFC服务[datanode-1、datanode-2]全部正常启动。
图2.17
我们分别登陆三个节点,用jps验证包括DataNode进程是否正常启动,如下图2.18所示:
图2.18
HDFS进程列表:
datanode-1 | NameNode、DFSZKFailoverController、QuorumPeerMain、DataNode、JournalNode |
datanode-2 | NameNode、DFSZKFailoverController、QuorumPeerMain、DataNode、JournalNode |
datanode-3 | QuorumPeerMain、DataNode、JournalNode |
2) 启动YARN
重返datanode-1节点,执行YARN集群启动:
start-yarn.sh
如下图2.19所示,ResourceManager高可用[datanode-1、datanode-2],各个节点NodeManager正常启动:
图2.19
我们分别登陆三个节点,用jps验证,如下图2.20所示:
图2.20
启动工作任务记录服务:
mapred --daemon start historyserver
在datanode-1节点启动了JobHistoryServer进程,如下图2.21所示:
图2.21
至此,Hadoop安装已经结束。
3) 验证HDFS
我们做一个简单的HDFS验证:
hdfs dfs -mkdir /sdk
hdfs dfs -put jdk-8u311-linux-x64.tar.gz /sdk
hdfs dfs -ls /sdk
我们为HDFS根目录创建了sdk子目录,并上传JDK包,查看sdk目录,如下图2.22所示:
图2.22
我们再看看HDFS界面管理端,如下图2.23是sdk上传的目录:
图2.23
下图2.24是HDFS管理端监控的三个数据节点[datanode-1、datanode-2、datanode-3]。
图2.24
3) 验证YARN
我们编写一个MapReduce样例程序来验证Yarn系统是否正常。
我们的目标是:将一组三份存有数字的乱序文件通过MapRedue程序排序计数后输出,特点是三个Map任务的输出经过混洗排序后,通过自定义分区划分的范围,分别交给三个Reduce进行计数,并输出给三个排序过的文件。
分区划分:小于数字500一组、大于等于500并小于1000一组,大于等于1000一组。
如下图2.25所示的三份乱序文件
图2.25
如下图2.26所示,MapReduce排序后的三份计数后的文件。
图2.26
我们先将三份乱序文件上传到HDFS:
hdfs dfs -put file* /example/simple1/sort/input
hdfs dfs -ls /example/simple1/sort/input
如下图2.27所示
图2.27
我们执行打包好的MR测试程序:
hadoop jar HadoopTrainer-1.0-SNAPSHOT.jar
如下图2.28所示,展示了MR整个执行日志输出过程,红色箭头指向的任务为:
job: job_1640683809954_0003,我们可以在Yarn管理端查看此任务日志。
图2.28
我们从图中可以看到Map任务为3个,Reduce任务为3个。
图2.29
客户端打开Yarn管理端需要将IP和节点名加入到host里面,Mac系统:
sudo vi /etc/hosts
加入IP节点名映射:
192.168.83.4 datanode-1
192.168.83.5 datanode-2
192.168.83.6 datanode-3
浏览器输入Yarn管理端地址,以下两个地址均可,Yarn启动后会确定其中一个为活动地址,若输入的是HA备份地址,会重定向到活动地址:
http://datanode-2:8088/cluster
http://datanode-1:8088/cluster
如下图2.30所示,已完成任务列表中蓝色框标注的就是刚才执行的任务job_1640683809954_0003。
图2.30
4) 结尾
ZooKeeper集群已经加入系统自启动,方便反复开关OS的学习场景。
Hadoop启动顺序:
start-dfs.sh
start-yarn.sh
mapred --daemon start historyserver
Hadoop停止顺序:
stop-yarn.sh
stop-dfs.sh
jps |grep JobHistoryServer|awk '{print $1}'|xargs kill -9
7. 结束
整个Hadoop高可用集群及相关系统的部署、配置和验证就正式结束了。Hadoop集群作为当今大数据技术的基础数据底座非常重要,尽管部署过程非常复杂,步骤特别多,不过本文尽可能对每一步都做到细致入微,目的是让初学者手把手的照着做,也能正确部署好Hadoop平台,为后续的大数据技术学习,解决一入门就遇到这个高门槛。
样例下载
链接: https://pan.baidu.com/s/1LH-seaDDICeRyuz-wNA3Tg 密码: tvcb
本文章由公众号「守护石 」出品,版权所有,未经许可,禁止转载