说到了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之间。