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())); } }