说到了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

 

    

    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之间。