1.介绍
对名字空间做负载均衡。不同的NN配置不同的空间。宏观上
是一个整体。
配置多个名称服务,在每个nameservice下使用HA方式配置。
2.集群规划
[ns1]
nn1 //s101
nn2 //s102
[ns2]
nn3 //s103
nn4 //s104
3.编写脚本,xssh-copy-id.sh
3.1)在s101上编写脚本xssh-copy-id.sh
#!/bin/bash
ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
for host in `cat /usr/local/bin/.hosts` ;
do
tput setaf 2
echo ======== $host ========
tput setaf 7
ssh-copy-id $host
done
4.分别在s102,s103,s104执行以上脚本,完成ssh处理。
4'.验证s101~s104能够无密登录到其他所有主机。
ssh s106
5.准备新的配置目录和本地临时目录
在所有节点上执行该命令。
$>xcall.sh "cp -r /soft/hadoop/etc/ha /soft/hadoop/etc/federation"
6.修改hdfs-site.xml
注意:该文件是s101和s102的配置文件
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>dfs.nameservices</name>
<value>ns1,ns2</value>
</property>
<!-- **************ns1********************* -->
<property>
<name>dfs.ha.namenodes.ns1</name>
<value>nn1,nn2</value>
</property>
<property>
<name>dfs.namenode.rpc-address.ns1.nn1</name>
<value>s101:8020</value>
</property>
<property>
<name>dfs.namenode.rpc-address.ns1.nn2</name>
<value>s102:8020</value>
</property>
<property>
<name>dfs.namenode.http-address.ns1.nn1</name>
<value>s101:50070</value>
</property>
<property>
<name>dfs.namenode.http-address.ns1.nn2</name>
<value>s102:50070</value>
</property>
<property>
<name>dfs.client.failover.proxy.provider.ns1</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<!-- **************ns2********************* -->
<property>
<name>dfs.ha.namenodes.ns2</name>
<value>nn3,nn4</value>
</property>
<property>
<name>dfs.namenode.rpc-address.ns2.nn3</name>
<value>s103:8020</value>
</property>
<property>
<name>dfs.namenode.rpc-address.ns2.nn4</name>
<value>s104:8020</value>
</property>
<property>
<name>dfs.namenode.http-address.ns2.nn3</name>
<value>s103:50070</value>
</property>
<property>
<name>dfs.namenode.http-address.ns2.nn4</name>
<value>s104:50070</value>
</property>
<property>
<name>dfs.client.failover.proxy.provider.ns2</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<!--***********************************************-->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<!-- ******************注意:后面的目录固定!!!********* -->
<!-- ******************注意:后面的目录固定!!!********* -->
<!-- ******************注意:后面的目录固定!!!********* -->
<!-- ******************注意:后面的目录固定!!!********* -->
<!-- ******************注意:后面的目录固定!!!********* -->
<value>qjournal://s102:8485;s103:8485;s104:8485/ns1</value>
</property>
<property>
<name>dfs.ha.fencing.methods</name>
<value>
sshfence
shell(/bin/true)
</value>
</property>
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/home/centos/.ssh/id_rsa</value>
</property>
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
</configuration>
7.分发hdfs-site.xml文件
$>xsync.sh hdfs-site.xml
8.修改s103和s104上的hdfs-site.xml
...
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://s102:8485;s103:8485;s104:8485/ns2</value>
</property>
...
9.修改s101的core-site.xml文件
<?xml version="1.0"?>
<configuration xmlns:xi="http://www.w3.org/2001/XInclude">
<xi:include href="mountTable.xml" />
<property>
<name>fs.defaultFS</name>
<!--**** 名称一定要和挂载表的名称一致 *****-->
<!--**** 名称一定要和挂载表的名称一致 *****-->
<!--**** 名称一定要和挂载表的名称一致 *****-->
<!--**** 名称一定要和挂载表的名称一致 *****-->
<!--**** 名称一定要和挂载表的名称一致 *****-->
<!--**** 名称一定要和挂载表的名称一致 *****-->
<value>viewfs://ClusterX</value>
</property>
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/home/centos/hadoop/federation/journalnode</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/home/centos/hadoop/federation</value>
</property>
<property>
<name>ha.zookeeper.quorum</name>
<value>s102:2181,s103:2181,s104:2181</value>
</property>
</configuration>
10.分发core-site.xml
$>xsync.sh core-site.xml
11.mountTable.xml文件。
[etc/federation/mountTable.xml]
<configuration>
<property>
<name>fs.viewfs.mounttable.ClusterX.homedir</name>
<value>/home</value>
</property>
<property>
<name>fs.viewfs.mounttable.ClusterX.link./home</name>
<value>hdfs://ns1/home</value>
</property>
<property>
<name>fs.viewfs.mounttable.ClusterX.link./tmp</name>
<value>hdfs://ns2/tmp</value>
</property>
<property>
<name>fs.viewfs.mounttable.ClusterX.link./projects/foo</name>
<value>hdfs://ns1/projects/foo</value>
</property>
<property>
<name>fs.viewfs.mounttable.ClusterX.link./projects/bar</name>
<value>hdfs://ns2/projects/bar</value>
</property>
</configuration>
12.分发mount.xml
$>xsync.sh mount.xml
13.修改core-site.xml
<?xml version="1.0"?>
<configuration xmlns:xi="http://www.w3.org/2001/XInclude">
<xi:include href="mountTable.xml" />
<property>
<name>fs.defaultFS</name>
<!--**** 名称一定要和挂载表的名称一致 *****-->
<!--**** 名称一定要和挂载表的名称一致 *****-->
<!--**** 名称一定要和挂载表的名称一致 *****-->
<!--**** 名称一定要和挂载表的名称一致 *****-->
<!--**** 名称一定要和挂载表的名称一致 *****-->
<!--**** 名称一定要和挂载表的名称一致 *****-->
<value>viewfs://ClusterX</value>
</property>
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/home/centos/hadoop/federation/journalnode</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/home/centos/hadoop/federation</value>
</property>
<property>
<name>ha.zookeeper.quorum</name>
<value>s102:2181,s103:2181,s104:2181</value>
</property>
</configuration>
14.再次分发core-site.xml
略
15.修改软连接
$>xcall.sh "ln -sfT /soft/hadoop/etc/federation /soft/hadoop/etc/hadoop"
15.格式化文件系统
15.0)启动JN节点
[s102 ~ s104]
$>hadoop-daemon.sh start journalnode
15.1)格式化s101的文件系统
$>登录s101
$>hdfs namenode -format
15.2)复制s101的本地临时目录到s102上
$>scp -r federation centos@s102:/home/centos/hadoop/
15.3)启动s101名称节点
$>hadoop-daemon.sh start namenode
15.4)s102引导standby节点,提示是否重格,选择N.
$>hdfs namenode -bootstrapStandby
15.5)s102初始化JN , 提示是否重格,选择N.
$>hdfs namenode -initializeSharedEdits
15.5')s102格式化zk,提示清除zk的容灾数据,选择Y.
$>hdfs zkfc -formatZK
15.6)启动s102 NN
$>hadoop-daemon.sh start namenode
15.7)格式化s103,提示重复重格,选择Y,提示QJM是否重格,选择Y。
注意:clusterID是格式化ns1时,所产生的集群id,位于/home/centos/hadoop/federation/dfs/name/current/VERSION中。
$>hdfs namenode -format -clusterId CID-72566e0e-7978-4be8-99d8-eda9a8897081
15.8)复制s103的本地目录到s104,引导和初始化
$>登录s104
//复制
$>scp -r centos@s103:/home/centos/hadoop/federation/dfs/* /home/centos/hadoop/federation/dfs/
//启动s103的NN
$>hadoop-daemon.sh start namenode
//s104引导standby节点
$>hdfs namenode -bootstrapStandby
//s104初始化JN
$>hdfs namenode -initializeSharedEdits
//是104格式化zk,是否清除ns2的数据,选择Y。
$>hdfs zkfc -formatZK
15.8)s101启动所有数据节点
$>hadoop-daemons.sh start datanode
15.8').自动namenode上的zkfc
s101 ~ s104分别启动zkfc
hadoop-daemon.sh start zkfc
15.9)自动选出active节点
15.10)查看webui
http://s101:50070
http://s102:50070
http://s103:50070
http://s104:50070
15.11)hdfs访问
//根据挂载表进行操作
$>hdfs dfs -mkdir -p viewfs://ClusterX/home/data //s101
$>hdfs dfs -mkdir -p viewfs://ClusterX/tmp/data //s101
$>hdfs dfs -mkdir -put 1.txt /tmp/data //s101
$>hdfs dfs -mkdir -get /home/data/1.txt
//1.复制配置文件,core-site.xml + mountTable.xml + hdfs-site.xml
//2.编程API
public class TestFederation {
@Test
public void testGet() throws Exception {
Configuration conf = new Configuration();
FileSystem fs = FileSystem.get(conf) ;
FSDataInputStream in = fs.open(new Path("/home/data/1.txt"));
ByteArrayOutputStream baos = new ByteArrayOutputStream() ;
IOUtils.copyBytes(in,baos , 1024);
baos.close();
in.close();
System.out.println(new String(baos.toByteArray()));
}
}