准备工作:
1. 制定集群节点部署计划
节点 | namenode | datanode | resourcemanager | nodemanager | journalnode | ZKFC | QuorumPeerMain |
ha1 | √ | √ | √ | √ | √ | √ | √ |
ha2 | √ | √ |
| √ | √ | √ | √ |
ha3 |
| √ |
| √ | √ |
| √ |
2. 最少三个节点,如果是三个节点,每个节点内存应配置在1g以上;配置好网络、hosts、jdk、ssh免密码登陆
3. 根据本机目前实际情况做如下配置:
(1) 前期准备
① 将原来配置的好的hadoop目录打成压缩包用于备份;
② 删掉hadoop目录
③ 修改/etc/hostname、和/etc/hosts文件,修改成自定义的主机名,比如:ha1、ha2和ha3,以及在在hosts文件中配置好ip主机名映射;
④ 根据实际情况适当修改/etc/profile
(2) 配置zookeeper
① 拷贝并解压zookeeper
② 修改conf/zoo.sample.cfg为zoo.cfg文件
③ 修改zoo.cfg文件如下:
④ 修改myid,其内容1(ha1为1,ha2为2,ha3为3,根据zoo.cfg文件下面的内容配置)
⑤ 将配置好的zookeeper目录scp到ha2和ha3的同目录下;并在ha2和ha3的zkdata文件夹中创建myid文件,其内容分别 2和3
⑥ 三个节点启动zkServer.sh
bin/zkServer.sh start
⑦ 验证zookeeper是否启动成功
zkServer.sh status
(3) hadoop相关文件配置
① 解压hadoop到自己的路径下
② hadoop-env.sh配置
配置JAVA_HOME
③ core-site.xml
<configuration>
<!-- 指定hdfs的nameservice为ns -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://ns</value>
</property>
<!--指定hadoop数据临时存放目录-->
<property>
<name>hadoop.tmp.dir</name>
<value>/home/shch/metadata</value>
</property>
<property>
<name>io.file.buffer.size</name>
<value>4096</value>
</property>
<!--指定zookeeper地址-->
<property>
<name>ha.zookeeper.quorum</name>
<value>ha1:2181,ha2:2181,ha3:2181</value>
</property>
</configuration>
④ hdfs-site.xml
<configuration>
<!--指定hdfs的nameservice为ns,需要和core-site.xml中的保持一致 -->
<property>
<name>dfs.nameservices</name>
<value>ns</value>
</property>
<!-- ns下面有两个NameNode,分别是nn1,nn2 -->
<property>
<name>dfs.ha.namenodes.ns</name>
<value>nn1,nn2</value>
</property>
<!-- nn1的RPC通信地址 -->
<property>
<name>dfs.namenode.rpc-address.ns.nn1</name>
<value>ha1:8020</value>
</property>
<!-- nn1的http通信地址 -->
<property>
<name>dfs.namenode.http-address.ns.nn1</name>
<value>ha1:50070</value>
</property>
<!-- nn2的RPC通信地址 -->
<property>
<name>dfs.namenode.rpc-address.ns.nn2</name>
<value>ha2:8020</value>
</property>
<!-- nn2的http通信地址 -->
<property>
<name>dfs.namenode.http-address.ns.nn2</name>
<value>ha2:50070</value>
</property>
<!-- 指定NameNode的元数据在JournalNode上的存放位置 -->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://ha1:8485;ha2:8485;ha3:8485/ns</value>
</property>
<!-- 指定JournalNode在本地磁盘存放数据的位置 -->
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/home/shch/ha/journal</value>
</property>
<!-- 开启NameNode故障时自动切换 -->
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
<!-- 配置失败自动切换实现方式 -->
<property>
<name>dfs.client.failover.proxy.provider.ns</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/shch/.ssh/id_rsa</value>
</property>
<!--
<property>
<name>dfs.namenode.name.dir</name>
<value>file:///usr/hadoop-2.7.2/workspace/hdfs/name</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>file:///usr/hadoop-2.7.2/workspace/hdfs/data</value>
</property>
-->
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
<!-- 在NN和DN上开启WebHDFS (REST API)功能,不是必须 -->
<property>
<name>dfs.webhdfs.enabled</name>
<value>true</value>
</property>
</configuration>
⑤ mapred-site.xml
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<property>
<name>mapreduce.jobhistory.address</name>
<value>ha1:10020</value>
<description>MapReduce JobHistory Server host:port.Default port isb 10020.</description>
</property>
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>ha1:19888</value>
<description>MapReduce JobHistory Server Web UI host:p Default port 19888.</description>
</property>
<property>
<name>mapreduce.jobhistory.intermediate-done-dir</name>
<value>/home/shch/ha/mr_history</value>
<description>Directory where history files are written by MapReduce jobs.</description>
</property>
<property>
<name>mapreduce.jobhistory.done-dir</name>
<value>/home/shch/ha/mr_history</value>
<description>Directory where history files are managed by the MR JobHistory Server.</description>
</property>
</configuration>
⑥ yarn-site.xml
<configuration>
<!-- 指定nodemanager启动时加载server的方式为shuffle server -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<!-- 指定resourcemanager地址 -->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>ha1</value>
</property>
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>
</configuration>
⑦slaves
ha1
ha2
ha3
⑧ 修改yarn-env.sh
export JAVA_HOME=/usr/lib/jdk180151
(9) 将配置好的hadoop目录scp到ha2和ha3同级目录下
(10) 启动集群
① 启动zookeeper集群
ha1、ha2和ha3分别运行
bin/zkServer.sh start
② 验证zookeeper集群是否启动
bin/zkServer.sh status
③ 启动journalnodes集群
hadoop-daemons.sh start journalnode
④ 验证journalnode集群是否启动
⑤ 格式化zkfc,让在zookeeper中生成ha节点
在mast1上执行如下命令,完成格式化
hdfs zkfc -formatZK
⑦ 启动namenode
1) 首先在ha1上启动active节点,在ha1上执行如下命令
hadoop-daemon.sh start namenode
2) 在另一个(ha2)namenode节点同步当前namenode的数据(在ha2上输入命令)
hdfs namenode -bootstrapStandby
3) 启动ha2上的namenode作为standby(在ha2上输入命令)
hadoop-daemons.sh start namenode
⑧ ha1上启动datanode
hadoop-daemons.sh start datanode
⑨ ha1上启动yarn
start-yarn.sh
⑩ 启动zkfc
hadoop-daemons.sh start zkfc
ha1和ha2都如上图所示;ha3因为没有namenode,因此无DFSZKFAILOVERCONTROLLER进程
11 验证集群是否启动完成
jps
12 查看集群的namenode是active还是standby
hdfs haadmin -getServiceState nn1
每个节点显示为以上内容,如果集群不能开启,请先按照倒叙,从下往上关闭所有进程。
检查:
1、是否按开启步骤顺序执行
2、是否没个开启过程都按照文档,在对应的主机上执行。
3、配置文件中的节点名称,如涉及到mast1或这mast2等节点的名字和主机名一致。
4、按照此安装文档配置过多次,没发现出现任何问题,如果还有问题,请检查zookeeper的所有注意内容。
1.zkfc无法切换:
怪异的问题,hdfs-site.xml中已经指定了dfs.ha.fencing.ssh.private-key-files值为.ssh下的id_rsa文件,但似乎没有生效,
解决办法:
将两个namenode的公钥合并成一个authorized_keys文件,并放置到两个namenode的.ssh目录下即可
2.如果是minimal版,未安装psmisc也会导致无法切换的问题。
yum install -y minimal
也可以通过端口查看:50700 8088