hadoop2.2.0、zookeeper3.4.5、hbase0.96.2基于QJM方式HA的分布式集群搭建

hadoop2.2.0、zookeeper3.4.5、hbase0.96.2基于QJM方式HA的分布式集群搭建


QJM方式的高可用简介
        在hadoop2.0中通常由一个命名空间对应两个NameNode组成,一个处于active状态,另一个处于standby状态。
    Active NameNode对外提供服务,而Standby NameNode则不对外提供服务,仅同步active namenode的状态,以便
    能够在它失败时快速进行切换。
        hadoop2.0官方提供了两种HDFS HA的解决方案,一种是NFS,另一种是QJM(Quorum Journal Manager)。这里
    我们使用简单的QJM。在该方案中,主备NameNode之间通过一组JournalNode同步元数据信息,一条数据只要成功
    写入多数JournalNode即认为写入成功。通常配置奇数个JournalNode。
        这里还配置了一个zookeeper集群,用于ZKFC(DFSZKFailoverController)故障转移,当Active NameNode宕
    机后会自动切换Standby NameNode为standby状态。

    
用到的软件
    jdk-6u45-linux-x64.bin
    hadoop-2.2.0.x86_64.tar.gz
    zookeeper-3.4.5.tar.gz
    hbase-0.96.2-hadoop2-bin.tar.gz
    -apache-hive-0.13.0-bin.tar.gz
    -apache-flume-1.5.0-bin.tar.gz
    -sqoop-1.99.4-bin-hadoop200.tar.gz
    -apache-storm-0.9.3.tar.gz

    
集群规划
    主机            IP                软件                            进程
    pc1                192.168.1.101    jdk、hadoop、hbase                DFSZKFailoverController、HMaster、NameNode
    pc2                192.168.1.102    Jdk、hadoop、hbase                DFSZKFailoverController、HMaster、NameNode
    pc3                192.168.1.103    jdk、hadoop、hbase                ResourceManager、HRegionServer
    pc4                192.168.1.104    jdk、hadoop、zookeeper、hbase    QuorumPeerMain、JournalNode、DataNode、NodeManager、HRegionServer
    pc5                192.168.1.105    jdk、hadoop、zookeeper、hbase    QuorumPeerMain、JournalNode、DataNode、NodeManager、HRegionServer
    pc6                192.168.1.106    jdk、hadoop、zookeeper、hbase    QuorumPeerMain、JournalNode、DataNode、NodeManager、HRegionServer


集群启动后的进程为如下
    pc1
    2814 DFSZKFailoverController
    28463 Main
    28924 Jps
    28329 HMaster
    2551 NameNode
    pc2
    2287 NameNode
    27612 HMaster
    2376 DFSZKFailoverController
    28072 Jps
    pc3
    26946 Jps
    2271 ResourceManager
    26637 HRegionServer
    pc4
    26831 HRegionServer
    2191 QuorumPeerMain
    26046 DataNode
    27193 Jps
    26180 NodeManager
    12572 JournalNode
    pc5
    27206 Jps
    2325 JournalNode
    2435 DataNode
    2196 QuorumPeerMain
    26823 HRegionServer
    2569 NodeManager
    pc6
    27205 Jps
    26170 NodeManager
    26035 DataNode
    26835 HRegionServer
    2195 QuorumPeerMain
    2319 JournalNode


准备六台机器(不再描述修改主机名、修改主机和IP映射的hosts、关闭防火墙)


配置ssh免密码登录
    在pc1、pc2、pc3、pc4、pc5和pc6机器上生成ssh密钥(采用rsa非对称加密方式)
        进入/root/.ssh/下执行ssh-keygen –t rsa 三次回车生成公钥和私钥文件
            在pc1上执行ssh-copy-id root@pc1
            在pc2上执行ssh-copy-id root@pc1
            在pc3上执行ssh-copy-id root@pc1
            在pc4上执行ssh-copy-id root@pc1
            在pc5上执行ssh-copy-id root@pc1
            在pc6上执行ssh-copy-id root@pc1
        将pc1的authorized_keys复制到pc2、pc3、pc4、pc5和pc6上,如下
            scp /root/.ssh/authorized_keys root@pc2:/root/.ssh/
            scp /root/.ssh/authorized_keys root@pc3:/root/.ssh/
            scp /root/.ssh/authorized_keys root@pc4:/root/.ssh/
            scp /root/.ssh/authorized_keys root@pc5:/root/.ssh/
            scp /root/.ssh/authorized_keys root@pc6:/root/.ssh/
        通过各个节点相互登录完成验证ssh免密码登录(包括免密码登录自己),如下:
            ssh pc1
            ssh pc2
            ssh pc3
            ssh pc4
            ssh pc5
            ssh pc6


