Hadoop的HA机制

HA机制及设计思路

还未完成

HA:High Availability高可用

CAP原理:指的是在一个分布式系统中,Consistency(一致性)、 Availability(可用性)、Partition tolerance(分区容错性),最多只能同时三个特性中的两个,三者不可兼得。

qjournal : edits日志管理,借助zk做分布式协调

七台机器及配置
192.168.14.132 danny1 namenode zkfc
192.168.14.133 danny2 namenode zkfc
192.168.14.134 danny3 resoucemanager
192.168.14.135 danny4 resoucemanager
192.168.14.136 danny5 nodemanager datanode zookeeper journalnode
192.168.14.137 danny6 nodemanager datanode zookeeper journalnode
192.168.14.138 danny7 nodemanager datanode zookeeper journalnode

HA联邦机制
danny1显示“active”
danny1
danny2显示“standby”
danny2
danny3为yarn的节点
danny3
块的名称中包含namenode的id,即第一张图的Block Pool ID
danny4

启动步骤

1、启动zookeeper集群(分别在danny5、danny6、danny7上启动zk)

  • cd /hadoop/zookeeper-3.4.5/bin/
  • ./zkServer.sh start
  • ./zkServer.sh status
    查看状态:一个leader,两个follower

2、启动journalnode(分别在在danny5、danny6、danny7上执行)

  • sbin/hadoop-daemon.sh start journalnode
    运行jps命令检验,danny5、danny6、danny7上多了JournalNode进程

3、格式化HDFS(第一次启动时运行一次即可,之后就不需要运行)
在danny1上执行命令:

  • hdfs namenode -format

格式化后会在根据core-site.xml中的hadoop.tmp.dir配置生成个文件,这里我配置的是/home/app/hadoop-2.9.1/tmp,然后将/home/app/hadoop-2.9.1/tmp拷贝到danny2的/home/app/hadoop-2.9.1/下。

  • scp -r tmp/ danny2:/home/app/hadoop-2.9.1
    也可以这样,建议hdfs namenode -bootstrapStandby

4、格式化ZKFC(在danny1上执行一次即可)

  • hdfs zkfc -formatZK

5、启动HDFS(在danny1上执行)

  • sbin/start-dfs.sh

6、启动YARN(注意:是在danny3和danny4上执行start-yarn.sh,把namenode和resourcemanager分开是因为性能问题,因为他们都要占用大量资源,所以把他们分开了,他们分开了就要分别在不同的机器上启动)

  • sbin/start-yarn.sh

HA模式使用API遇到的一些问题

使用eclipse客户端运行hadoop的坑
1由于使用了逻辑名称代替namenode,客户端并不知道namenode的具体位置,所以需要告诉客户端hadoop的namenode在哪。

  • core-site.xmlhdfs-site.xml配置文件放在客户端的classpath下(src文件下)
  • 然后在configuration中设置defaultFS
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    	FileSystem fs = null;
    Configuration conf = null;
    @Before
    public void init() throws Exception {

    conf = new Configuration();
    conf.set("fs.defaultFS", "hdfs://bi/");
    //拿到一个文件操作的客户端实例对象
    // fs = FileSystem.get(conf);
    fs = FileSystem.get(new URI("hdfs://bi/"), conf, "hadoop");
    }

参考文章

打包成jar包在服务器上运行的问题
1由于我不知道的mapreduce日志放在哪,并且控制台显示的信息有限,并没有显示错误的关键信息。所以现在jar里面设置打印日志文件。

  • 在工程的src目录下新建文件log4j.properties,内容如下
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    # Configure logging for testing: optionally with log file

    #log4j.rootLogger=debug,appender
    log4j.rootLogger=info,appender
    #log4j.rootLogger=error,appender

    #\u8F93\u51FA\u5230\u63A7\u5236\u53F0
    log4j.appender.appender=org.apache.log4j.ConsoleAppender
    #\u6837\u5F0F\u4E3ATTCCLayout
    log4j.appender.appender.layout=org.apache.log4j.TTCCLayout

之后就可以查看日志文件了,日志文件会放在$HADOOP_HOME/logs/userlogs下面。

参考文献

2碰到了一个问题,由于在Hadoop的HA模式下实现,并不是很熟悉,HA机制下Mapredece程序无法运行
修改yarn-site.xml文件

1
2
3
4
5
6
7
8
9
<property> 
<name>yarn.resourcemanager.webapp.address.rm1</name>
<value>danny3:8088</value>
</property>

<property>
<name>yarn.resourcemanager.webapp.address.rm2</name>
<value>danny4:8088</value>
</property>

参考文章