您的位置:首页 > 运维架构

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

2015-03-06 13:39 344 查看
/article/7834101.html

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

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: