第3周 · Hadoop安装与配置(二)
虚拟机克隆、集群网络与时钟同步、Zookeeper 集群、完全分布式 HDFS/YARN
本实训对应的知识点
- 单元1 1.1.1 数据仓库简介 · 数据仓库基础与Hive入门
- 单元1 1.1.2 数据仓库的意义 · 数据仓库基础与Hive入门
- 单元1 1.1.3 数据仓库分层架构 · 数据仓库基础与Hive入门
- 单元1 1.1.4 数据仓库的数据模型结构 · 数据仓库基础与Hive入门
- 单元1 1.2.1 Hive概述 · 数据仓库基础与Hive入门
- 单元1 1.2.2 Hive架构 · 数据仓库基础与Hive入门
- 单元1 1.3.1 Hive的数据模型 · 数据仓库基础与Hive入门
- 单元1 1.3.2 Hive的数据类型 · 数据仓库基础与Hive入门
实训内容与步骤 依据原始实训文档整理,命令与配置均来自文档原文
1.1搭建zookeeper集群
(1)下载并解压zookeeper
到官网(地址:http://Zookeeper.apache.org/releases.html# download)下载Zookeeper稳定版本的apache-zookeeper-3.8.4-bin.tar.gz安装包,然后上传至hadoop1 节点的/home/hadoop/app目录下并解压,具体操作如下所示。
#解压Zookeeper
[hadoop@hadoop1 app]$ tar -zxvf apache-zookeeper-3.8.4-bin.tar.gz#创建Zookeeper软连接
[hadoop@hadoop1 app]$ ln -s apache-zookeeper-3.8.4-bin zookeeper(2)修改zoo.cfg配置文件
在运行 Zookeeper 服务之前,需要新建一个配置文件。这个配置文件习惯上命名为zoo.cfg,并保存在conf子目录中,其核心内容如下所示。
[hadoop@hadoop1 app]$ cd zookeeper
[hadoop@hadoop1 zookeeper]$ cd conf/
[hadoop@hadoop1 conf]$ ls
configuration.xsl logback.xml zoo_sample.cfg
[hadoop@hadoop1 conf]$ cp zoo_sample.cfg zoo.cfg
[hadoop@hadoop1 conf]$ vi zoo.cfg#数据目录需要提前创建
dataDir=/home/hadoop/data/zookeeper/zkdata#日志目录需要提前创建
dataLogDir=/home/hadoop/data/zookeeper/zkdatalog#访问端口号
clientPort=2181#server.每个节点服务编号=服务器ip地址:集群通信端口:选举端口
server.1=hadoop1:2888:3888
server.2=hadoop2:2888:3888
server.3=hadoop3:2888:3888具体操作步骤如图1-1所示。
📷 图1-1 修改zoo.cfg配置文件(3)同步zookeeper安装目录
使用scp命令将hadoop1节点的Zookeeper安装目录,整体同步到集群的hadoop2和hadoop3节点,具体操作如下所示。
方法1:使用远程拷贝命令scp,操作步骤如下。
[hadoop@hadoop1 app]$scp -r zookeeper-3.4.6 hadoop@hadoop2:/home/hadoop/app/
[hadoop@hadoop1 app]$scp -r zookeeper-3.4.6 hadoop@hadoop3:/home/hadoop/app/方法2:使用集群脚本,操作步骤如下。
[hadoop@hadoop1 app]$ deploy.sh apache-zookeeper-3.8.4-bin /home/hadoop/app/ slave然后分别在hadoop2和hadoop3节点上创建Zookeeper软连接,具体操作如下所示。
[hadoop@hadoop2 app]$ ln -s apache-zookeeper-3.8.4-bin zookeeper
[hadoop@hadoop3 app]$ ln -s apache-zookeeper-3.8.4-bin zookeeper(4)创建数据和日志目录
在集群各个节点创建Zookeeper数据目录和日志目录,需要跟zoo.cfg配置文件保持一致,具体操作如下所示。
#创建Zookeeper数据目录
方法1:三个节点分别创建。
[hadoop@hadoop1 app]$mkdir -p /home/hadoop/data/zookeeper/zkdata
[hadoop@hadoop2 app]$mkdir -p /home/hadoop/data/zookeeper/zkdata
[hadoop@hadoop3 app]$mkdir -p /home/hadoop/data/zookeeper/zkdata方法2:使用集群脚本。
[hadoop@hadoop1 ~]$ runRemoteCmd.sh 'mkdir -p /home/hadoop/data/zookeeper/zkdata' all执行效果如图1-2所示。
📷 图1-2 创建zkdata目录#创建Zookeeper日志目录
方法1:
[hadoop@hadoop1 app] mkdir -p /home/hadoop/data/zookeeper/zkdatalog
[hadoop@hadoop2 app] mkdir -p /home/hadoop/data/zookeeper/zkdatalog
[hadoop@hadoop3 app] mkdir -p /home/hadoop/data/zookeeper/zkdatalog方法2:(必须安装配置相应脚本工具)
[hadoop@hadoop1 ~]$ runRemoteCmd.sh 'mkdir -p /home/hadoop/data/zookeeper/zkdatalog' all执行效果如图1-3所示。
📷 图1-3 创建zkdatalog目录(5)创建各节点服务编号
分别在Zookeeper集群各个节点,进入/home/hadoop/data/zookeeper/zkdata目录,创建文件myid,然后分别输入服务编号,具体操作如下所示:
#hadoop1节点
[hadoop@hadoop1 zkdata]$ touch myid
[hadoop@hadoop1 zkdata]$ echo 1 > myid#hadoop2节点
[hadoop@hadoop2 zkdata]$ touch myid
[hadoop@hadoop2 zkdata]$ echo 2 > myid#hadoop3节点
[hadoop@hadoop3 zkdata]$ touch myid
[hadoop@hadoop3 zkdata]$ echo 3 > myid注意:每个节点服务编号的值是一个整形数字且不能重复。
(6)启动Zookeeper集群服务
1)在集群各个节点分别进入Zookeeper安装目录,然后使用如下命令启动Zookeeper服务。
方法1:
[hadoop@hadoop1 zookeeper]$ bin/zkServer.sh start
[hadoop@hadoop2 zookeeper]$ bin/zkServer.sh start
[hadoop@hadoop3 zookeeper]$ bin/zkServer.sh start方法2:
[hadoop@hadoop1 ~]$ runRemoteCmd.sh '/home/hadoop/app/zookeeper/bin/zkServer.sh start' all执行效果如图1-4所示。
📷 图1-4 启动zookeeper集群2)Zookeeper集群启动一会之后,通过如下命令查看Zookeeper集群状态。
方法1:
[hadoop@hadoop:1 zookeeper]$ bin/zkServer.sh status
[hadoop@hadoop2 zookeeper]$ bin/zkServer.sh status
[hadoop@hadoop3 zookeeper]$ bin/zkServer.sh status方法2:
[hadoop@hadoop1 ~]$ runRemoteCmd.sh '/home/hadoop/app/zookeeper/bin/zkServer.sh status' all执行效果如图1-5所示。
📷 图1-5 查看zookeeper集群状态如果在Zookeeper集群中,其中一个节点为leader领导者,另外两个节点是follower跟随者,说明Zookeeper集群安装部署成功。
1.2搭建完全分布式Hadoop集群
1.1.1HDFS集训搭建
(1)下载解压Hadoop
首先到官网(地址:https://archive.apache.org/dist/hadoop/common/)下载Hadoop稳定版本的安装包,然后上传至hadoop1节点下的/home/hadoop/app目录下并解压,具体操作如下所示。
[hadoop@hadoop1 app]$ tar -zxvf hadoop-3.3.1.tar.gz //解压
[hadoop@hadoop1 app]$ ln -s hadoop-3.3.1 hadoop //创建软连接
[hadoop@hadoop1 app]$ cd /home/hadoop/app/hadoop/etc/hadoop/ //切换到配置目录
(2)修改HDFS配置文件
1)修改hadoop-env.sh配置文件。hadoop-env.sh文件主要配置跟hadoop环境相关的变量,这里主要修改JAVA_HOME的安装目录,具体操作如下所示。
[hadoop@hadoop1 hadoop]$ vi hadoop-env.sh
export JAVA_HOME=/home/hadoop/app/jdk2)修改core-site.xml配置文件。core-site.xml文件主要配置hadoop的公有属性,具体需要配置的每个属性如下所示。
[hadoop@hadoop1 hadoop]$ vi core-site.xml
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://mycluster</value>
</property><!--默认的HDFS路径-->
<property>
<name>hadoop.tmp.dir</name>
<value>/home/hadoop/data/tmp</value>
</property><!--hadoop的临时目录,如果需要配置多个目录,需要逗号隔开-->
<property>
<name>ha.zookeeper.quorum</name>
<value>hadoop1:2181,hadoop2:2181,hadoop3:2181</value>
</property><!--配置Zookeeper 管理HDFS-->
</configuration>3)修改hdfs-site.xml配置文件。hdfs-site.xml文件主要配置跟HDFS相关的属性,具体需要配置的每个属性如下所示。
[hadoop@hadoop1 hadoop]$ vi hdfs-site.xml
<configuration><!-- NameNode 数据存储目录 -->
<property>
<name>dfs.namenode.name.dir</name>
<value>file:/home/hadoop/data/dfs/name</value>
</property><!-- DataNode 数据存储目录 -->
<property>
<name>dfs.datanode.data.dir</name>
<value>file:/home/hadoop/data/dfs/data</value>
</property><!-- JournalNode 数据存储目录 -->
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/home/hadoop/data/journaldata/jn</value>
</property><!-- 完全分布式集群名称 -->
<property>
<name>dfs.nameservices</name>
<value>mycluster</value>
</property><!-- 集群中 NameNode 节点都有哪些 -->
<property>
<name>dfs.ha.namenodes.mycluster</name>
<value>nn1,nn2,nn3</value>
</property><!-- NameNode 的 RPC 通信地址 -->
<property>
<name>dfs.namenode.rpc-address.mycluster.nn1</name>
<value>hadoop1:8020</value>
</property>
<property>
<name>dfs.namenode.rpc-address.mycluster.nn2</name>
<value>hadoop2:8020</value>
</property>
<property>
<name>dfs.namenode.rpc-address.mycluster.nn3</name>
<value>hadoop3:8020</value>
</property><!-- NameNode 的 http 通信地址 -->
<property>
<name>dfs.namenode.http-address.mycluster.nn1</name>
<value>hadoop1:9870</value>
</property>
<property>
<name>dfs.namenode.http-address.mycluster.nn2</name>
<value>hadoop2:9870</value>
</property>
<property>
<name>dfs.namenode.http-address.mycluster.nn3</name>
<value>hadoop3:9870</value>
</property><!-- 指定 NameNode 元数据在 JournalNode 上的存放位置 -->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://hadoop1:8485;hadoop2:8485;hadoop3:8485/mycluster</value>
</property><!-- 访问代理类:client 用于确定哪个 NameNode 为 Active -->
<property>
<name>dfs.client.failover.proxy.provider.mycluster</name> <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property><!-- 配置隔离机制,即同一时刻只能有一台服务器对外响应 -->
<property>
<name>dfs.ha.fencing.methods</name>
<value>sshfence</value>
</property><!-- 使用隔离机制时需要 ssh 秘钥登录-->
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/home/hadoop/.ssh/id_rsa</value>
</property><!-- 启用 nn 故障自动转移 -->
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
<property>
<name>dfs.permissions.enabled</name>
<value>false</value>
</property>
</configuration>4)配置workers文件。workers文件是根据集群规划配置DataNode节点所在的主机名,具体操作如下所示。
[hadoop@hadoop1 hadoop]$ vi workershadoop1
hadoop2
hadoop3
5)向所有节点远程复制Hadoop安装目录。在hadoop1节点,切换到/home/hadoop/app目录下,将Hadoop安装目录远程复制到hadoop2和hadoop3节点,具体操作如下两种方法:
方法1:
[hadoop@hadoop1 app]$scp -r hadoop-3.3.1 hadoop@hadoop2:/home/hadoop/app/
[hadoop@hadoop1 app]$scp -r hadoop-3.3.1 hadoop@hadoop3:/home/hadoop/app/方法2:
[hadoop@hadoop1 hadoop]$ deploy.sh /home/hadoop/app/hadoop-3.3.1 /home/hadoop/app slave然后在hadoop2和hadoop3节点上分别创建软连接,具体操作如下所示。
[hadoop@hadoop2 app]$ ln -s hadoop-3.3.1 hadoop
[hadoop@hadoop3 app]$ ln -s hadoop-3.3.1 hadoop备注:复制前删除使用rm -rf hadoop hadoop-3.3.1命令hadoop1、hadoop2上的hadoop hadoop-3.3.1目录
1.1.2启动HDFS集群服务
(1)启动Zookeeper集群
在集群所有节点分别启动Zookeeper服务,具体操作如下所示。
方法1:分别在三个节点启动。
[hadoop@hadoop1 zookeeper]$ bin/zkServer.sh start
[hadoop@hadoop2 zookeeper]$ bin/zkServer.sh start
[hadoop@hadoop3 zookeeper]$ bin/zkServer.sh start方法2:使用远程执行脚本。
[hadoop@hadoop1 hadoop]$ runRemoteCmd.sh '/home/hadoop/app/zookeeper/bin/zkServer.sh start ' all(2)启动Journalnode集群
在集群所有节点分别启动Journalnode服务,具体操作如下所示。
方法1:分别在三个节点启动。
[hadoop@hadoop1 hadoop]$sbin/hadoop-daemon.sh start journalnode
[hadoop@hadoop2 hadoop]$sbin/hadoop-daemon.sh start journalnode
[hadoop@hadoop3 hadoop]$sbin/hadoop-daemon.sh start journalnode方法2:使用远程执行脚本。
[hadoop@hadoop1 hadoop]$ runRemoteCmd.sh '/home/hadoop/app/hadoop/sbin/hadoop-daemon.sh start journalnode' all(3)格式化主节点NameNode
在hadoop1节点(NameNode主节点)上,使用如下命令对NameNode进行格式化。
[hadoop@hadoop1 hadoop]$ bin/hdfs namenode -format / /n amenode 格式化
[hadoop@hadoop1 hadoop]$ bin/hdfs zkfc -formatZK //格式化高可用
[hadoop@hadoop1 hadoop]$bin/hdfs namenode //启动namenode
(4)备用NameNode同步主节点元数据
在hadoop1节点启动NameNode服务的同时,需要在hadoop2,hadoop3节点(NameNode备用节点)上执行如下命令同步主节点的元数据。
[hadoop@hadoop2 hadoop]$ bin/hdfs namenode -bootstrapStandby
[hadoop@hadoop3 hadoop]$ bin/hdfs namenode -bootstrapStandby(5)关闭Journalnode集群
hadoop2节点同步完主节点元数据之后,紧接着在hadoop1节点上,按下〈Ctrl+C〉组合键来结束NameNode进程,然后关闭所有节点上面的Journalnode进程,具体操作如下所示。
[hadoop@hadoop1 hadoop]$sbin/hadoop-daemon.sh stop journalnode
[hadoop@hadoop2 hadoop]$ sbin/hadoop-daemon.sh stop journalnode
[hadoop@hadoop3 hadoop]$ sbin/hadoop-daemon.sh stop journalnode(6)一键启动HDFS集群
如果上面操作没有问题,在hadoop1节点上,可以使用脚本一键启动HDFS集群所有相关进程,具体操作下所示。
[hadoop@hadoop1 hadoop]$ sbin/start-dfs.sh注意:第一次安装HDFS需要对NameNode进行格式化,HDFS集群安装成功之后,以后使用start-dfs.sh脚本一键启动HDFS集群的所有进程即可。
1.1.3HDFS集群测试
在浏览器中分别输入网址http://hadoop1:9870,以及http://hadoop3:9870通过 Web 界面查看hadoop1、hadoop3节点的NameNode的状态,结果如图1-6所示。该节点的状态为standby,表示HDFS不能通过hadoop1节点的NameNode对外提供服务。
📷 图1-6 standby状态的NameNode界面在浏览器中输入网址http://hadoop2:9870,通过Web界面查看hadoop2节点的NameNode的状态,结果如图2-54所示。该节点的状态为active,表示hadoop2节点的NameNode可以对外提供服务。
📷 图1-7 active状态的NameNode界面注意:某一时刻只能有一个NameNode节点处于active状态。
在hadoop1节点的/home/hadoop/app/hadoop目录下创建words.log文件,然后上传至 HDFS文件系统的/test目录下,检查 HDFS是否能正常使用,具体操作如下:
#本地新建words.log文件
[hadoop@hadoop1 hadoop]$ vi words.log
hadoop hadoop hadoop
spark spark spark
flink flink flink
[hadoop@hadoop1 hadoop]$ hdfs dfs -mkdir /test#上传本地文件words.log
[hadoop@hadoop1 hadoop]$ hdfs dfs -put words.log /test#查看words.log是否上传成功
[hadoop@hadoop1 hadoop]$ hdfs dfs -ls /test/test/words.log
如果上面操作没有异常,说明HDFS分布式集群搭建成功。
1.1.4YARN集群配置
(1)修改 mapred-site.xml配置文件
mapred-site.xml 文件主要配置跟 MapReduce 相关的属性,这里主要将MapReduce的运行环境指定为YARN,核心配置如下所示。
[hadoop@hadoop1 hadoop]$ vi mapred-site.xml
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value><!--指定运行mapreduce的环境为YARN-->
</property>
</configuration>(2)修改 yarn-site.xml配置文件
yarn-site.xml 文件主要配置跟YARN 相关的属性,核心配置如下所示。
[hadoop@hadoop1 hadoop]$ vi yarn-site.xml
<configuration>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property><!-- 启用 resourcemanager ha -->
<property>
<name>yarn.resourcemanager.ha.enabled</name>
<value>true</value>
</property><!-- 声明两台 resourcemanager 的地址 -->
<property>
<name>yarn.resourcemanager.cluster-id</name>
<value>cluster-yarn1</value>
</property><!--指定 resourcemanager 的逻辑列表-->
<property>
<name>yarn.resourcemanager.ha.rm-ids</name>
<value>rm1,rm2,rm3</value>
</property><!-- ========== rm1 的配置 ========== -->
<!-- 指定 rm1 的主机名 -->
<property>
<name>yarn.resourcemanager.hostname.rm1</name>
<value>hadoop1</value>
</property><!-- 指定 rm1 的 web 端地址 -->
<property>
<name>yarn.resourcemanager.webapp.address.rm1</name>
<value>hadoop1:8088</value>
</property><!-- 指定 rm1 的内部通信地址 -->
<property>
<name>yarn.resourcemanager.address.rm1</name>
<value>hadoop1:8032</value>
</property><!-- 指定 AM 向 rm1 申请资源的地址 -->
<property>
<name>yarn.resourcemanager.scheduler.address.rm1</name>
<value>hadoop1:8030</value>
</property><!-- 指定供 NM 连接的地址 -->
<property>
<name>yarn.resourcemanager.resource-tracker.address.rm1</name>
<value>hadoop1:8031</value>
</property><!-- ========== rm2 的配置 ========== -->
<!-- 指定 rm2 的主机名 -->
<property>
<name>yarn.resourcemanager.hostname.rm2</name>
<value>hadoop2</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.address.rm2</name>
<value>hadoop2:8088</value>
</property>
<property>
<name>yarn.resourcemanager.address.rm2</name>
<value>hadoop2:8032</value>
</property>
<property>
<name>yarn.resourcemanager.scheduler.address.rm2</name>
<value>hadoop2:8030</value>
</property>
<property>
<name>yarn.resourcemanager.resource-tracker.address.rm2</name>
<value>hadoop2:8031</value>
</property><!-- ========== rm3 的配置 ========== -->
<!-- 指定 rm3 的主机名 -->
<property>
<name>yarn.resourcemanager.hostname.rm3</name>
<value>hadoop3</value>
</property><!-- 指定 rm3 的 web 端地址 -->
<property>
<name>yarn.resourcemanager.webapp.address.rm3</name>
<value>hadoop3:8088</value>
</property><!-- 指定 rm1 的内部通信地址 -->
<property>
<name>yarn.resourcemanager.address.rm3</name>
<value>hadoop3:8032</value>
</property><!-- 指定 AM 向 rm1 申请资源的地址 -->
<property>
<name>yarn.resourcemanager.scheduler.address.rm3</name>
<value>hadoop3:8030</value>
</property><!-- 指定供 NM 连接的地址 -->
<property>
<name>yarn.resourcemanager.resource-tracker.address.rm3</name>
<value>hadoop3:8031</value>
</property><!-- 指定 zookeeper 集群的地址 -->
<property>
<name>yarn.resourcemanager.zk-address</name>
<value>hadoop1:2181,hadoop2:2181,hadoop3:2181</value>
</property><!-- 启用自动恢复 -->
<property>
<name>yarn.resourcemanager.recovery.enabled</name>
<value>true</value>
</property><!-- 指定 resourcemanager 的状态信息存储在 zookeeper 集群 -->
<property>
<name>yarn.resourcemanager.store.class</name>
<value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value>
</property><!-- 环境变量的继承 -->
<property>
<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>
</configuration>(3)向所有节点同步YARN配置文件
在hadoop1节点上修改完YARN相关配置之后,将修改的配置文件远程复制到hadoop2节点和hadoop3节点,具体操作如下所示。
#将 mapred-site.xml文件远程复制到hadoop2和hadoop3节点
方法1:
[hadoop@hadoop1 hadoop]$scp -r mapred-site.xml hadoop@hadoop2:/home/hadoop/app/hadoop/etc/hadoop
[hadoop@hadoop1 hadoop]$scp -r mapred-site.xml hadoop@hadoop3:/home/hadoop/app/hadoop/etc/hadoop方法2:
[hadoop@hadoop1 hadoop]$ deploy.sh mapred-site.xml /home/hadoop/app/hadoop/etc/hadoop/ slave#将yarn-site.xml文件远程复制到hadoop2和hadoop3节点
方法1:
[hadoop@hadoop1 hadoop]$scp -r yarn-site.xml hadoop@hadoop2:/home/hadoop/app/hadoop/etc/hadoop
[hadoop@hadoop1 hadoop]$scp -r yarn-site.xml hadoop@hadoop3:/home/hadoop/app/hadoop/etc/hadoop方法2:
[hadoop@hadoop1 hadoop]$ deploy.sh yarn-site.xml /home/hadoop/app/hadoop/etc/hadoop/ slave1.1.5启动YARN集群服务
YARN HA的实现依赖于Zookeeper,所以需要优先启动Zookeeper集群。因为前面操作已经启动Zookeeper集群,所以该步骤可以跳过。
启动YARN集群
在hadoop1节点上,使用脚本一键启动YARN集群,具体操作如下所示。
[hadoop@hadoop1 hadoop]$ sbin/start-yarn.sh1.1.6YARN集群测试
(1)Web界面查看YARN集群
在浏览器中输入网址http://hadoop1:8088(或者http://hadoop2:8088;http://hadoop3:8088),通过 Web 界面查看YARN集群信息,结果如图1-8所示。
📷 图1-8 Web界面查看YARN集群(2)YARN集群测试
为了测试YARN集群是否可以正常运行MapReduce程序,我们以Hadoop自带的wordcount示例来进行演示,具体操作如图1-9所示。
📷 图1-9 YARN集群运行wordcount[hadoop@hadoop1 hadoop]$ bin/yarn jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.1.jar wordcount /test/words.log /test/outMapReduce作业在YARN集群执行状态结果,如图1-10所示。
📷 图1-10 MapReduce作业运行状态如果上述操作没有异常,最终作业的状态信息显示为SUCCEEDED,就说明MapReduce程序在YARN集群上面运行成功,从而说明Hadoop分布式集群已经全部搭建成功。
通过命令查询执行结果:
[hadoop@hadoop1 hadoop]$ bin/hdfs dfs -cat /test/out/*执行结果如图1-11所示。
📷 图1-11MapReduce作业运行结果II
📄 展开原始文档全文(437 段)
Hadoop安装与配置(二)
1.1搭建zookeeper集群
(1)下载并解压zookeeper
到官网(地址:http://Zookeeper.apache.org/releases.html# download)下载Zookeeper稳定版本的apache-zookeeper-3.8.4-bin.tar.gz安装包,然后上传至hadoop1 节点的/home/hadoop/app目录下并解压,具体操作如下所示。
#解压Zookeeper
[hadoop@hadoop1 app]$ tar -zxvf apache-zookeeper-3.8.4-bin.tar.gz
#创建Zookeeper软连接
[hadoop@hadoop1 app]$ ln -s apache-zookeeper-3.8.4-bin zookeeper
(2)修改zoo.cfg配置文件
在运行 Zookeeper 服务之前,需要新建一个配置文件。这个配置文件习惯上命名为zoo.cfg,并保存在conf子目录中,其核心内容如下所示。
[hadoop@hadoop1 app]$ cd zookeeper
[hadoop@hadoop1 zookeeper]$ cd conf/
[hadoop@hadoop1 conf]$ ls
configuration.xsl logback.xml zoo_sample.cfg
[hadoop@hadoop1 conf]$ cp zoo_sample.cfg zoo.cfg
[hadoop@hadoop1 conf]$ vi zoo.cfg
#数据目录需要提前创建
dataDir=/home/hadoop/data/zookeeper/zkdata
#日志目录需要提前创建
dataLogDir=/home/hadoop/data/zookeeper/zkdatalog
#访问端口号
clientPort=2181
#server.每个节点服务编号=服务器ip地址:集群通信端口:选举端口
server.1=hadoop1:2888:3888
server.2=hadoop2:2888:3888
server.3=hadoop3:2888:3888
具体操作步骤如图1-1所示。
📷 图1-1 修改zoo.cfg配置文件
(3)同步zookeeper安装目录
使用scp命令将hadoop1节点的Zookeeper安装目录,整体同步到集群的hadoop2和hadoop3节点,具体操作如下所示。
方法1:使用远程拷贝命令scp,操作步骤如下。
[hadoop@hadoop1 app]$scp -r zookeeper-3.4.6 hadoop@hadoop2:/home/hadoop/app/
[hadoop@hadoop1 app]$scp -r zookeeper-3.4.6 hadoop@hadoop3:/home/hadoop/app/
方法2:使用集群脚本,操作步骤如下。
[hadoop@hadoop1 app]$ deploy.sh apache-zookeeper-3.8.4-bin /home/hadoop/app/ slave
然后分别在hadoop2和hadoop3节点上创建Zookeeper软连接,具体操作如下所示。
[hadoop@hadoop2 app]$ ln -s apache-zookeeper-3.8.4-bin zookeeper
[hadoop@hadoop3 app]$ ln -s apache-zookeeper-3.8.4-bin zookeeper
(4)创建数据和日志目录
在集群各个节点创建Zookeeper数据目录和日志目录,需要跟zoo.cfg配置文件保持一致,具体操作如下所示。
#创建Zookeeper数据目录
方法1:三个节点分别创建。
[hadoop@hadoop1 app]$mkdir -p /home/hadoop/data/zookeeper/zkdata
[hadoop@hadoop2 app]$mkdir -p /home/hadoop/data/zookeeper/zkdata
[hadoop@hadoop3 app]$mkdir -p /home/hadoop/data/zookeeper/zkdata
方法2:使用集群脚本。
[hadoop@hadoop1 ~]$ runRemoteCmd.sh 'mkdir -p /home/hadoop/data/zookeeper/zkdata' all
执行效果如图1-2所示。
📷 图1-2 创建zkdata目录
#创建Zookeeper日志目录
方法1:
[hadoop@hadoop1 app] mkdir -p /home/hadoop/data/zookeeper/zkdatalog
[hadoop@hadoop2 app] mkdir -p /home/hadoop/data/zookeeper/zkdatalog
[hadoop@hadoop3 app] mkdir -p /home/hadoop/data/zookeeper/zkdatalog
方法2:(必须安装配置相应脚本工具)
[hadoop@hadoop1 ~]$ runRemoteCmd.sh 'mkdir -p /home/hadoop/data/zookeeper/zkdatalog' all
执行效果如图1-3所示。
📷 图1-3 创建zkdatalog目录
(5)创建各节点服务编号
分别在Zookeeper集群各个节点,进入/home/hadoop/data/zookeeper/zkdata目录,创建文件myid,然后分别输入服务编号,具体操作如下所示:
#hadoop1节点
[hadoop@hadoop1 zkdata]$ touch myid
[hadoop@hadoop1 zkdata]$ echo 1 > myid
#hadoop2节点
[hadoop@hadoop2 zkdata]$ touch myid
[hadoop@hadoop2 zkdata]$ echo 2 > myid
#hadoop3节点
[hadoop@hadoop3 zkdata]$ touch myid
[hadoop@hadoop3 zkdata]$ echo 3 > myid
注意:每个节点服务编号的值是一个整形数字且不能重复。
(6)启动Zookeeper集群服务
1)在集群各个节点分别进入Zookeeper安装目录,然后使用如下命令启动Zookeeper服务。
方法1:
[hadoop@hadoop1 zookeeper]$ bin/zkServer.sh start
[hadoop@hadoop2 zookeeper]$ bin/zkServer.sh start
[hadoop@hadoop3 zookeeper]$ bin/zkServer.sh start
方法2:
[hadoop@hadoop1 ~]$ runRemoteCmd.sh '/home/hadoop/app/zookeeper/bin/zkServer.sh start' all
执行效果如图1-4所示。
📷 图1-4 启动zookeeper集群
2)Zookeeper集群启动一会之后,通过如下命令查看Zookeeper集群状态。
方法1:
[hadoop@hadoop:1 zookeeper]$ bin/zkServer.sh status
[hadoop@hadoop2 zookeeper]$ bin/zkServer.sh status
[hadoop@hadoop3 zookeeper]$ bin/zkServer.sh status
方法2:
[hadoop@hadoop1 ~]$ runRemoteCmd.sh '/home/hadoop/app/zookeeper/bin/zkServer.sh status' all
执行效果如图1-5所示。
📷 图1-5 查看zookeeper集群状态
如果在Zookeeper集群中,其中一个节点为leader领导者,另外两个节点是follower跟随者,说明Zookeeper集群安装部署成功。
1.2搭建完全分布式Hadoop集群
1.1.1 HDFS集训搭建
(1)下载解压Hadoop
首先到官网(地址:https://archive.apache.org/dist/hadoop/common/)下载Hadoop稳定版本的安装包,然后上传至hadoop1节点下的/home/hadoop/app目录下并解压,具体操作如下所示。
[hadoop@hadoop1 app]$ tar -zxvf hadoop-3.3.1.tar.gz //解压
[hadoop@hadoop1 app]$ ln -s hadoop-3.3.1 hadoop //创建软连接
[hadoop@hadoop1 app]$ cd /home/hadoop/app/hadoop/etc/hadoop/ //切换到配置目录
(2)修改HDFS配置文件
1)修改hadoop-env.sh配置文件。hadoop-env.sh文件主要配置跟hadoop环境相关的变量,这里主要修改JAVA_HOME的安装目录,具体操作如下所示。
[hadoop@hadoop1 hadoop]$ vi hadoop-env.sh
export JAVA_HOME=/home/hadoop/app/jdk
2)修改core-site.xml配置文件。core-site.xml文件主要配置hadoop的公有属性,具体需要配置的每个属性如下所示。
[hadoop@hadoop1 hadoop]$ vi core-site.xml
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://mycluster</value>
</property>
<!--默认的HDFS路径-->
<property>
<name>hadoop.tmp.dir</name>
<value>/home/hadoop/data/tmp</value>
</property>
<!--hadoop的临时目录,如果需要配置多个目录,需要逗号隔开-->
<property>
<name>ha.zookeeper.quorum</name>
<value>hadoop1:2181,hadoop2:2181,hadoop3:2181</value>
</property>
<!--配置Zookeeper 管理HDFS-->
</configuration>
3)修改hdfs-site.xml配置文件。hdfs-site.xml文件主要配置跟HDFS相关的属性,具体需要配置的每个属性如下所示。
[hadoop@hadoop1 hadoop]$ vi hdfs-site.xml
<configuration>
<!-- NameNode 数据存储目录 -->
<property>
<name>dfs.namenode.name.dir</name>
<value>file:/home/hadoop/data/dfs/name</value>
</property>
<!-- DataNode 数据存储目录 -->
<property>
<name>dfs.datanode.data.dir</name>
<value>file:/home/hadoop/data/dfs/data</value>
</property>
<!-- JournalNode 数据存储目录 -->
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/home/hadoop/data/journaldata/jn</value>
</property>
<!-- 完全分布式集群名称 -->
<property>
<name>dfs.nameservices</name>
<value>mycluster</value>
</property>
<!-- 集群中 NameNode 节点都有哪些 -->
<property>
<name>dfs.ha.namenodes.mycluster</name>
<value>nn1,nn2,nn3</value>
</property>
<!-- NameNode 的 RPC 通信地址 -->
<property>
<name>dfs.namenode.rpc-address.mycluster.nn1</name>
<value>hadoop1:8020</value>
</property>
<property>
<name>dfs.namenode.rpc-address.mycluster.nn2</name>
<value>hadoop2:8020</value>
</property>
<property>
<name>dfs.namenode.rpc-address.mycluster.nn3</name>
<value>hadoop3:8020</value>
</property>
<!-- NameNode 的 http 通信地址 -->
<property>
<name>dfs.namenode.http-address.mycluster.nn1</name>
<value>hadoop1:9870</value>
</property>
<property>
<name>dfs.namenode.http-address.mycluster.nn2</name>
<value>hadoop2:9870</value>
</property>
<property>
<name>dfs.namenode.http-address.mycluster.nn3</name>
<value>hadoop3:9870</value>
</property>
<!-- 指定 NameNode 元数据在 JournalNode 上的存放位置 -->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://hadoop1:8485;hadoop2:8485;hadoop3:8485/mycluster</value>
</property>
<!-- 访问代理类:client 用于确定哪个 NameNode 为 Active -->
<property>
<name>dfs.client.failover.proxy.provider.mycluster</name> <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<!-- 配置隔离机制,即同一时刻只能有一台服务器对外响应 -->
<property>
<name>dfs.ha.fencing.methods</name>
<value>sshfence</value>
</property>
<!-- 使用隔离机制时需要 ssh 秘钥登录-->
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/home/hadoop/.ssh/id_rsa</value>
</property>
<!-- 启用 nn 故障自动转移 -->
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
<property>
<name>dfs.permissions.enabled</name>
<value>false</value>
</property>
</configuration>
4)配置workers文件。workers文件是根据集群规划配置DataNode节点所在的主机名,具体操作如下所示。
[hadoop@hadoop1 hadoop]$ vi workers
hadoop1
hadoop2
hadoop3
5)向所有节点远程复制Hadoop安装目录。在hadoop1节点,切换到/home/hadoop/app目录下,将Hadoop安装目录远程复制到hadoop2和hadoop3节点,具体操作如下两种方法:
方法1:
[hadoop@hadoop1 app]$scp -r hadoop-3.3.1 hadoop@hadoop2:/home/hadoop/app/
[hadoop@hadoop1 app]$scp -r hadoop-3.3.1 hadoop@hadoop3:/home/hadoop/app/
方法2:
[hadoop@hadoop1 hadoop]$ deploy.sh /home/hadoop/app/hadoop-3.3.1 /home/hadoop/app slave
然后在hadoop2和hadoop3节点上分别创建软连接,具体操作如下所示。
[hadoop@hadoop2 app]$ ln -s hadoop-3.3.1 hadoop
[hadoop@hadoop3 app]$ ln -s hadoop-3.3.1 hadoop
备注:复制前删除使用rm -rf hadoop hadoop-3.3.1命令hadoop1、hadoop2上的hadoop hadoop-3.3.1目录
1.1.2 启动HDFS集群服务
(1)启动Zookeeper集群
在集群所有节点分别启动Zookeeper服务,具体操作如下所示。
方法1:分别在三个节点启动。
[hadoop@hadoop1 zookeeper]$ bin/zkServer.sh start
[hadoop@hadoop2 zookeeper]$ bin/zkServer.sh start
[hadoop@hadoop3 zookeeper]$ bin/zkServer.sh start
方法2:使用远程执行脚本。
[hadoop@hadoop1 hadoop]$ runRemoteCmd.sh '/home/hadoop/app/zookeeper/bin/zkServer.sh start ' all
(2)启动Journalnode集群
在集群所有节点分别启动Journalnode服务,具体操作如下所示。
方法1:分别在三个节点启动。
[hadoop@hadoop1 hadoop]$sbin/hadoop-daemon.sh start journalnode
[hadoop@hadoop2 hadoop]$sbin/hadoop-daemon.sh start journalnode
[hadoop@hadoop3 hadoop]$sbin/hadoop-daemon.sh start journalnode
方法2:使用远程执行脚本。
[hadoop@hadoop1 hadoop]$ runRemoteCmd.sh '/home/hadoop/app/hadoop/sbin/hadoop-daemon.sh start journalnode' all
(3)格式化主节点NameNode
在hadoop1节点(NameNode主节点)上,使用如下命令对NameNode进行格式化。
[hadoop@hadoop1 hadoop]$ bin/hdfs namenode -format / /n amenode 格式化
[hadoop@hadoop1 hadoop]$ bin/hdfs zkfc -formatZK //格式化高可用
[hadoop@hadoop1 hadoop]$bin/hdfs namenode //启动namenode
(4)备用NameNode同步主节点元数据
在hadoop1节点启动NameNode服务的同时,需要在hadoop2,hadoop3节点(NameNode备用节点)上执行如下命令同步主节点的元数据。
[hadoop@hadoop2 hadoop]$ bin/hdfs namenode -bootstrapStandby
[hadoop@hadoop3 hadoop]$ bin/hdfs namenode -bootstrapStandby
(5)关闭Journalnode集群
hadoop2节点同步完主节点元数据之后,紧接着在hadoop1节点上,按下〈Ctrl+C〉组合键来结束NameNode进程,然后关闭所有节点上面的Journalnode进程,具体操作如下所示。
[hadoop@hadoop1 hadoop]$sbin/hadoop-daemon.sh stop journalnode
[hadoop@hadoop2 hadoop]$ sbin/hadoop-daemon.sh stop journalnode
[hadoop@hadoop3 hadoop]$ sbin/hadoop-daemon.sh stop journalnode
(6)一键启动HDFS集群
如果上面操作没有问题,在hadoop1节点上,可以使用脚本一键启动HDFS集群所有相关进程,具体操作下所示。
[hadoop@hadoop1 hadoop]$ sbin/start-dfs.sh
注意:第一次安装HDFS需要对NameNode进行格式化,HDFS集群安装成功之后,以后使用start-dfs.sh脚本一键启动HDFS集群的所有进程即可。
1.1.3 HDFS集群测试
在浏览器中分别输入网址http://hadoop1:9870,以及http://hadoop3:9870通过 Web 界面查看hadoop1、hadoop3节点的NameNode的状态,结果如图1-6所示。该节点的状态为standby,表示HDFS不能通过hadoop1节点的NameNode对外提供服务。
📷 图1-6 standby状态的NameNode界面
在浏览器中输入网址http://hadoop2:9870,通过Web界面查看hadoop2节点的NameNode的状态,结果如图2-54所示。该节点的状态为active,表示hadoop2节点的NameNode可以对外提供服务。
📷 图1-7 active状态的NameNode界面
注意:某一时刻只能有一个NameNode节点处于active状态。
在hadoop1节点的/home/hadoop/app/hadoop目录下创建words.log文件,然后上传至 HDFS文件系统的/test目录下,检查 HDFS是否能正常使用,具体操作如下:
#本地新建words.log文件
[hadoop@hadoop1 hadoop]$ vi words.log
hadoop hadoop hadoop
spark spark spark
flink flink flink
[hadoop@hadoop1 hadoop]$ hdfs dfs -mkdir /test
#上传本地文件words.log
[hadoop@hadoop1 hadoop]$ hdfs dfs -put words.log /test
#查看words.log是否上传成功
[hadoop@hadoop1 hadoop]$ hdfs dfs -ls /test
/test/words.log
如果上面操作没有异常,说明HDFS分布式集群搭建成功。
1.1.4 YARN集群配置
(1)修改 mapred-site.xml配置文件
mapred-site.xml 文件主要配置跟 MapReduce 相关的属性,这里主要将MapReduce的运行环境指定为YARN,核心配置如下所示。
[hadoop@hadoop1 hadoop]$ vi mapred-site.xml
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
<!--指定运行mapreduce的环境为YARN-->
</property>
</configuration>
(2)修改 yarn-site.xml配置文件
yarn-site.xml 文件主要配置跟YARN 相关的属性,核心配置如下所示。
[hadoop@hadoop1 hadoop]$ vi yarn-site.xml
<configuration>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<!-- 启用 resourcemanager ha -->
<property>
<name>yarn.resourcemanager.ha.enabled</name>
<value>true</value>
</property>
<!-- 声明两台 resourcemanager 的地址 -->
<property>
<name>yarn.resourcemanager.cluster-id</name>
<value>cluster-yarn1</value>
</property>
<!--指定 resourcemanager 的逻辑列表-->
<property>
<name>yarn.resourcemanager.ha.rm-ids</name>
<value>rm1,rm2,rm3</value>
</property>
<!-- ========== rm1 的配置 ========== -->
<!-- 指定 rm1 的主机名 -->
<property>
<name>yarn.resourcemanager.hostname.rm1</name>
<value>hadoop1</value>
</property>
<!-- 指定 rm1 的 web 端地址 -->
<property>
<name>yarn.resourcemanager.webapp.address.rm1</name>
<value>hadoop1:8088</value>
</property>
<!-- 指定 rm1 的内部通信地址 -->
<property>
<name>yarn.resourcemanager.address.rm1</name>
<value>hadoop1:8032</value>
</property>
<!-- 指定 AM 向 rm1 申请资源的地址 -->
<property>
<name>yarn.resourcemanager.scheduler.address.rm1</name>
<value>hadoop1:8030</value>
</property>
<!-- 指定供 NM 连接的地址 -->
<property>
<name>yarn.resourcemanager.resource-tracker.address.rm1</name>
<value>hadoop1:8031</value>
</property>
<!-- ========== rm2 的配置 ========== -->
<!-- 指定 rm2 的主机名 -->
<property>
<name>yarn.resourcemanager.hostname.rm2</name>
<value>hadoop2</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.address.rm2</name>
<value>hadoop2:8088</value>
</property>
<property>
<name>yarn.resourcemanager.address.rm2</name>
<value>hadoop2:8032</value>
</property>
<property>
<name>yarn.resourcemanager.scheduler.address.rm2</name>
<value>hadoop2:8030</value>
</property>
<property>
<name>yarn.resourcemanager.resource-tracker.address.rm2</name>
<value>hadoop2:8031</value>
</property>
<!-- ========== rm3 的配置 ========== -->
<!-- 指定 rm3 的主机名 -->
<property>
<name>yarn.resourcemanager.hostname.rm3</name>
<value>hadoop3</value>
</property>
<!-- 指定 rm3 的 web 端地址 -->
<property>
<name>yarn.resourcemanager.webapp.address.rm3</name>
<value>hadoop3:8088</value>
</property>
<!-- 指定 rm1 的内部通信地址 -->
<property>
<name>yarn.resourcemanager.address.rm3</name>
<value>hadoop3:8032</value>
</property>
<!-- 指定 AM 向 rm1 申请资源的地址 -->
<property>
<name>yarn.resourcemanager.scheduler.address.rm3</name>
<value>hadoop3:8030</value>
</property>
<!-- 指定供 NM 连接的地址 -->
<property>
<name>yarn.resourcemanager.resource-tracker.address.rm3</name>
<value>hadoop3:8031</value>
</property>
<!-- 指定 zookeeper 集群的地址 -->
<property>
<name>yarn.resourcemanager.zk-address</name>
<value>hadoop1:2181,hadoop2:2181,hadoop3:2181</value>
</property>
<!-- 启用自动恢复 -->
<property>
<name>yarn.resourcemanager.recovery.enabled</name>
<value>true</value>
</property>
<!-- 指定 resourcemanager 的状态信息存储在 zookeeper 集群 -->
<property>
<name>yarn.resourcemanager.store.class</name>
<value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value>
</property>
<!-- 环境变量的继承 -->
<property>
<name>yarn.nodemanager.env-whitelist</name>
<value>JAVA_HOME,HADOOP_COMMON_HOME,HADOOP_HDFS_HOME,HADOOP_CONF_DIR,CLAS
SPATH_PREPEND_DISTCACHE,HADOOP_YARN_HOME,HADOOP_MAPRED_HOME</value>
</property>
</configuration>
(3)向所有节点同步YARN配置文件
在hadoop1节点上修改完YARN相关配置之后,将修改的配置文件远程复制到hadoop2节点和hadoop3节点,具体操作如下所示。
#将 mapred-site.xml文件远程复制到hadoop2和hadoop3节点
方法1:
[hadoop@hadoop1 hadoop]$scp -r mapred-site.xml hadoop@hadoop2:/home/hadoop/app/hadoop/etc/hadoop
[hadoop@hadoop1 hadoop]$scp -r mapred-site.xml hadoop@hadoop3:/home/hadoop/app/hadoop/etc/hadoop
方法2:
[hadoop@hadoop1 hadoop]$ deploy.sh mapred-site.xml /home/hadoop/app/hadoop/etc/hadoop/ slave
#将yarn-site.xml文件远程复制到hadoop2和hadoop3节点
方法1:
[hadoop@hadoop1 hadoop]$scp -r yarn-site.xml hadoop@hadoop2:/home/hadoop/app/hadoop/etc/hadoop
[hadoop@hadoop1 hadoop]$scp -r yarn-site.xml hadoop@hadoop3:/home/hadoop/app/hadoop/etc/hadoop
方法2:
[hadoop@hadoop1 hadoop]$ deploy.sh yarn-site.xml /home/hadoop/app/hadoop/etc/hadoop/ slave
1.1.5 启动YARN集群服务
YARN HA的实现依赖于Zookeeper,所以需要优先启动Zookeeper集群。因为前面操作已经启动Zookeeper集群,所以该步骤可以跳过。
启动YARN集群
在hadoop1节点上,使用脚本一键启动YARN集群,具体操作如下所示。
[hadoop@hadoop1 hadoop]$ sbin/start-yarn.sh
1.1.6 YARN集群测试
(1)Web界面查看YARN集群
在浏览器中输入网址http://hadoop1:8088(或者http://hadoop2:8088;http://hadoop3:8088),通过 Web 界面查看YARN集群信息,结果如图1-8所示。
📷 图1-8 Web界面查看YARN集群
(2)YARN集群测试
为了测试YARN集群是否可以正常运行MapReduce程序,我们以Hadoop自带的wordcount示例来进行演示,具体操作如图1-9所示。
[hadoop@hadoop1 hadoop]$ bin/yarn jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.1.jar wordcount /test/words.log /test/out
📷 图1-9 YARN集群运行wordcount
MapReduce作业在YARN集群执行状态结果,如图1-10所示。
📷 图1-10 MapReduce作业运行状态
如果上述操作没有异常,最终作业的状态信息显示为SUCCEEDED,就说明MapReduce程序在YARN集群上面运行成功,从而说明Hadoop分布式集群已经全部搭建成功。
通过命令查询执行结果:
[hadoop@hadoop1 hadoop]$ bin/hdfs dfs -cat /test/out/*
执行结果如图1-11所示。
📷 图1-11MapReduce作业运行结果
II