Hadoop HA搭建

hadoop HA部署

说明:
    1.在hadoop2.0中通常由两个NameNode组成,一个处于active状态,另一个处于standby状态。Active NameNode对外提供服务,而Standby NameNode则不对外提供服务,仅同步active namenode的状态,
      以便能够在它失败时快速进行切换。hadoop2.0官方提供了两种HDFS HA的解决方案,一种是NFS,另一种是QJM。这里我们使用简单的QJM。在该方案中,主备NameNode之间通过一组JournalNode同步元数据
      信息,一条数据只要成功写入多数JournalNode即认为写入成功。通常配置奇数个JournalNode这里还配置了一个zookeeper集群,用于ZKFC(DFSZKFailoverController)故障转移,当Active NameNode挂掉了,会自动切换
      Standby NameNode为standby状态
    2.hadoop-2.2.0中依然存在一个问题,就是ResourceManager只有一个,存在单点故障,hadoop2.5.1开启RM高用后可以解决这个问题,有两个ResourceManager,一个是Active,一个是Standby,状态由zookeeper进行协调

集群规划:
主机名        IP地址                  安装的软件                      运行的进程
node1      192.168.40.143    jdk,hadoop                    NameNode,DFSZKFailoverController
node2      192.168.40.144    jdk,hadoop,zookeeper    NameNode,DFSZKFailoverController,DataNode,NodeManager,QuorumPeerMain,JournalNode
node3      192.168.40.145    jdk,hadoop,zookeeper    DataNode,NodeManager,ResourceManager,QuorumPeerMain,JournalNode
node4      192.168.40.140    jdk,hadoop,zookeeper    DataNode,NodeManager,ResourceManager,QuorumPeerMain,JournalNode

1.准备环境,四台虚拟机,64位CentOS6.5系统,hadoop版本2.5.1
    192.168.40.143
    192.168.40.144
    192.168.40.145
    192.168.40.140
2.配置hosts
  在/etc/hosts下配置端口映射
  192.168.40.143 node1
  192.168.40.144 node2
  192.168.40.145 node3
  192.168.40.140 node4
3.安装jdk1.7.0_79
4.建立hadoop运行账号hello(四台机器一样)
5.使用hadoop用户操作:ssh远程免密码登陆
6.在node2,node3,node4上安装zookeeper(详细安装步骤略,见前面文章)
7.安装配置hadoop集群(在node1上操作)    
    7.1下载并解压hadoop安装包
        tar -zxvf hadoop-2.5.1-x64.tar.gz
    7.2修改配置文件(hadoop2.0所有的配置文件都在$HADOOP_HOME/etc/hadoop目录下)
        #将hadoop添加到环境变量中
        vim /etc/profile
        export HADOOP_HOME=/home/hello/app/hadoop-2.5.1
        export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin

        7.2.1修改core-site.xml
            <configuration>
                <!-- 指定hdfs的nameservice为ns1 -->
                <property>
                    <name>fs.defaultFS</name>
                    <value>hdfs://ns1/</value>
                </property>
                <!-- 指定hadoop临时目录,tmp这个目录需要提前建立好 -->
                <property>
                    <name>hadoop.tmp.dir</name>
                    <value>/home/hello/app/hadoop-2.5.1/tmp</value>
                </property>
                <!-- 指定zookeeper地址 -->
                <property>
                    <name>ha.zookeeper.quorum</name>
                    <value>node2:2181,node3:2181,node4:2181</value>
                </property>
            </configuration>
        
        7.2.2修改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>node1:9000</value>
                </property>
                <!-- nn1的http通信地址 -->
                <property>
                    <name>dfs.namenode.http-address.ns1.nn1</name>
                    <value>node1:50070</value>
                </property>
                <!-- nn2的RPC通信地址 -->
                <property>
                    <name>dfs.namenode.rpc-address.ns1.nn2</name>
                    <value>node2:9000</value>
                </property>
                <!-- nn2的http通信地址 -->
                <property>
                    <name>dfs.namenode.http-address.ns1.nn2</name>
                    <value>node2:50070</value>
                </property>
                <!-- 指定NameNode的元数据在JournalNode上的存放位置 -->
                <property>
                    <name>dfs.namenode.shared.edits.dir</name>
                    <value>qjournal://node2:8485;node3:8485;node4:8485/ns1</value>
                </property>
                <!-- 指定JournalNode在本地磁盘存放数据的位置 -->
                <property>
                    <name>dfs.journalnode.edits.dir</name>
                    <value>/home/hello/app/hadoop-2.5.1/journaldata</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>/home/hello/.ssh/id_rsa</value>
                </property>
                <!-- 配置sshfence隔离机制超时时间 -->
                <property>
                    <name>dfs.ha.fencing.ssh.connect-timeout</name>
                    <value>30000</value>
                </property>
            </configuration>
        
        7.2.3修改mapred-site.xml
            <configuration>
                <!-- 指定mr框架为yarn方式 -->
                <property>
                    <name>mapreduce.framework.name</name>
                    <value>yarn</value>
                </property>
            </configuration>    
        
        7.2.4修改yarn-site.xml
            <configuration>
                    <!-- 开启RM高可用 -->
                    <property>
                       <name>yarn.resourcemanager.ha.enabled</name>
                       <value>true</value>
                    </property>
                    <!-- 指定RM的cluster id -->
                    <property>
                       <name>yarn.resourcemanager.cluster-id</name>
                       <value>yrc</value>
                    </property>
                    <!-- 指定RM的名字 -->
                    <property>
                       <name>yarn.resourcemanager.ha.rm-ids</name>
                       <value>rm1,rm2</value>
                    </property>
                    <!-- 分别指定RM的地址 -->
                    <property>
                       <name>yarn.resourcemanager.hostname.rm1</name>
                       <value>node3</value>
                    </property>
                    <property>
                       <name>yarn.resourcemanager.hostname.rm2</name>
                       <value>node4</value>
                    </property>
                    <!-- 指定zk集群地址 -->
                    <property>
                       <name>yarn.resourcemanager.zk-address</name>
                       <value>node2:2181,node3:2181,node4:2181</value>
                    </property>
                    <property>
                       <name>yarn.nodemanager.aux-services</name>
                       <value>mapreduce_shuffle</value>
                    </property>
            </configuration>
            
        7.2.5修改slaves
            node2
            node3
            node4
                
        7.2.6修改hadoop-env.sh
            export JAVA_HOME=/usr/java/jdk1.7.0_79
            
        7.2.7修改yarn-env.sh
            export JAVA_HOME=/usr/java/jdk1.7.0_79

    7.3将配置好的hadoop拷贝到其他节点
        scp -r  ./hadoop-2.5.1 hello@node2:/home/hello/app/
        scp -r  ./hadoop-2.5.1 hello@node3:/home/hello/app/
        scp -r  ./hadoop-2.5.1 hello@node4:/home/hello/app/

