「 HA」Hadoop-2.7.1高可用集群配置
Hadoop2.x系列最NB的地方在于HA和yarn,一个充分解决了集群环境中namenode挂掉的情况,一个解决了mapreduce计算的缺陷(话说现在spark/flink/beam/kylin各种计算框架争相夺艳呀)。
记录一下hadoop-2.7.1配置高可用(HA)集群(使用4台Centos-6.5-X64虚拟机,每台内存2G)。
一、目标
在进行HA配置之前需要对HA的基本概念有所了解,并且设计HA的集群节点。
1、缩略代称如下:
- NN 表示 NameNode
- DN 表示 DataNode
- ZK 表示 ZooKeeper
- JN 表示 JournalNode
- RM 表示 ResouceManager
- DM 表示 DataManager
2、效果说明:
下面表格中,1表示该机器上有此节点(或者说功能,比如node1上有的NameNode/ZK/ZKFC/RM),其中ZKFC与namenode必然是一一对应的。node1、node2上有namenode,则必然zkfc也在node1和node2上。
总体集群是:两台namenode、三台Zookeeper(ZK的投票机制决定了要使用大于1的奇数台ZK)、一台resourceManager(node1上),依次类推。
NN | DN | ZK | ZKFC | JN | RM | DM | |
node1 | 1 | 1 | 1 | 1 | |||
node2 | 1 | 1 | 1 | 1 | 1 | 1 | |
node3 | 1 | 1 | 1 | 1 | |||
node4 | 1 | 1 | 1 |
二、步骤
【java是必须安装的,就不单独说明了】
1、编译hadoop-2.7.1 x64
我之前写过一篇如果在centos 6.5 x64上编译hadoop-2.2.0,基本上是一样的,可以查看此链接:
http://www.ptbird.cn/centos64-hadoop-src.html
2、为4太CentOS配置hostname和静态ip以及hosts文件
hostname分别是node1、node2、node3、node4。
如果在VMware下配置静态IP我也写过一篇文章,要保证机器是联网的,这是前提条件。很多时候配了静态IP,反而不能联网了。如何配置静态IP文章如下:http://www.ptbird.cn/vmware-centos-static-ip.html
hosts配置如下:
注意,最好将127.0.0.1的hosts注释掉,至于为什么,在最后面有说明。
当然,我下面的那个node1.hadoop.ptbird.cn完全是弄着玩儿,为了图省事,可以不要这么长,毕竟配置的时候要写很多次 - -
#127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
#::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.124.131 node1 node1.hadoop.ptbird.cn
192.168.124.132 node2 node2.hadoop.ptbird.cn
192.168.124.133 node3 node3.hadoop.ptbird.cn
192.168.124.134 node4 node4.hadoop.ptbird.cn
3、为4台CentOS分别配置SSH免密码登陆
关于如何配置免密码登陆我也写过一篇文章,如下:
http://www.ptbird.cn/linux-ssh-no-password.html
4、配置hadoop-env.sh
- 将编译好的hadoop解压到目录中,我的目录为/mnt/modules/hadoop-2.7.1/
- hadoop的配置文件在 /mnt/modules/hadoop-2.7.1/etc/hadoop/
这里主要是配置java的路径,默认使用的是${JAVA_HOME},还是建议换成绝对的路径
# The java implementation to use.
#export JAVA_HOME=${JAVA_HOME}
export JAVA_HOME=/mnt/software/jdk1.7.0_79
5、配置hadoop-hdfs.xml
这是hadoop中配置最麻烦和最重要的部分。
根据官网HA BY QJM配置指南
(指南地址:http://hadoop.apache.org/docs/r2.7.1/hadoop-project-dist/hadoop-hdfs/HDFSHighAvailabilityWithQJM.html)
<property>
<name>dfs.nameservices</name>
<value>ptbirdns</value>
<description>这个是集群的唯一标示,之后都会用到,官网指南上给的例子是mycluster</description>
</property>
<property>
<name>dfs.ha.namenodes.ptbirdns</name>
<value>nn1,nn2</value>
<description>配置两个namenode的名称,注意namenodes的s和后面的ptbirdns,ptbirdns就是上面配置的nameservice</description>
</property>
<property>
<name>dfs.namenode.rpc-address.ptbirdns.nn1</name>
<value>node1.hadoop.ptbird.cn:8020</value>
<description>配置nn1的rpc地址(该地址是hdfs://node1:8020的地址)</description>
</property>
<property>
<name>dfs.namenode.rpc-address.ptbirdns.nn2</name>
<value>node2.hadoop.ptbird.cn:8020</value>
</property>
<property>
<name>dfs.namenode.http-address.ptbirdns.nn1</name>
<value>node1.hadoop.ptbird.cn:50070</value>
<description>配置nn1的http的地址,通过这个地址能够访问nn1的web界面</description>
</property>
<property>
<name>dfs.namenode.http-address.ptbirdns.nn2</name>
<value>node2.hadoop.ptbird.cn:50070</value>
</property>
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
<description>开启自动切换</description>
</property>
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://node2.hadoop.ptbird.cn:8485;node3.hadoop.ptbird.cn:8485;node4.hadoop.ptbird.cn:8485/ptbirdns</value>
<description>配置edits.dir,这个是为了投票将某个namenode标记为active的ZK地址,有三个ZK,分别在node1/node2/node3上,注意最后面的ptbirdns</description>
</property>
<property>
<name>dfs.client.failover.proxy.provider.ptbirdns</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
<description>这是默认的配置</description>
</property>
<property>
<name>dfs.ha.fencing.methods</name>
<value>sshfence</value>
<description>配置通信方式为ssh</description>
</property>
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/root/.ssh/id_rsa</value>
<description>SSH免密钥登录的私钥</description>
</property>
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/opt/hadoop/jndata</value>
<description>配置journalnode的目录,主要存放fsImage等namenode的元数据,为了切换</description>
</property>
6、配置core-site.xml
<!-- do not know which node is avtive, so do not use ip address to replace hdfs://ptbirdns-->
<!-- and ptbirdns is the 'nameservice' in hdfs-site.xml-->
<property>
<name>fs.defaultFS</name>
<value>hdfs://ptbirdns</value>
<description>上面的ptbirdns就是在hdfs-site中配置的nameservice</description>
</property>
<property>
<name>ha.zookeeper.quorum</name>
<value>node1.hadoop.ptbird.cn:2181,node2.hadoop.ptbird.cn:2181,node3.hadoop.ptbird.cn:2181</value>
<description>配置zookeeper的集群地址,默认端口2181</description>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/hadoop/tmp</value>
<description>配置临时目录</description>
</property>
7、配置 slaves
node2.hadoop.ptbird.cn
node3.hadoop.ptbird.cn
node4.hadoop.ptbird.cn
8、配置Zookeeper
Zookeeper需要结合上面hdfs和core中的配置去配置。
直接解压Zookeeper就行了,然后将目录放到PATH中,方便之后的一些操作。
vim /etc/profile
#java
export JAVA_HOME=/mnt/software/jdk1.7.0_79
export PATH=$PATH:$JAVA_HOME/bin
#zookeeper home
export ZOOKEEPER_HOME=/mnt/modules/zookeeper-3.4.9/bin
export PATH=$PATH:$ZOOKEEPER_HOME
记得 sourcem /etc/profile
配置 conf/zoo.sample.cfg ,当然需要改成zoo.cfg
主要配置下面的:
- dataDir
- zookeeper cluster config(在进行集群配置的时候,比如在)
# The number of milliseconds of each tick
tickTime=2000
# The number of ticks that the initial
# synchronization phase can take
initLimit=10
# The number of ticks that can pass between
# sending a request and getting an acknowledgement
syncLimit=5
# the directory where the snapshot is stored.
# do not use /tmp for storage, /tmp here is just
# example sakes.
dataDir=/opt/zookeeper/
# the port at which the clients will connect
clientPort=2181
# the maximum number of client connections.
# increase this if you need to handle more clients
#maxClientCnxns=60
#
# Be sure to read the maintenance section of the
# administrator guide before turning on autopurge.
#
# http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance
#
# The number of snapshots to retain in dataDir
#autopurge.snapRetainCount=3
# Purge task interval in hours
# Set to "0" to disable auto purge feature
#autopurge.purgeInterval=1
#
#zookeeper cluster config
#the "server.x":the x is the ID of the zookeeper cluster
server.1=node1.hadoop.ptbird.cn:2888:3888
server.2=node2.hadoop.ptbird.cn:2888:3888
server.3=node3.hadoop.ptbird.cn:2888:3888
9、配置Zookeeper集群
zookeeper集群除了上面配置conf中的内容外还需要额外的一部操作。
比如zoo.cfg的配置中,我们指明了三个zookeeper的集群机器,并且指定了dataDir,则需要在每个dataDir中建立一个名为myid的文件,我们用了三台机器,每台机器在dataDir中创建,并写入相应的阿拉伯数字。
如server.1=node1.hadoop.ptbird.cn:2888:3888,则在node1的myid中写入1即可,依次类推,在node2中写2,node3中写3即可完成配置。
10、namenode -Format及后续操作
format是最重要的一个步骤,我们配置了两个namenode,则仅需要在其中一个namenode中进行format就可以了。
前提条件是:首先开启三个zookeeper。
在每个有zk的节点上进行开启,添加进环境变量后,直接运行就行了。否则需要到./bin/目录下启动运行
$ zkService.sh start

$ ./sbin/hadoop-daemon.sh start journalnode
在node1上进行format操作。
$ ./bin/hadoop namenode -format
format成功之后,需要将将node1的namenode启动,此时node1就是active的namenode
$ ./sbin/hadoop-daemon.sh start namenode
启动成功后,node1的元数据 /opt/Hadoop/tmp/dfs/name/current/fsimage_* 拷贝到node2【在没有格式化的namenode也就是node2上执行 hdfs namenode -bootstrapStandby】指南说明地址:http://hadoop.apache.org/docs/r2.7.1/hadoop-project-dist/hadoop-hdfs/HDFSHighAvailabilityWithQJM.html#Deployment_details
$ ./bin/hdfs namenode -bootstrapStandby
上述操作成功后,停止dfs再重新启动dfs,此时node1不一定是active,可能node2是active。
$ ./sbin/stop-dfs.sh
$ ./sbin/start-dfs.sh
然后在其中一个namenode中初始化 zkfc ,官网指南地址:http://hadoop.apache.org/docs/r2.7.1/hadoop-project-dist/hadoop-hdfs/HDFSHighAvailabilityWithQJM.html#Initializing_HA_state_in_ZooKeeper
$ ./bin/hdfs zkfc –formatZK
上述操作完成后,再次stop和start
$ ./sbin/stop-dfs.sh
$ ./sbin/start-dfs.sh
到此,基本的配置就完成了。
但是没有配置mapred和yarn,相对于上面的配置mapred和yarn需要根据自己的实际工作情况去具体而详细的配置,每个人的配置可能都不会一样,这篇文章已经写了太长 = =,会在下篇文章写一下这两个的配置的相关的内容。
三、一些错误
在进行namenode -fotmat的时候,各种错误接踵而至是最可怕的。
1、a shared edits dir must not be specified if HA is not enabled.
但凡在format中出现了上述的问题,一定是配置错误,而且基本上错误就发生在 hadoop-hdfs.xml 中,所以建议一些配置选项还是复制上去,而不要手打。
我就是因为nameservices 少写了一个s,导致我查了好久都不知道什么问题,而只有这个是我手打上去的,真的是很尴尬。。。
2、Retrying connect to server: node4.hadoop.ptbird.cn/192.168.124.134:8485
出现上面的异常错误,有两个地方,
- 一个是iptables的防火墙,要全部关掉
- 还有一个是上面提到的hosts的127.0.0.1中需要注释掉,否则会进行一个本地回溯还是啥的,反正就是这个错误。
3、ssh的问题
如果 node2上执行 hdfs namenode –bootstrapStandby 出现了 Retrying connect to server: node1.hadoop.ptbird.cn/192.168.124.131:8020 ,则建议测试一下ssh连接,比如在node2上进行ssh node1的时候会出现 THE AUTHENTICITY OF HOST XX CAN’T BE ESTABLISHED 的问题。
这个问题是因为shh免密钥登录,第一次是需要进行一次确认操作的,虽然不需要密码但是y的确认操作是需要的,因此建议每台机器都确认一遍。(只有我出现了这个问题,不知道别人是否也出现这个问题了)
四、web界面
为了能够在windows上实时查看namenode的情况,在windows/hosts中将node1/node2/node3/node4的ip映射上去。
前提是开启了dfs:
然后在浏览器输入 http://node1.hadoop.ptbird.cn:50070 就可以查看,如果node1是active的则显示active,否则显示standby.
五、说明
真的是我非常认真写的一篇文章,并且花了很长的时间。
最后我截图简单说明一下配置的步骤:
文章版权:Postbird-There I am , in the world more exciting!
本文链接:http://www.ptbird.cn/hadoop-ha-qjm-config.html
转载请注明文章原始出处 !
上面截图中在DHCP下配置静态IP是手误打错了,应该是在NAT下。。。