所有的软件均安装到/usr/local/下


安装jdk(在pc1上安装,安装成功后将pc1的jdk和环境变量复制到其他节点上)
    授予jdk的可执行权限,如下:
        chmod u+x jdk-6u45-linux-x64.bin
    解压jdk到当前目录(/usr/local/):
        ./jdk-6u45-linux-x64.bin
    重命名解压出来的jdk1.6.0_45文件夹:
        mv jdk1.6.0_45 jdk
    配置jdk的JAVA_HOME到环境变量(/etc/profile),如下:
        vim /etc/profile
        添加如下两行:
            export JAVA_HOME=/usr/local/jdk
            export PATH=.:$JAVA_HOME/bin:$PATH
        使环境变量立即生效,如下:
            source /etc/profile
    验证jdk是否安装成功,如下:
        java –version
    将配置好的jdk和环境变量复制到pc2、pc3、pc4、pc5和pc6上,如下:
        从pc1上复制jdk到pc2、pc3、pc4、pc5和pc6上,如下:
            scp –r jdk root@pc2:/usr/local/
            scp –r jdk root@pc3:/usr/local/
            scp –r jdk root@pc4:/usr/local/
            scp –r jdk root@pc5:/usr/local/
            scp –r jdk root@pc6:/usr/local/
        从pc1上复制/etc/profile到pc2、pc3、pc4、pc5和pc6上,如下:
            scp /etc/profile root@pc2:/etc/
            scp /etc/profile root@pc3:/etc/
            scp /etc/profile root@pc4:/etc/
            scp /etc/profile root@pc5:/etc/
            scp /etc/profile root@pc6:/etc/            
        需要在pc2、pc3、pc4、pc5和pc6上执行source /etc/profile命令立即生效


安装zookeeper(在pc4上安装,安装成功后将pc4的zookeeper和环境变量复制到其他节点上。pc4为QuorumPeerMain角色为Follower。pc5为QuorumPeerMain角色为Leader。pc6为QuorumPeerMain角色为Follower。)
    解压zookeeper-3.4.5.tar.gz到当前目录(/usr/local),如下:
        tar –zxvf zookeeper-3.4.5.tar.gz
    重命名解压出来的zookeeper,如下:
        mv zookeeper-3.4.5 zk
    修改zk的配置文件(zoo_sample.cfg),如下:
        mv zoo_sample.cfg zoo.cfg
        vim zoo.cfg
        添加如下内容:
            dataDir=/usr/local/zk/data
            server.1=pc4:2888:3888
            server.2=pc5:2888:3888
            server.3=pc6:2888:3888
    注意:在zk的根目录下创建data文件夹,该文件夹中包含一个myid文件,值为1
    配置zookeeper的ZOOKEEPER_HOME到环境变量(/etc/profile),如下:
        Vim /etc/profile
        添加如下内容:
            export ZOOKEEPER_HOME=/usr/local/zk
            export PATH=.:$ZOOKEEPER_HOME/bin:$HADOOP_HOME/bin:$JAVA_HOME/bin:$PATH
        将pc4的zk和环境变量(/etc/profile)分别复制到pc5和pc6节点上,如下:
            scp –r root@pc5:/usr/local/  注意:pc5的myid文件值为2
            scp –r root@pc6:/usr/local/  注意:pc6的myid文件值为3
        将pc4的环境变量(/etc/profile)复制到pc5和pc6节点上,如下:
            scp /etc/profile root@pc5:/etc/
            scp /etc/profile root@pc6:/etc/
        使环境变量立即生效,如下:
            source /etc/profile