###注意:严格按照下面的步骤
8.启动集群
    8.1启动zookeeper集群(分别在node2、node3、node4上启动zk)
        cd /home/hello/app/zookeeper-3.4.7
        ./bin/zkServer.sh start
        #查看状态:一个leader,两个follower
        ./bin/zkServer.sh status

    8.2启动journalnode(分别在在node2、node3、node4上执行)
        cd /weekend/hadoop-2.5.1
        ./sbin/hadoop-daemon.sh start journalnode
        #运行/usr/java/jdk1.7.0_79/bin/jps命令检验,node2、node3、node4上多了JournalNode进程
        
    8.3格式化HDFS
        #在node1上执行命令:
        ./bin/hdfs namenode -format
        #格式化后会在根据core-site.xml中的hadoop.tmp.dir配置生成个文件,这里我配置的是/home/hello/app/hadoop-2.5.1/tmp,
        #然后将/home/hello/app/hadoop-2.5.1/tmp拷贝到node2的/home/hello/app/hadoop-2.5.1/下。
        scp -r ./tmp/ hello@node2:/home/hello/app/hadoop-2.5.1/
        ##也可以这样,建议hdfs namenode -bootstrapStandby
        
    8.4格式化ZKFC(在node1上执行即可)
        ./bin/hdfs zkfc -formatZK
        
    8.5启动HDFS(在node1上执行)
        ./sbin/start-dfs.sh

    8.6启动YARN(分别在node3,node4上执行)
        ./sbin/start-yarn.sh
    
测试集群工作状态的一些指令:
./bin/hdfs dfsadmin -report                           查看hdfs的各节点状态信息
./bin/hdfs haadmin -getServiceState nn1        查看namenode高可用
./bin/yarn rmadmin –getServiceState rm1       查看ResourceManager高可用
./sbin/hadoop-daemon.sh start namenode     单独启动一个namenode进程
./hadoop-daemon.sh start zkfc                     单独启动一个zkfc进程

附:成功部署完成后的截图

posted @ 2016-06-22 12:06  万首real  阅读(2997)  评论(0编辑  收藏  举报