postbird

Hadoop2.x系列最NB的地方在于HA和yarn,一个充分解决了集群环境中namenode挂掉的情况,一个解决了mapreduce计算的缺陷(话说现在spark/flink/beam/kylin各种计算框架争相夺艳呀)。

记录一下hadoop-2.7.1配置高可用(HA)集群(使用4台Centos-6.5-X64虚拟机,每台内存2G)。

postbird

一、目标

在进行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上),依次类推。

NNDNZKZKFCJNRMDM
node11 11 1
node211111 1
node3 11 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即可完成配置。

postbird

10、namenode -Format及后续操作

format是最重要的一个步骤,我们配置了两个namenode,则仅需要在其中一个namenode中进行format就可以了。

前提条件是:首先开启三个zookeeper。

在每个有zk的节点上进行开启,添加进环境变量后,直接运行就行了。否则需要到./bin/目录下启动运行

$ zkService.sh start
postbird 根据上面的配置条件,在2,3,4上分别执行以下命令开启journalnode
$ ./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

出现上面的异常错误,有两个地方,

  1. 一个是iptables的防火墙,要全部关掉
  2. 还有一个是上面提到的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:

postbird

然后在浏览器输入 http://node1.hadoop.ptbird.cn:50070 就可以查看,如果node1是active的则显示active,否则显示standby.

postbird

五、说明

真的是我非常认真写的一篇文章,并且花了很长的时间。

最后我截图简单说明一下配置的步骤:

postbird