安装hadoop(在pc1上安装,安装成功后将pc1的hadoop和环境变量复制到其他节点上。pc1为Active的NameNode。pc2为Standby的NameNode。pc3为ResourceManager。pc4、pc5和pc6为DataNode。)
    解压hadoop-2.2.0.x86_64.tar.gz文件到当前目录(/usr/local),如下:
        tar –zxvf hadoop-2.2.0.x86_64.tar.gz
    重命名解压出来的hadoop,如下:
        mv hadoop2.2.0 hadoop
    修改hadoop配置文件(hadoop-env.sh、core-site.xml、hdfs-site.xml、mapred-site.xml、yarn-site.xml和slaves),如下:
        一、hadoop-env.sh
            export JAVA_HOME=/usr/local/jdk        
        二、core-site.xml
            <configuration>
                <!-- 指定hdfs的nameservice为ns1 -->
                <property>
                    <name>fs.defaultFS</name>
                    <value>hdfs://ns1</value>
                </property>
                <!-- 指定hadoop临时目录 -->
                <property>
                    <name>hadoop.tmp.dir</name>
                    <value>/usr/local/hadoop/tmp</value>
                </property>
                <!-- 指定zookeeper地址 -->
                <property>
                    <name>ha.zookeeper.quorum</name>
                    <value>pc4:2181,pc5:2181,pc6:2181</value>
                </property>
            </configuration>
        三、hdfs-site.xml
            <configuration>
                <!--指定hdfs的nameservice为ns1,需要和core-site.xml中的保持一致 -->
                <property>
                    <name>dfs.nameservices</name>
                    <value>ns1</value>
                </property>
                <!-- ns1下面有两个NameNode,分别是nn1,nn2 -->
                <property>
                    <name>dfs.ha.namenodes.ns1</name>
                    <value>nn1,nn2</value>
                </property>
                <!-- nn1的RPC通信地址 -->
                <property>
                    <name>dfs.namenode.rpc-address.ns1.nn1</name>
                    <value>pc1:9000</value>
                </property>
                <!-- nn1的http通信地址 -->
                <property>
                    <name>dfs.namenode.http-address.ns1.nn1</name>
                    <value>pc1:50070</value>
                </property>
                <!-- nn2的RPC通信地址 -->
                <property>
                    <name>dfs.namenode.rpc-address.ns1.nn2</name>
                    <value>pc2:9000</value>
                </property>
                <!-- nn2的http通信地址 -->
                <property>
                    <name>dfs.namenode.http-address.ns1.nn2</name>
                    <value>pc2:50070</value>
                </property>
                <!-- 指定NameNode的元数据在JournalNode上的存放位置 -->
                <property>
                    <name>dfs.namenode.shared.edits.dir</name>
                    <value>qjournal://pc4:8485;pc5:8485;pc6:8485/ns1</value>
                </property>
                <!-- 指定JournalNode在本地磁盘存放数据的位置 -->
                <property>
                    <name>dfs.journalnode.edits.dir</name>
                    <value>/usr/local/hadoop/journal</value>
                </property>
                <!-- 开启NameNode失败自动切换 -->
                <property>
                    <name>dfs.ha.automatic-failover.enabled</name>
                    <value>true</value>
                </property>
                <!-- 配置失败自动切换实现方式 -->
                <property>
                    <name>dfs.client.failover.proxy.provider.ns1</name>
                    <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
                </property>
                <!-- 配置隔离机制方法,多个机制用换行分割,即每个机制暂用一行-->
                <property>
                    <name>dfs.ha.fencing.methods</name>
                    <value>
                        sshfence
                        shell(/bin/true)
                    </value>
                </property>
                <!-- 使用sshfence隔离机制时需要ssh免登陆 -->
                <property>
                    <name>dfs.ha.fencing.ssh.private-key-files</name>
                    <value>/root/.ssh/id_rsa</value>
                </property>
                <!-- 配置sshfence隔离机制超时时间 -->
                <property>
                    <name>dfs.ha.fencing.ssh.connect-timeout</name>
                    <value>30000</value>
                </property>
            </configuration>
        四、mapred-site.xml
            <configuration>
                <!-- 指定mr框架为yarn方式 -->
                <property>
                    <name>mapreduce.framework.name</name>
                    <value>yarn</value>
                </property>
            </configuration>
        五、yarn-site.xml
            <configuration>
                <!-- Site specific YARN configuration properties -->
                <!-- 指定resourcemanager地址 -->
                <property>
                    <name>yarn.resourcemanager.hostname</name>
                    <value>pc3</value>
                </property>
                <!-- 指定nodemanager启动时加载server的方式为shuffle server -->
                <property>
                    <name>yarn.nodemanager.aux-services</name>
                    <value>mapreduce_shuffle</value>
                </property>
            </configuration>
        六、slaves
            pc4
            pc5
            pc6
    将配置好的hadoop复制到pc2、pc3、pc4、pc5和pc6上,如下:
        spc -r /usr/local/hadoop root@pc2:/usr/local/
        spc -r /usr/local/hadoop root@pc3:/usr/local/
        spc -r /usr/local/hadoop root@pc4:/usr/local/
        spc -r /usr/local/hadoop root@pc5:/usr/local/
        spc -r /usr/local/hadoop root@pc6:/usr/local/
    以上步骤完成后,hadoop就算配置完成了。
    启动hadoop前需要格式化hdfs和zkfc,请严格按照如下步骤执行:
        一、启动pc4、pc5、pc6上的zookeeper集群,如下:
            注意:高可用的集群依赖zookeeper进行故障转移,所以必须先启动zookeeper集群。
            在pc4上启动zookeeper(启动后验证zookeeper节点状态和角色),如下:
                zkServer.sh start        --启动zookeeper进程
                zkServer.sh status        --follower或leader
                jps                    -- QuorumPeerMain
            在pc5上启动zookeeper(启动后验证zookeeper节点状态和角色),如下:
                zkServer.sh start        --启动zookeeper进程
                zkServer.sh status        --follower或leader
                jps                    -- QuorumPeerMain
            在pc6上启动zookeeper(启动后验证zookeeper节点状态和角色),如下:
                zkServer.sh start        --启动zookeeper进程
                zkServer.sh status        --follower或leader
                jps                    -- QuorumPeerMain
        二、在pc1上启动JournalNode(该进程位于pc4、pc5和pc6节点),如下:
            cd /usr/local/hadoop/sbin
            hadoop-daemons.sh start journalnode
        三、格式化HDFS(首次使用时需要格式化),如下:
            cd /usr/local/hadoop/bin
            hdfs namenode –format
        四、格式化zk,如下:
            cd /usr/local/hadoop/bin
            hdfs zkfc –formatZK
        五、在pc1上启动HDFS(pc1为Active状态的NameNode,pc2为Standby状态的NameNode),如下:
            cd /usr/local/hadoop/sbin
            start-dfs.sh
        六、在pc3上启动YARN(避免NameNode和ResourceManager抢占资源,所以将ResourceManager单独放在pc3上),如下:
            cd /usr/local/hadoop/sbin
            start-yarn.sh
        上述步骤无报错的情况下则为正常启动集群,通过如下方式验证集群是否搭建成功:
            Jps方式:
                pc1
                23295 Jps
                2000 NameNode
                2259 DFSZKFailoverController
                pc2
                23000 Jps
                2024 DFSZKFailoverController
                1944 NameNode
                pc3
                22544 Jps
                1993 ResourceManager
                pc4
                22668 Jps
                1985 DataNode
                1918 QuorumPeerMain
                2042 JournalNode
                2199 NodeManager
                pc5
                2081 JournalNode
                22714 Jps
                2236 NodeManager
                2023 DataNode
                1954 QuorumPeerMain
                pc6
                1987 DataNode
                2202 NodeManager
                22671 Jps
                1924 QuorumPeerMain
                2047 JournalNode
            浏览器方式验证:
                验证HDFS:
                    pc1:50070       Active状态的NameNode,Live Nodes(DataNode节点)数量为3,分别是pc4、pc5和pc6,JournalManager(JournalNode节点)是pc4、pc5和pc6。
                    pc2:50070        Standby状态的NameNode,Live Nodes(DataNode节点)数量为3,分别是pc4、pc5和pc6。
                验证YARN:
                    pc3:8088        ResourceManager,Active Nodes(NodeManager节点)分别是pc4、pc5和pc6。
                验证NameNode的高可用:
                    在pc1上杀死NameNode进程(kill -9 NameNode进程号),通过浏览器查看时,pc1的NameNode页面无法打开,pc2的NameNode页面的状态变成了Active状态。
            与上述验证匹配表示hadoop集群启动成功了。

            
安装Hbase()

posted @ 2014-02-15 20:53  孟尧  阅读(278)  评论(0)    收藏  举报