hadoop-HA hadoop2.0 HDFS搭建和HA切换

来源:互联网 发布:linux下的c语言编程 编辑:程序博客网 时间:2024/05/01 11:29

http://blog.csdn.net/kirayuan/article/details/17379743


说到了hadoop2.0的新特性。这里详解一下搭建步骤以及原理。

       首先,需要在cdh官方下载对应的源码包:http://archive.cloudera.com/cdh4/cdh/4/

        以cdh4.3.1版本为例来进行说明。

        1、hadoop配置文件及目录

         hadoop2.0版本配置文件放在$HAOOP_HOME/etc/hadoop/下,命令行工具在$HADOOP_HOME/bin/下,启动停止脚本则被放置在$HADOOP_HOME/sbin/下

         

        2、配置项

        core-site.xml

        <property>

             <name>fs.defaultFS</name>

             <value>hdfs://freedom</value>

        </property>

        这里的freedom为指定的hdfs名称,即命名空间


       <property>

            <name>ipc.server.tcpnodelay</name>

            <value>true</value>

      </property>

     ipc的tcp设置,不延时发送tcp请求

     <property>

           <name>ipc.client.tcpnodelay</name>

           <value>true</value>

     <description>Turn on/off Nagle's algorithm for the TCP socket connection on

     the client. Setting to true disables the algorithm and may decrease latency

     with a cost of more/smaller packets.

     </description>

     </property>

     client端的tcp设置,不延时发送tcp请求

  

      hdfs-site.xml

<property>

    <name>dfs.nameservices</name>

    <value>freedom</value>

  </property>

  配置命名空间,这里只配置了1个为freedom

  <property>

    <name>dfs.ha.namenodes.freedom</name>

    <value>nn1,nn2</value>

  </property>

  命名空间下的namenode,配置2个,成为HA

  <property>

    <name>dfs.namenode.rpc-address.freedom.nn1</name>

    <value>my22***0.cm4.tbsite.net:9516</value>

  </property>

    第一个namenode的rpc地址配置

  <property>

    <name>dfs.namenode.rpc-address.freedom.nn2</name>

    <value>my22***1.cm4.tbsite.net:9516</value>

  </property>

   第二个namenode的rpc地址配置

  <property>

    <name>dfs.namenode.http-address.freedom.nn1</name>

    <value>my22***0.cm4.tbsite.net:50070</value>

  </property>

   第一个namenode的http页面地址

  <property>

    <name>dfs.namenode.http-address.freedom.nn2</name>

    <value>my22***1.cm4.tbsite.net:50070</value>

  </property>

   第二个namenode的http页面地址

<property>

    <name>dfs.namenode.shared.edits.dir</name>

    <value>qjournal://my22***0.cm4.tbsite.net:20022;my22***1.cm4.tbsite.net:20022;hbdb20***1.cm4.tbsite.net

:20022/freedom</value>

  </property>

   journalnode的地址以及命名空间

  <property>

    <name>dfs.journalnode.edits.dir</name>

    <value>/u01/hbase/qjm/journal</value>

  </property>

   journalnode的读写路径

  <property>

    <name>dfs.journalnode.rpc-address</name>

    <value>0.0.0.0:20022</value>

  </property>

   journalnode的rpc地址

  <property>

    <name>dfs.client.failover.proxy.provider.freedom</name>

    <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>

  </property>

   指定hdfs client来识别freedom命名空间并在namenode切换期间识别namnode的proxy类

  

