HDFS分布式集群搭建
- 一、部署规划
-
- [1.1 进程规划](#1.1 进程规划)
- [1.2 软件规划](#1.2 软件规划)
- [1.3 用户规划](#1.3 用户规划)
- [1.4 目录规划](#1.4 目录规划)
- [二、 搭建HDFS 分布式集群](#二、 搭建HDFS 分布式集群)
-
- [2.1 HDFS 集群配置](#2.1 HDFS 集群配置)
-
- [2.1.1 下载安装 Hadoop](#2.1.1 下载安装 Hadoop)
- [2.1.2 修改 hadoop-env.sh 配置文件](#2.1.2 修改 hadoop-env.sh 配置文件)
- [2.1.3 修改 core-site.xml 配置文件](#2.1.3 修改 core-site.xml 配置文件)
- [2.1.4 修改 hdfs-site.xml 配置文件](#2.1.4 修改 hdfs-site.xml 配置文件)
- [2.1.5 修改 slaves 配置文件](#2.1.5 修改 slaves 配置文件)
- [2.1.6 配置文件同步集群其他节点](#2.1.6 配置文件同步集群其他节点)
- [2.2 启动 zookeeper 集群](#2.2 启动 zookeeper 集群)
- [2.3 启动 Journalnode 集群](#2.3 启动 Journalnode 集群)
- [2.4 格式化主节点 NameNode](#2.4 格式化主节点 NameNode)
- [2.5 备用 NameNode 同步主节点元数据](#2.5 备用 NameNode 同步主节点元数据)
- [2.6 关闭 Journalnode 集群](#2.6 关闭 Journalnode 集群)
- [2.7 一键启动 HDFS 集群](#2.7 一键启动 HDFS 集群)
- [2.8 HDFS 集群测试](#2.8 HDFS 集群测试)
- [三、部署 YARN 集群搭建](#三、部署 YARN 集群搭建)
-
- [3.1 修改 mapred-site.xml 配置](#3.1 修改 mapred-site.xml 配置)
- [3.2 修改 yarn-site.xml 配置](#3.2 修改 yarn-site.xml 配置)
- [3.3 向所有节点同步 YARN 配置文件](#3.3 向所有节点同步 YARN 配置文件)
- [3.4 启动 YARN 集群](#3.4 启动 YARN 集群)
-
- [3.4.1 启动 YARN 集群](#3.4.1 启动 YARN 集群)
- [3.4.2 启动备用 ResourceManager](#3.4.2 启动备用 ResourceManager)
- [3.5 YARN 集群测试](#3.5 YARN 集群测试)
-
- [3.5.1 shell 命令查看RM状态](#3.5.1 shell 命令查看RM状态)
- [3.5.2 Web 界面查看 YARN 集群](#3.5.2 Web 界面查看 YARN 集群)
- [3.5.3 测试 YARN 集群是否可以正常运行 MapReduce程序](#3.5.3 测试 YARN 集群是否可以正常运行 MapReduce程序)
在此之前已经搭建 ZooKeeper 集群,可以参考《部署伪分布式 Hadoop集群》
一、部署规划
1.1 进程规划
守护进程 | hadoop1/192.168.220.151 | hadoop2/192.168.220.152 | hadoop3/192.168.220.153 |
---|---|---|---|
NameNode | 是 | 是 | |
DataNode | 是 | 是 | 是 |
ResourceManager | 是 | 是 | |
NodeManager | 是 | 是 | 是 |
Journalnode | 是 | 是 | 是 |
Zookeeper | 是 | 是 | 是 |
1.2 软件规划
软件 | 版本 |
---|---|
JDK | JDK 1.8 |
CentOS | CentOS 7 |
Zookeeper | Apache Zookeeper 3.8.4 |
Hadoop | Apache Hadoop 2.10.2 |
1.3 用户规划
节点名称 | 用户组 | 用户 |
---|---|---|
hadoop1 | root | root |
hadoop1 | root | root |
hadoop1 | root | root |
备注
此处的用户组和用户 也最好自己创建用户,如 hadoop
1.4 目录规划
名称 | 路径 |
---|---|
所有软件目录 | /usr/local/ |
所有软件目录 | /usr/local/data |
二、 搭建HDFS 分布式集群
2.1 HDFS 集群配置
2.1.1 下载安装 Hadoop
可以参考文章《部署伪分布式 Hadoop集群》:2.2 章节部分
2.1.2 修改 hadoop-env.sh 配置文件
hadoop-env.sh 文件主要配置跟 hadoop 环境相关的变量,这里主要修改 JAVA_HOME的安装目录,具体操作如下所示。
bash
[root@hadoop1 hadoop]# vim /usr/local/hadoop/etc/hadoop/hadoop-env.sh
# 修改jdk 的安装目录
export JAVA_HOME=/usr/local/jdk
2.1.3 修改 core-site.xml 配置文件
core-site.xml文件主要配置 Hadoop 的公有属性,具体需要配置的每个属性如下所示。
bash
[root@hadoop1 hadoop]# vim /usr/local/hadoop/etc/hadoop/core-site.xml
修改内容如下:
powershell
<configuration>
<!--这里的值指的是默认的 HDFS 路径,取名为 mycluster-->
<property>
<name>fs.defaultFS</name>
<value>hdfs:mycluster</value>
</property>
<!--hadoop 的临时目录,目录需要我们自己创建-->
<property>
<name>hadoop.tmp.dir</name>
<value>/usr/local/data/tmp</value>
</property>
<!--配置 Zookeeper 管理 HDFS-->
<property>
<name>ha.zookeeper.quorum</name>
<value>hadoop1:2181,hadoop2:2181,hadoop3:2181</value>
</property>
</configuration>
2.1.4 修改 hdfs-site.xml 配置文件
hdfs-site.xml 文件主要配置跟 HDFS 相关的属性,具体需要配置的每个属性如下所示。
bash
[root@hadoop1 local]# vim /usr/local/hadoop/etc/hadoop/hdfs-site.xml
修改内容如下:
powershell
<configuration>
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<!--数据块副本数为3-->
<property>
<name>dfs.permissions</name>
<value>false</value>
</property>
<property>
<name>dfs.permissions.enabled</name>
<value>false</value>
</property>
<!--权限默认配置为false-->
<property>
<name>dfs.nameservices</name>
<value>mycluster</value>
</property>
<!--命名空间,它的值与fs.defaultFS的值要对应,namenode高可用之后有两个namenode,mycluster是对外提供的统一入口-->
<property>
<name>dfs.ha.namenodes.mycluster</name>
<value>nn1,nn2</value>
</property>
<!-- 指定 nameService 是 mycluster时的nameNode有哪些,这里的值也是逻辑名称,名字随便起,相互不重复即可-->
<property>
<name>dfs.namenode.rpc-address.mycluster.nn1</name>
<value>hadoop1:9000</value>
</property>
<property>
<name>dfs.namenode.http-address.mycluster.nn1</name>
<value>hadoop1:50070</value>
</property>
<property>
<name>dfs.namenode.rpc-address.mycluster.nn2</name>
<value>hadoop2:9000</value>
</property>
<property>
<name>dfs.namenode.http-address.mycluster.nn2</name>
<value>hadoop2:50070</value>
</property>
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
<!--启动故障自动恢复-->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://hadoop1:8485;hadoop2:8485;hadoop3:8485/mycluster</value>
</property>
<!--指定NameNode的元数据在JournalNode上的存放位置-->
<property>
<name>dfs.client.failover.proxy.provider.mycluster</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<!--指定 mycluster 出故障时,哪个实现类负责执行故障切换-->
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/usr/local/data/journaldata/jn</value>
</property>
<!-- 指定JournalNode在本地磁盘存放数据的位置 -->
<property>
<name>dfs.ha.fencing.methods</name>
<value>shell(/bin/true)</value>
</property>
<!-- 配置隔离机制,shell通过ssh连接active namenode节点,杀掉进程-->
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/root/.ssh/id_rsa</value>
</property>
<!-- 为了实现SSH登录杀掉进程,还需要配置免密码登录的SSH密匙信息 -->
<property>
<name>dfs.ha.fencing.ssh.connect-timeout</name>
<value>10000</value>
</property>
<property>
<name>dfs.namenode.handler.count</name>
<value>100</value>
</property>
</configuration>
2.1.5 修改 slaves 配置文件
bash
[root@hadoop1 local]# vim /usr/local/hadoop/etc/hadoop/slaves
修改如下内容:
powershell
hadoop1
hadoop2
hadoop3
2.1.6 配置文件同步集群其他节点
powershell
[root@hadoop1 local]# deploy.sh usr/local/hadoop-2.10.2 /usr/local/ slave
备注
:deploy.sh 是工具脚本,支持将 usr/local/hadoop-2.10.2 文件推送到 slave组当中的 /usr/local 目录下
2.2 启动 zookeeper 集群
powershell
[root@hadoop1 local]# runRemoteCmd.sh "/usr/local/zookeeper/bin/zkServer.sh start" all
[root@hadoop1 local]# runRemoteCmd.sh "/usr/local/zookeeper/bin/zkServer.sh status" all
备注
:runRemoteCmd.sh 是工具脚本,支持按照分组执行脚本,上面脚本表示在所有服务器执行脚本:/usr/local/zookeeper/bin/zkServer.sh start
2.3 启动 Journalnode 集群
在集群所有节点分布启动 Journalnode 服务,具体操作如下所示。
powershell
[root@hadoop1 local]# runRemoteCmd.sh "/usr/local/hadoop/sbin/hadoop-daemon.sh start journalnode" all
[root@hadoop1 local]# jps
2.4 格式化主节点 NameNode
在 hadoop1 节点(NameNode 主节点)上,使用如下命令对 NameNode 进行格式化。
powershell
[root@hadoop1 hadoop]# /usr/local/hadoop/bin/hdfs namenode -format // NameNode 格式化
[root@hadoop1 hadoop]# /usr/local/hadoop/bin/hdfs zkfc -formatZK // 格式化高可用
[root@hadoop1 hadoop]# /usr/local/hadoop/bin/hdfs namenode // 启动 namenode 节点
2.5 备用 NameNode 同步主节点元数据
在 hadoop1 节点启动 NameNode 服务的同时,需要在 hadoop2 节点(NameNode 备用节点)上执行如下命令同步主节点的元数据
javascript
[root@hadoop2 local]# /usr/local/hadoop/bin/hdfs namenode -bootstrapStandby
2.6 关闭 Journalnode 集群
hadoop2节点同步完主节点元数据之后,紧接着在hadoop1节点上,按下(Ctrl+C)组合键来结束 NameNode 进程,然后关闭所有节点上面的Jounalnode,进程,具体操作如下所示。
javascript
[root@hadoop1 local]# runRemoteCmd.sh "/usr/local/hadoop/sbin/hadoop-daemon.sh stop journalnode" all
2.7 一键启动 HDFS 集群
如果上面操作没有问题,在 hadoop1 节点上,可以使用脚本一键启动 HDFS 集群所有相关进程
javascript
[root@hadoop1 local]# /usr/local/hadoop/sbin/start-dfs.sh
2.8 HDFS 集群测试
在浏览器中输入网址 http://hadoop1:50070,通过 Web 界面査看 hadoop1 节点的NameNode 的状态,结果如图 6-2所示。该节点的状态为 active,表示 HDFS 可以通过 hadoop1节点的 NameNode 对外提供服务。
三、部署 YARN 集群搭建
3.1 修改 mapred-site.xml 配置
mapred-site.xml 文件主要配置跟 MapReduce 相关的属性,这里主要将 MapReduce 的运行环境指定为 YARN ,核心配置如下所示
javascript
[root@hadoop1 hadoop]# vim /usr/local/hadoop/etc/hadoop/mapred-site.xml
添加如下内容:
javascript
<!--MapReduce以yarn模式运行-->
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
3.2 修改 yarn-site.xml 配置
yarn-site.xml 文件主要配置跟 YARN 相关的属性,核心配置如下所示。
javascript
[root@hadoop1 hadoop]# vim /usr/local/hadoop/etc/hadoop/mapred-site.xml
添加如下内容:
javascript
<configuration>
<property>
<name>yarn.resourcemanager.connect.retry-interval.ms</name>
<value>2000</value>
</property>
<property>
<name>yarn.resourcemanager.ha.enabled</name>
<value>true</value>
</property>
<!--打开高可用-->
<property>
<name>yarn.resourcemanager.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
<!--启动故障自动恢复-->
<property>
<name>yarn.resourcemanager.ha.automatic-failover.embedded</name>
<value>true</value>
</property>
<!--rm启动内置选举active-->
<property>
<name>yarn.resourcemanager.cluster-id</name>
<value>yarn-rm-cluster</value>
</property>
<!--给yarn cluster 取个名字yarn-rm-cluster-->
<property>
<name>yarn.resourcemanager.ha.rm-ids</name>
<value>rm1,rm2</value>
</property>
<!--ResourceManager高可用 rm1,rm2-->
<property>
<name>yarn.resourcemanager.hostname.rm1</name>
<value>hadoop1</value>
</property>
<property>
<name>yarn.resourcemanager.hostname.rm2</name>
<value>hadoop2</value>
</property>
<property>
<name>yarn.resourcemanager.recovery.enabled</name>
<value>true</value>
</property>
<!--启用resourcemanager 自动恢复-->
<property>
<name>hadoop.zk.address</name>
<value>hadoop1:2181,hadoop2:2181,hadoop3:2181</value>
</property>
<!--配置Zookeeper地址作为状态存储和leader选举-->
<property>
<name>yarn.resourcemanager.address.rm1</name>
<value>hadoop1:8032</value>
</property>
<!--rm1端口号-->
<property>
<name>yarn.resourcemanager.scheduler.address.rm1</name>
<value>hadoop1:8034</value>
</property>
<!-- rm1调度器的端口号-->
<property>
<name>yarn.resourcemanager.webapp.address.rm1</name>
<value>hadoop1:8088</value>
</property>
<!-- rm1 webapp端口号-->
<property>
<name>yarn.resourcemanager.address.rm2</name>
<value>hadoop2:8032</value>
</property>
<property>
<name>yarn.resourcemanager.scheduler.address.rm2</name>
<value>hadoop2:8034</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.address.rm2</name>
<value>hadoop2:8088</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.nodemanager.aux-services.mapreduce_shuffle.class</name>
<value>org.apache.hadoop.mapred.ShuffleHandler</value>
</property>
<!--执行MapReduce需要配置的shuffle过程-->
<property>
<name>yarn.nodemanager.vmem-check-enabled</name>
<value>false</value>
</property>
<property>
<name>yarn.nodemanager.vmem-pmem-ratio</name>
<value>4</value>
</property>
</configuration>
3.3 向所有节点同步 YARN 配置文件
在 hadoop1 节点上修改完 YARN 相关配置之后,将修改的配置文件远程复制到 hadoop2节点和 hadoop3 节点,具体操作如下所示。
javascript
[root@hadoop1 hadoop]# deploy.sh /usr/local/hadoop/etc/hadoop/mapred-site.xml /usr/local/hadoop/etc/hadoop/ slave
[root@hadoop1 hadoop]# deploy.sh /usr/local/hadoop/etc/hadoop/yarn-site.xml /usr/local/hadoop/etc/hadoop/ slave
3.4 启动 YARN 集群
YARN HA 的实现依赖于 Zookeeper,所以需要优先启动 Zookeeper 集群。因为前面操作已经启动 Zookeeper 集群,所以该步骤可以跳过。
3.4.1 启动 YARN 集群
在 hadoop1 节点上,使用脚本一键启动 YARN 集群,具体操作如下所示:
javascript
[root@hadoop1 hadoop]# /usr/local/hadoop/sbin/start-yarn.sh
3.4.2 启动备用 ResourceManager
因为 start-yarn.sh 脚本不包含启动备用 ResourceManager 进程的命令,所以需要在hadoop2 节点上单独启动 ResourceManaggr,具体操作如下所示。
javascript
[root@hadoop2 hadoop]# /usr/local/hadoop/sbin/yarn-daemon.sh start resourcemanager
3.5 YARN 集群测试
3.5.1 shell 命令查看RM状态
如果一个 ResourceManagsr 为 active 状态,另外一个说明 YARN 集群构建成功。
ResourceManager为standby 状态,
javascript
[root@hadoop2 hadoop]# /usr/local/hadoop/bin/yarn rmadmin -getServiceState rm1
active
[root@hadoop2 hadoop]# /usr/local/hadoop/bin/yarn rmadmin -getServiceState rm2
standby
3.5.2 Web 界面查看 YARN 集群
在浏览器中输入网址 http://hadoop1:8088(或者 http://hadoop2:8088),通过web 界面查看 YARN 集群消息,结果如果所示:
3.5.3 测试 YARN 集群是否可以正常运行 MapReduce程序
为了测试 YARN 集群是否可以正常运行 MapReduce程序,我们以 Hadoop 自带的wordcount示例来进行演示,具体操作如图 6-8所示。
javascript
[root@hadoop1 hadoop]# /usr/local/hadoop/bin/yarn jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.10.2.jar wordcount /test/words.log /test/out
至此 HADOOP的搭建基本完成,后续介绍 HADOOP 集群的运维管理