准备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>
<property>
<name>fs.defaultFSname>
<value>hdfs://192.168.0.1:9000value>
property>
<property>
<name>hadoop.tmp.dirname>
<value>/opt/module/hadoop-2.10.0/datavalue>
property>
configuration>
etc/hadoop/hdfs-site.xml
<configuration>
<property>
<name>dfs.replicationname>
<value>1value>
property>
<property>
<name>dfs.namenode.secondary.http-addressname>
<value>192.168.0.2:50090value>
property>
configuration>
etc/hadoop/mapred-site.xml.template 删除.template
<configuration>
<property>
<name>mapreduce.framework.namename>
<value>yarnvalue>
property>
configuration>
etc/hadoop/yarn-site.xml
<configuration>
<property>
<name>yarn.nodemanager.aux-servicesname>
<value>mapreduce_shufflevalue>
property>
<property>
<name>yarn.resourcemanager.hostnamename>
<value>192.168.0.3value>
property>
<property>
<name>yarn.log-aggregation-enablename>
<value>truevalue>
property>
configuration>
etc/hadoop/slaves
// 指定DataNode节点
192.168.0.1
192.168.0.2
192.168.0.3
配置历史服务器
etc/hadoop/mapred-site.xml
<configuration>
<property>
<name>mapreduce.jobhistory.addressname>
<value>192.168.0.2:10020value>
property>
<property>
<name>mapreduce.jobhistory.webapp.addressname>
<value>192.168.0.2:19888value>
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,出现页面,说明历史服务器启动成功
上面部署的完全分布式集群有一个缺点,当NameNode挂掉后,整个集群也挂掉了,没有高可用的特性,在生产环境中,我们需要高可用的集群,当NameNode挂掉后,备用的NameNode能接管他的工作继续服务。
官方文档如下:https://hadoop.apache.org/docs/r2.10.0/hadoop-project-dist/hadoop-hdfs/HDFSHighAvailabilityWithQJM.html
下面的文章只是把关键点整理做了一个总结,方便快速配置
JournalNode守护程序相对较轻,因此可以合理地将这些守护程序与其他Hadoop守护程序(例如NameNode,JobTracker或YARN ResourceManager)并置在计算机上,
注意:必须至少有3个JournalNode守护程序,您可能还会运行3个以上的JournalNode,但是为了实际增加系统可以容忍的故障数量,您应该运行奇数个JN(即3、5、7等)。
请注意,在HA群集中,备用NameNode也执行名称空间状态的检查点,因此不必在HA群集中运行Secondary NameNode
<configuration>
<property>
<name>dfs.replicationname>
<value>1value>
property>
<property>
<name>dfs.nameservicesname>
<value>myclustervalue>
property>
<property>
<name>dfs.ha.namenodes.myclustername>
<value>nn1,nn2value>
property>
<property>
<name>dfs.namenode.rpc-address.mycluster.nn1name>
<value>192.168.0.1:8020value>
property>
<property>
<name>dfs.namenode.rpc-address.mycluster.nn2name>
<value>192.168.0.2:8020value>
property>
<property>
<name>dfs.namenode.http-address.mycluster.nn1name>
<value>192.168.0.1:50070value>
property>
<property>
<name>dfs.namenode.http-address.mycluster.nn2name>
<value>192.168.0.2:50070value>
property>
<property>
<name>dfs.namenode.shared.edits.dirname>
<value>qjournal://192.168.0.1:8485;192.168.0.2:8485;192.168.0.3:8485/myclustervalue>
property>
<property>
<name>dfs.client.failover.proxy.provider.myclustername>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvidervalue>
property>
<property>
<name>dfs.ha.fencing.methodsname>
<value>sshfencevalue>
property>
<property>
<name>dfs.ha.fencing.ssh.private-key-filesname>
<value>/home/${user}/.ssh/id_rsavalue>
property>
<property>
<name>dfs.journalnode.edits.dirname>
<value>/opt/module/hadoop-2.10.0/jndatavalue>
property>
configuration>
<configuration>
<property>
<name>fs.defaultFSname>
<value>hdfs://myclustervalue>
property>
<property>
<name>hadoop.tmp.dirname>
<value>/opt/module/hadoop-2.10.0/datavalue>
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
登录网页查看启动是否成功
# 强制结束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
开始配置前应先停掉启动的集群
新增如下配置
<configuration>
<property>
<name>dfs.ha.automatic-failover.enabledname>
<value>truevalue>
property>
configuration>
configuration>
<property>
<name>ha.zookeeper.quorumname>
<value>192.168.75.136:2181,192.168.75.137:2181,192.168.78.138:2181value>
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
最后附上正常运行的进程截图,如果执行自动故障转移失败,请对比下图中的进程信息,看看是否是某个进程没有启动成功
<configuration>
<property>
<name>yarn.resourcemanager.ha.enabledname>
<value>truevalue>
property>
<property>
<name>yarn.resourcemanager.cluster-idname>
<value>cluster1value>
property>
<property>
<name>yarn.resourcemanager.ha.rm-idsname>
<value>rm1,rm2value>
property>
<property>
<name>yarn.resourcemanager.hostname.rm1name>
<value>hadoop02value>
property>
<property>
<name>yarn.resourcemanager.hostname.rm2name>
<value>hadoop03value>
property>
<property>
<name>yarn.resourcemanager.webapp.address.rm1name>
<value>hadoop02:8088value>
property>
<property>
<name>yarn.resourcemanager.webapp.address.rm2name>
<value>hadoop03:8088value>
property>
<property>
<name>yarn.resourcemanager.zk-addressname>
<value>hadoop02:2181,hadoop03:2181,hadoop04:2181value>
property>
configuration>
在指定的ResourceManager下,启动ResourceManager
登录web也面,查看about页面中的状态信息,然后模拟其中一台故障,查看另一台是否转改变更为active