<property>

    <name>dfs.client.read.shortcircuit</name>

    <value>true</value>

  </property>

  开启本地读功能

  <property>

    <name>dfs.domain.socket.path</name>

    <value>/u01/hbase/cdh4-dn-socket/dn_socket</value>

  </property>

   本地读需要设置一个目录,事先需要mkdir /u01/hbase/cdh3-dn-socket并且设置该目录的权限为0755

  <property>

    <name>dfs.client.read.shortcircuit.buffer.size</name>

    <value>4096</value>

  </property>

   本地读的buffer大小,4k


   hadoop-metrics2.properties

   由于hadoop2.0采用了metric2的监控框架,所以这里改写metric2的配置文件

   

   *.sink.ganglia.class=org.apache.hadoop.metrics2.sink.ganglia.GangliaSink31

   *.sink.ganglia.period=15

   *.sink.ganglia.supportsparse=true

   namenode.sink.ganglia.servers=172.24.***.*1:8649

   datanode.sink.ganglia.servers=172.24.***.*1:8649

   journalnode.sink.ganglia.servers=172.24.***.*1:8649


    hadoop-env.sh和hadoop1.0一致


    3.启动集群

    step1.启动journalnode

    sbin/hadoop-daemons.sh --hostnames 'JN1 JN2 JN3' start jouralnode 

    

    step2.在主节点namenode上执行format命令 

    $HADOOP_HOME/bin/hdfs namenode -format [-clusterId <cluster_id>]

     

    step3.启动主节点

     sbin/hadoop-daemon.sh start namenode


    step4.在standby节点namenode上执行同步元数据命令

    $HADOOP_HOME/bin/hdfs namenode -bootstrapStandby

    

    step5.启动standby的namenode

    sbin/hadoop-daemon.sh start namenode

   

     step6.启动所有datanode

     sbin/start-dfs.sh

    

     step7.切换一台namenode到active状态

     说明:由于集群启动时两个namenode都是处于standby状态,需要手工指定其中一台active,使用如下命令

     bin/hdfs haadmin -transitionToActive nn1


     到此为止,集群就能正常启动了。   


     4.切换namenode

     使用bin/hdfs haadmin --transitionToActive nn2即可切换active nn到nn2。这时nn1如果还存活则变成不可写状态,需要重启,重启后自动成为standby nn


     5.如果要在hadoop2.0上搭建hbase,需要注意以下问题。

     (1)配置方面要使用hadoop2.0的命名空间来访问hdfs

     (2)需要根据实际情况来设置namenode的ha切换过程hbase重试时间

       在hbase/conf目录下加入一个hdfs-site.xml配置文件

       

<property>  <name>fs.default.name</name>  <value>hdfs://mycluster</value></property><property>  <name>dfs.nameservices</name>  <value>mycluster</value></property><property>  <name>dfs.ha.namenodes.mycluster</name>  <value>nn1,nn2</value></property><property>  <name>dfs.namenode.rpc-address.mycluster.nn1</name>  <value>10.232.98.77:20020</value></property><property>  <name>dfs.namenode.rpc-address.mycluster.nn2</name>  <value>10.232.98.78:20020</value></property><property>  <name>dfs.client.failover.proxy.provider.mycluster</name>  <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value></property><property>  <name>dfs.client.failover.max.attempts</name>  <value>15</value>  <description>表示客户端最大的重试次数,默认是15次</description></property><property>  <name>dfs.client.failover.sleep.base.millis</name>  <value>500</value>  <description>表示客户端等待多少毫秒后重试,默认是500毫秒</description></property><property>  <name>dfs.client.failover.sleep.max.millis</name>  <value>15000</value>  <description>表示重试等待的最大时间,默认是15000毫秒</description></property>


     

  • dfs.client.failover.max.attempts

这个参数表示在failover过程中,hdfs client重试的次数,默认是重试15此

  • dfs.client.failover.sleep.base.millis

这个参数表示每次重试等待的最小时间,默认是500ms

  • dfs.client.failover.sleep.max.millis

这个参数表示每次重试等待的最大时间,默认是15000ms

  • 每次等待时间的算法

      private static long calculateExponentialTime(long time, int retries, long cap) {    long baseTime = Math.min(time * (1L << retries), cap);    return (long) (baseTime * (RANDOM.get().nextDouble() + 0.5));  }

参数long time对应dfs.client.failover.sleep.base.millis属性的值

参数int retries对应当前是重试第几次

参数cap对应dfs.client.failover.sleep.max.millis属性的值

每次等待的时间是time乘上2的retries次方的值的0.5-1.5倍。但每次等待的时间不超过dfs.client.failover.sleep.max.millis属性的值。默认情况下,若重试15次,累计的等待时间为1.5min到4.5min之间。


0 0