Hadoop 分布式集群搭建

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 集群的运维管理

相关推荐
只因在人海中多看了你一眼1 小时前
分布式缓存 + 数据存储 + 消息队列知识体系
分布式·缓存
zhixingheyi_tian4 小时前
Spark 之 Aggregate
大数据·分布式·spark
PersistJiao4 小时前
Spark 分布式计算中网络传输和序列化的关系(一)
大数据·网络·spark
求积分不加C5 小时前
-bash: ./kafka-topics.sh: No such file or directory--解决方案
分布式·kafka
nathan05295 小时前
javaer快速上手kafka
分布式·kafka
宅小海7 小时前
scala String
大数据·开发语言·scala
小白的白是白痴的白7 小时前
11.17 Scala练习:梦想清单管理
大数据
java1234_小锋7 小时前
Elasticsearch是如何实现Master选举的?
大数据·elasticsearch·搜索引擎
谭震鸿9 小时前
Zookeeper集群搭建Centos环境下
分布式·zookeeper·centos
JessieZeng aaa10 小时前
CSV文件数据导入hive
数据仓库·hive·hadoop