hadoop联邦模式的配置

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

猜你喜欢

转载自www.cnblogs.com/zyde/p/8986683.html