hadoop2.10.0完全分布式集群搭建+ HA(QJM)高可用集群搭建
准备工作JDK1.8hadoop 2.10.0centos 7VMware准备3台虚拟机,部署规划如下ipNameNodeSecondaryNameNodeResourceManagerDataNodeNodeManager192.168.0.1yesnonoyesyes192.168.0.2noyesnoyesyes19...
准备工作
- JDK1.8
- hadoop 2.10.0
- centos 7
- VMware
准备3台虚拟机,部署规划如下
ip | NameNode | SecondaryNameNode | ResourceManager | DataNode | NodeManager | historyserver |
---|---|---|---|---|---|---|
192.168.0.1 | yes | no | no | yes | yes | no |
192.168.0.2 | no | yes | no | yes | yes | yes |
192.168.0.3 | no | no | yes | yes | yes | no |
有条件的情况下 NameNode ,SecondaryNameNode ,ResourceManager 他们都应该各自独占一台节点,DataNode和NodeManager必须成对出现
安装JDK,并配置好环境变量
安装haoop,并配置好环境变量
开始部署
解压hadoop,进入所在目录
配置JAVA_HOME,由于不同节点上jdk安装路径可能不同,不建议使用默认配置
修改以下:
etc/hadoop/hadoop-env.sh 25行
etc/hadoop/mapred-env.sh 16行
etc/hadoop/yarn-env.sh 23行
为:
export JAVA_HOME=/opt/module/jdk1.8.0_231/
etc/hadoop/core-site.xml
<configuration>
<!-- 指定文件系统为HDFS,同时指定NameNode节点 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://192.168.0.1:9000</value>
</property>
<!-- 文件的存放目录 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/module/hadoop-2.10.0/data</value>
</property>
</configuration>
etc/hadoop/hdfs-site.xml
<configuration>
<!-- 数据副本数,默认3 -->
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
<!-- 指定SecondaryNameNode服务节点 -->
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>192.168.0.2:50090</value>
</property>
</configuration>
etc/hadoop/mapred-site.xml.template 删除.template
<configuration>
<!-- 资源管理使用yarn服务 -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
etc/hadoop/yarn-site.xml
<configuration>
<property>
<!-- shuffle获取方式 -->
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<!-- 指定ResourceManager服务节点 -->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>192.168.0.3</value>
</property>
<!-- 开启日志聚合,在historyserver中查看日志 -->
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>
</configuration>
etc/hadoop/slaves
// 指定DataNode节点
192.168.0.1
192.168.0.2
192.168.0.3
配置历史服务器
etc/hadoop/mapred-site.xml
<configuration>
<!-- 历史服务器所在节点,这里以192.168.0.2为例 -->
<property>
<name>mapreduce.jobhistory.address</name>
<value>192.168.0.2:10020</value>
</property>
<!-- 历史服务器的web页面 -->
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>192.168.0.2:19888</value>
</property>
</configuration>
以上配置文件同步到所有服务节点,保持整个集群的配置文件一致
启动集群,先启动HDFS集群,在启动YARN集群,注意 需要在NameNode所在节点上启动HDFS集群,在ResourceManager所在节点上启动YARN集群
启动集群
# 初次启动,需要先格式化namenode,会在刚才配置中指定的目录下生成文件,在192.168.0.1的机器上执行
bin/hdfs namenode -format
# 启动HDFS集群,在192.168.0.1的机器上执行
sbin/start-dfs.sh
# 启动YARN集群,在192.168.0.3的机器上执行
sbin/start-yarn.sh
# 启动历史服务器,在192.168.0.2的机器上执行
sbin/mr-jobhistory-daemon.sh start historyserver
停止集群
sbin/stop-yarn.sh
sbin/stop-dfs.sh
sbin/mr-jobhistory-daemon.sh stop historyserver
验证结果
访问 192.168.0.1:50070,出现页面,说明HDFS启动成功
访问 192.168.0.3:8088,出现页面,说明YARN启动成功
访问 192.168.0.2:19888,出现页面,说明历史服务器启动成功
HDFS 高可用
上面部署的完全分布式集群有一个缺点,当NameNode挂掉后,整个集群也挂掉了,没有高可用的特性,在生产环境中,我们需要高可用的集群,当NameNode挂掉后,备用的NameNode能接管他的工作继续服务。
官方文档如下:https://hadoop.apache.org/docs/r2.10.0/hadoop-project-dist/hadoop-hdfs/HDFSHighAvailabilityWithQJM.html
下面的文章只是把关键点整理做了一个总结,方便快速配置
JournalNode
JournalNode守护程序相对较轻,因此可以合理地将这些守护程序与其他Hadoop守护程序(例如NameNode,JobTracker或YARN ResourceManager)并置在计算机上,
注意:必须至少有3个JournalNode守护程序,您可能还会运行3个以上的JournalNode,但是为了实际增加系统可以容忍的故障数量,您应该运行奇数个JN(即3、5、7等)。
请注意,在HA群集中,备用NameNode也执行名称空间状态的检查点,因此不必在HA群集中运行Secondary NameNode
- hdfs-site.xml
<configuration>
<!-- 数据副本数,默认3 -->
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
<!-- HA集群不需要 SecondaryNameNode 服务节点,注释掉即可 -->
<!-- <property>
<name>dfs.namenode.secondary.http-address</name>
<value>192.168.0.2:50090</value>
</property> -->
<!-- HA集群的名称,值可以为任何值,下面是使用mycluster地方配置为自定义的值即可 -->
<property>
<name>dfs.nameservices</name>
<value>mycluster</value>
</property>
<!-- NameNode节点的名称,nn1和nn2,可自定义名称 -->
<property>
<name>dfs.ha.namenodes.mycluster</name>
<value>nn1,nn2</value>
</property>
<!-- NameNode节点所在服务器,名称必须需要上面定义的值对应上 -->
<property>
<name>dfs.namenode.rpc-address.mycluster.nn1</name>
<value>192.168.0.1:8020</value>
</property>
<property>
<name>dfs.namenode.rpc-address.mycluster.nn2</name>
<value>192.168.0.2:8020</value>
</property>
<!-- NameNode节点对应的web页面地址 -->
<property>
<name>dfs.namenode.http-address.mycluster.nn1</name>
<value>192.168.0.1:50070</value>
</property>
<property>
<name>dfs.namenode.http-address.mycluster.nn2</name>
<value>192.168.0.2:50070</value>
</property>
<!-- 指定JournalNode服务运行的服务器,注意,最少需要3台服务器才能运行,mycluster需要和上面定义的名称对应 -->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://192.168.0.1:8485;192.168.0.2:8485;192.168.0.3:8485/mycluster</value>
</property>
<!-- 该JAVA类用于确定哪一个NameNode是active状态 -->
<property>
<name>dfs.client.failover.proxy.provider.mycluster</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<!-- 以下2个配置用于SSH到Active NameNode并终止进程 -->
<property>
<name>dfs.ha.fencing.methods</name>
<value>sshfence</value>
</property>
<!-- ${user}更改为你自己的用户名 -->
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/home/${user}/.ssh/id_rsa</value>
</property>
<!-- JournalNode服务文件的存储位置 -->
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/opt/module/hadoop-2.10.0/jndata</value>
</property>
</configuration>
- core-site.xml
<configuration>
<!-- 修改我我们的HA集群 -->
<!--<property>
<name>fs.defaultFS</name>
<value>hdfs://192.168.0.1:9000</value>
</property>-->
<!-- mycluster为上面配置项定义的名称 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://mycluster</value>
</property>
<!-- 文件的存放目录 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/module/hadoop-2.10.0/data</value>
</property>
</configuration>
以上配置文件同步到所有节点
如果你有启用过集群,先停止所有集群,删除所有节点上面配置的hadoop.tmp.dir目录。否则会导致启动失败
启动
初次启动
# 初次启动
# 启动各个节点下的journalnode服务
hadoop-daemon.sh start journalnode
# 任意选择一个namenode节点,执行格式化
hdfs namenode -format
# 启动namonode,启动后状态为standby
hadoop-daemon.sh start namenode
# 另一台namenode节点,同步namenode的数据
hdfs namenode -bootstrapStandby
# 启动namonode,启动后状态为standby
hadoop-daemon.sh start namenode
# 切换指定id的NameNode的状态为active
hdfs haadmin -transitionToActive nn1
非初次启动
# 已经初始化后,再次启动可以直接执行此命令启动
start-dfs.sh
登录网页查看启动是否成功
手动转移故障
- 模拟NameNode节点故障
# 强制结束Active状态的NameNode进程
kill -9 <pid>
- 备用节点转换为主节点
hdfs haadmin -failover nn1 nn2
执行上诉命令会发现报错了,猜一下是什么原因导致的?
在执行转换时,nn2需要告诉nn1,我准备顶上了,你休息吧,但是这里nn1已经挂掉了,无法回复nn2信息,导致切换失败,需要先把故障的NameNode重新启动后才能执行转换
# 重启nn1
hadoop-daemon.sh start namenode
# 执行转换
hdfs haadmin -failover nn1 nn2
这里大家也发现一个问题吧,需要把挂掉的NamoNode重新启动后才能执行装换,完全没有达到高可用的要求,下面我们配置自动故障转移
自动故障转移
自动故障转移,需要引入2个新的组件ZooKeeper和ZKFailoverController
部署zookeeper,请查看我的另一篇博客https://blog.csdn.net/u012421093/article/details/105313699
开始配置前应先停掉启动的集群
新增如下配置
- hdfs-site.xml
<configuration>
<!-- 开启自动故障转移 -->
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
</configuration>
- core-site.xml
</configuration>
<!-- zookeeper节点配置 -->
<property>
<name>ha.zookeeper.quorum</name>
<value>192.168.75.136:2181,192.168.75.137:2181,192.168.78.138:2181</value>
</property>
</configuration>
在其中一台NameNode节点输入以下命令
# 初始化zookeeper,成功后会在zookeeper上创建一个znode节点,名称为hadoop-ha
hdfs zkfc -formatZK
# 启动集群
start-dfs.sh
模拟故障,kill掉正在运行的节点,5秒后备用节点的状态变为active,成功
如果出现连接类错误,如Caused by: java.net.ConnectException: Connection refused
则执行下列命令, yum install psmisc
最后附上正常运行的进程截图,如果执行自动故障转移失败,请对比下图中的进程信息,看看是否是某个进程没有启动成功
YARN 高可用
- yarn-site.xml
<configuration>
<!-- 注释掉下列配置 -->
<!--
<property>
<name>yarn.resourcemanager.hostname</name>
<value>192.168.75.137</value>
</property>
-->
<!-- 启用yarn高可用 -->
<property>
<name>yarn.resourcemanager.ha.enabled</name>
<value>true</value>
</property>
<!-- yarn高可用集群名称,可自行命名 -->
<property>
<name>yarn.resourcemanager.cluster-id</name>
<value>cluster1</value>
</property>
<!-- ResourceManager名称 -->
<property>
<name>yarn.resourcemanager.ha.rm-ids</name>
<value>rm1,rm2</value>
</property>
<!-- ResourceManager的hostname -->
<property>
<name>yarn.resourcemanager.hostname.rm1</name>
<value>hadoop02</value>
</property>
<property>
<name>yarn.resourcemanager.hostname.rm2</name>
<value>hadoop03</value>
</property>
<!-- ResourceManager的web地址 -->
<property>
<name>yarn.resourcemanager.webapp.address.rm1</name>
<value>hadoop02:8088</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.address.rm2</name>
<value>hadoop03:8088</value>
</property>
<!-- yarn的zookeeper集群设置 -->
<property>
<name>yarn.resourcemanager.zk-address</name>
<value>hadoop02:2181,hadoop03:2181,hadoop04:2181</value>
</property>
</configuration>
- 启动ResourceManager
在指定的ResourceManager下,启动ResourceManager
登录web也面,查看about页面中的状态信息,然后模拟其中一台故障,查看另一台是否转改变更为active
最后附上正常运行的进程截图,如果执行自动故障转移失败,请对比下图中的进程信息,看看是否是某个进程没有启动成功
更多推荐
所有评论(0)