hadoop1.0 高可靠性(HA)安装与总结

发布: 2014-07-17   上次更新: 2024-06-15   分类: 大数据   标签: hadoop

文章目录

继上次安装完Kerberos安全认证后,现在我在这基础上,又给CDH加上了HA(high availability),也就是高可靠性,具体来讲就是双NameNode,双Jobtracker(我还是在MRv1模式下),有了HA后,这下集群的健壮性就能够得到很好的保证了。

我还是按照官方文档来操作的,有了上次的经验,建议大家在具体操作实施前,先快速阅读一遍,做到心中有数,我还阅读了Apache官方的说明,也不用怎么详细,大概知道怎么回事就行了。

首先说明一点的就是,CDH5 只支持Quorum Journal Manager(QJM)模式下的HA,不支持NFS模式的,这点和Apache官方的不一样,大家要留意下。

下面说说我遇到的坑:

2014-07-17 14:49:06,151 [myid:1] - INFO  [WorkerReceiver[myid=1]:FastLeaderElection@542] - Notification: 1 (n.leader), 0x100000106 (n.zxid), 0x1 (n.round), LOOKING (n.state), 1 (n.sid), 0x2 (n.peerEPoch), LOOKING (my state)
2014-07-17 14:49:06,153 [myid:1] - WARN  [WorkerSender[myid=1]:QuorumCnxManager@368] - Cannot open channel to 2 at election address node1/10.4.13.63:3888
java.net.ConnectException: Connection refused
    at java.net.PlainSocketImpl.socketConnect(Native Method)
    at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:339)
    at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:200)
    at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:182)
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
    at java.net.Socket.connect(Socket.java:579)
    at org.apache.zookeeper.server.quorum.QuorumCnxManager.connectOne(QuorumCnxManager.java:354)
    at org.apache.zookeeper.server.quorum.QuorumCnxManager.toSend(QuorumCnxManager.java:327)
    at org.apache.zookeeper.server.quorum.FastLeaderElection$Messenger$WorkerSender.process(FastLeaderElection.java:393)
    at org.apache.zookeeper.server.quorum.FastLeaderElection$Messenger$WorkerSender.run(FastLeaderElection.java:365)
    at java.lang.Thread.run(Thread.java:745)

这个是正常的,等3台全部启动后,有如下日志就证明没问题了

2014-07-17 11:26:44,425 [myid:3] - INFO  [WorkerReceiver[myid=3]:FastLeaderElection@542] - Notification: 3 (n.leader), 0x0 (n.zxid), 0x1 (n.round), LOOKING (n.state), 3 (n.sid), 0x0 (n.peerEPoch), LOOKING (my state)
2014-07-17 11:26:44,426 [myid:3] - INFO  [WorkerReceiver[myid=3]:FastLeaderElection@542] - Notification: 2 (n.leader), 0x0 (n.zxid), 0x1 (n.round), LOOKING (n.state), 1 (n.sid), 0x0 (n.peerEPoch), LOOKING (my state)
digest:hdfs-zkfcs:vlUvLnd8MlacsE80rDuu6ONESbM=:rwcda

与这个类似的信息,但是在执行zkfc -formatZK时,老是说的我得到的字符串(’->’ 后面的那部分)不对,我也不知道为什么,不知道是不是哪步少了什么,因为zookeeper集群在内网,集群内安全性一般不用考虑,我这里就直接忽略了这步,以后机会再找原因。

sudo -u hdfs bin/hdfs zkfc -formatZK
sudo -u hdfs sbin/hadoop-daemon.sh start journalnode #开启journalnode进程

sudo -u hdfs sbin/hadoop-daemon.sh start zkfc #开启automatic failover进程

sudo -u hdfs bin/hdfs namenode -initializeSharedEdits #把一个non-HA的NameNode转为HA时用到

sudo -u hdfs bin/hdfs namenode -bootstrapStandby 
sudo -u hdfs sbin/hadoop-daemon.sh start namenode
#上面命这两个命令在运行第二个Namenode服务器上执行,必须先执行-bootstrapStandby 这行命令再开启namenode 


#下面这些命令之前,需要以hdfs用户用kinit拿到TGT,否则会报错
sudo -u hdfs bin/hdfs haadmin -getServiceState nn1 #查看nn1是active的还是standby的
sudo -u mapred sbin/hadoop-daemon.sh start jobtrackerha

命令开启jobtrackerha

#运行下面这些命令之前,要先以mapred用户用kinit拿到TGT,否则会报错

sudo -u mapred bin/hadoop mrhaadmin -getServiceState jt1 

查看jt1是active的还是standby的

  <property>
    <name>mapred.job.tracker.persist.jobstatus.dir</name>
    <value>/jobtracker/jobsInfo</value>
  </property>

所以需要在HDFS上创建相应目录,并修改其owner为mapred

sudo -u hdfs bin/hdfs dfs -mkdir -p /tmp/hadoop-mapred/mapred/staging
sudo -u hdfs bin/hdfs dfs -chown mapred /tmp/hadoop-mapred/mapred/staging
sudo -u hdfs bin/hdfs dfs -chmod 1777 /tmp/hadoop-mapred/mapred/staging

此外,还需要配置mapreduce.jobtracker.system.dir指定的文件,默认为${hadoop.tmp.dir}/mapred/system,所以还需要执行下面的命令:

sudo -u hdfs bin/hdfs dfs -mkdir -p /tmp/hadoop-mapred/mapred/system
sudo -u hdfs bin/hdfs dfs -chown mapred /tmp/hadoop-mapred/mapred/system

这个目录只由mapred用户来写入,所以不用再修改其权限(的755即可)。

总结:这次配置HA的整个过程还是比较顺利的,除了烦人的各种权限问题,我觉得这也是我没有弄明白hadoop各个进程是如何工作导致的,通过支持配置HA,算是对job的运行又有了更深的的认识。

评论

欢迎读者通过邮件与我交流,也可以在 MastodonTwitter 上关注我。