Ubuntu 14.10 下ZooKeeper+Hadoop2.6.0+HBase1.0.0 的HA机群高可用配置 1 硬件环境 2 软件环境 3 机群规划 4 集群配置 5 启动机群 6 HBase配置

Ubuntu 14.10 64位

2 软件环境

openjdk-7-jdk

hadoop 2.6.0

zookeeper-3.4.6

hbase-1.0.0

3 机群规划

3.1 zookeeper配置-机器结点

192.168.1.100 1421-0000
192.168.1.106 1421-0003
192.168.1.107 1421-0004
192.168.1.108 1421-0005
192.168.1.109 1421-0006

3.2 hadoop配置-机器结点

192.168.1.100 1421-0000 DN节点,Journal节点,zookeeper节点
192.168.1.101 1421-0001 备NN,DN节点
192.168.1.102 1421-0002 主NN
192.168.1.103 1423-0001 DN节点,主RM
192.168.1.104 1423-0002 DN节点,备RM
192.168.1.105 1423-0003 DN节点,JobHistory
192.168.1.106 1421-0003 DN节点,Journal节点,zookeeper节点
192.168.1.107 1421-0004 DN节点,Journal节点,zookeeper节点
192.168.1.108 1421-0005 DN节点,Journal节点,zookeeper节点
192.168.1.109 1421-0006 DN节点,Journal节点,zookeeper节点

说明:

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只有一个,存在单点故障,hadoop-2.4.1解决了这个问题,有两个ResourceManager,一个是Active,一个是Standby,状态由zookeeper进行协调

4 集群配置

机群的安装步骤大概如下:1 JDK配置;2 SSH免密码登录设置;3 ZooKeeper配置;4 Hadoop配置;5 HBase配置

4.1 Hadoop编译与基本配置

下载Hadoop稳定版,然后用mvn进行编译

mvn package -Pdist,native -DskipTests –Dtar

即可在其目录下:/hadoop-dist/target 就可以找到编译好的 hadoop 了。编译 过程需要 jdk,maven,protobuf 和 cmake 为基础。

SSH 也可通过 apt 进行下载,在生成 key 的时候指定密码为空,其他用回车跳过设置为默认即可,在 home 下的用户目录下,找到.ssh 文件夹,通过创建
文件夹 authorized_keys,主要 Shell 命令如下:
ssh-keygen -t rsa -P ''
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
其中 id_rsa.pub 位于.ssh 文件夹下,为 ssh 公钥,添加为信任方后,即可完成免密码登陆操作。

4.2 ZooKeeper配置

ZooKeeper的配置文件在conf中,名为zoo.conf,主要配置的内容位其log和data的磁盘路径,以及各个节点的基础信息。它本身提供了一个zoo_sample.cfg,我们将他复制一份,命名为

zoo.cfg,然后在其中添加一些配置,下面之列出新增的部分。

dataDir=/home/hadoop/software/cloud/zookeeper-3.4.6/zoodata
dataLogDir=/home/hadoop/software/cloud/zookeeper-3.4.6/zoolog


server.0=1421-0000:2888:3888
server.1=1421-0003:2888:3888
server.2=1421-0004:2888:3888
server.3=1421-0005:2888:3888
server.4=1421-0006:2888:3888

接下来需要在每个dataDir目录下新建myid文件,每个文件中输入响应的server.后面的数字,例如在1421-0000中的myid输入0.在各个目录下做相同处理,同时还要在每个文件夹建立dataDir和dataLogDir文件夹,这样ZooKeeper配置完毕  

4.3 Hadoop配置

4.3.1 将hadoop_home添加到系统环境变量中

4.3.2 配置hadoop-env.sh,添加JAVA_HOME

export JAVA_HOME=/usr/lib/jvm/java-1.7.0-openjdk-amd64

4.3.3 配置core-site.xml,主要配置ha.zookeeper.quorum等

<configuration>
    <property>
            <name>fs.defaultFS</name>
            <value>hdfs://hadoop-cluster</value>
     </property>

    <property>
            <name>ha.zookeeper.quorum</name>
            <value>1421-0000:2181,1421-0003:2181,1421-0004:2181,1421-0005:2181,1421-0006:2181</value>
     </property>

    <property>
        <name>hadoop.tmp.dir</name>
        <value>/home/hadoop/software/cloud/hadoop-2.6.0/tmp</value>
        <description>
          adoop的临时目录,其它目录会基于此路径。本地目录。只可以设置一个值;建议设置到一个足够空间的地方,而不是默认的/tmp下,服务端参数,修改需重启。本地路径
        </description>
    </property>
</configuration>

4.3.4 配置hdfs-site.xml,主要配置 dfs.nameservices、hdfs HA 特性、hdfs 副本数和 hdfs的 name 与 data 文件的磁盘存放位置,以及 SSH 文件夹位置。

<configuration>
        
    <property>
        <name>dfs.nameservices</name>
        <value>hadoop-cluster</value>
        <description>指定命名空间名称,可随易取</description>
    </property>

    <property>
        <name>dfs.ha.namenodes.hadoop-cluster</name>
        <value>nn1,nn2</value>
        <description>在命名空间下指定NameNode逻辑名</description>
    </property>

    <property>
        <name>dfs.namenode.rpc-address.hadoop-cluster.nn1</name>
        <value>1421-0002:9000</value>
        <description></description>
    </property>

    <property>
        <name>dfs.namenode.rpc-address.hadoop-cluster.nn2</name>
        <value>1421-0001:9000</value>
        <description></description>
    </property>

    <property>
        <name>dfs.namenode.http-address.hadoop-cluster.nn1</name>
        <value>1421-0002:50070</value>
        <description></description>
    </property>

    <property>
        <name>dfs.namenode.http-address.hadoop-cluster.nn2</name>
        <value>1421-0001:50070</value>
        <description></description>
    </property>

    <property>
        <name>dfs.namenode.servicerpc-address.hadoop-cluster.nn1</name>
        <value>1421-0002:53310</value>
        <description></description>
    </property>

    <property>
        <name>dfs.namenode.servicerpc-address.hadoop-cluster.nn2</name>
        <value>1421-0001:53310</value>
        <description></description>
    </property>

    <property>
        <name>dfs.ha.automatic-failover.enabled</name>
        <value>true</value>
        <description></description>
    </property>

    
    <property>
        <name>dfs.client.failover.proxy.provider.hadoop-cluster</name>
        <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
        <description>出现故障,哪个实现类负责执行故障切换</description>
    </property>
    
    <property>
        <name>dfs.ha.fencing.methods</name>
        <value>sshfence</value>
        <description>一旦NameNode切换,使用ssh方式进行操作</description>
    </property>

    <property>
        <name>dfs.ha.fencing.ssh.private-key-files</name>
        <value>/home/hadoop/.ssh/id_rsa</value>
        <description>如果使用ssh进行故障切换,使用ssh通信时用的密钥存储的位置  </description>
    </property>

    <property>
        <name>dfs.ha.fencing.ssh.connect-timeout</name>
        <value>3000</value>
        <description>ssh连接超时的最大时间</description>
    </property>

    <property>
        <name>dfs.journalnode.edits.dir</name>
        <value>/home/hadoop/software/cloud/hadoop-2.6.0/hdfs/journal</value>
        <description>配置项用于设置journalnode节点保存本地状态的目录。本地路径</description>
    </property>

    <property>
        <name>dfs.replication</name>
        <value>3</value>
        <description>数据备份数目</description>
    </property>

    <property>
        <name>dfs.namenode.shared.edits.dir</name>
        <value>qjournal://1421-0000:8485;1421-0003:8485;1421-0004:8485;1421-0005:8485;1421-0006:8485/hadoop-journal</value>
        <description>这是NameNode读写JNs组的uri。通过这个uri,NameNodes可以读写edit log内容。hadoop-journal指journalnode设置的“dfs.journalnode.edits.dir”下的本地路径</description>
    </property>

    <property>
        <name>dfs.namenode.name.dir</name>
        <value>/home/hadoop/software/cloud/hadoop-2.6.0/hdfs/name</value>
        <description>本地磁盘目录,NN存储fsimage文件的地方。可以是按逗号分隔的目录列表,fsimage文件会存储在全部目录,冗余安全。这里多个目录设定,最好在多个磁盘,另外,如果其中一个磁盘故障,不会导致系统故障,会跳过坏磁盘。由于使用了HA,建议仅设置一个。本地路径</description>
    </property>

        <property>
        <name>dfs.datanode.data.dir</name>
        <value>/home/hadoop/software/cloud/hadoop-2.6.0/hdfs/data</value>
        <description>本地磁盘目录,HDFS数据应该存储Block的地方。可以是逗号分隔的目录列表(典型的,每个目录在不同的磁盘)。这些目录被轮流使用,一个块存储在这个目录,下一个块存储在下一个目录,依次循环。每个块在同一个机器上仅存储一份。不存在的目录被忽略。必须创建文件夹,否则被视为不存在。本地路径</description>
    </property>
</configuration>

4.3.5 mapred-site.xml配置:

该文档主要配置 MapReduce 的计算框架类型和 Job 日志记录节点内容与保存路径即可,如需对 MapReduce 过程资源分配调优,则可以配置其 mapreduce.map.memory.mb、mapreduce.map.cpu.vcores、mapreduce.map.java.opts 等等,即对其 MapReduce 具体的每项流程进行资源配置,Map、Shuffle 和 Reduce 各占用的内存与 CPU 核数,是否压缩数据传递,在 Map 的到达百分之几时开始进行 Reduce 操作,并行数与 Shuffle 占 Reduce内存中的百分比等等

<configuration>
    <property>
           <name>mapreduce.framework.name</name>
           <value>yarn</value>
    </property>

    <property>
           <name>mapreduce.map.output.compress</name>
           <value>true</value>
    </property>

    <property>
           <name>mapreduce.reduce.shuffle.merge.percent</name>
           <value>0.66</value>
    </property>

    <property>
          <name>mapreduce.jobhistory.address</name>
          <value>1421-0003:10020</value>
    </property>
        
    <property>
          <name>mapreduce.jobhistory.webapp.address</name>
          <value>1421-0003:19888</value>
    </property>

    <property>
          <name>mapreduce.jobhistory.intermediate-done-dir</name>
          <value>/hadoop/mr_history/tmp</value>
          <description>
            参数解释:MapReduce作业产生的日志存放位置。HDFS路径
          </description>
    </property>

    <property>
          <name>mapreduce.jobhistory.done-dir</name>
          <value>/hadoop/mr_history/done</value>
          <description>
            参数解释:MR JobHistory Server管理的日志的存放位置。HDFS路径
          </description>
    </property>
</configuration>

4.3.6 yarn-site.xml:这里采用ResourceManager HA配置

<configuration>

        <!-- configeration for ResourceManger-->
        <property>
            <name>yarn.resourcemanager.hostname</name>
            <value>1423-0001</value>
        </property>    


        <!-- configeration for NodeManager-->
        <property>
               <name>yarn.nodemanager.aux-services</name>
               <value>mapreduce_shuffle</value>
        </property>

        <property>                                                                
        <name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name>
               <value>org.apache.hadoop.mapred.ShuffleHandler</value>
        </property>

        <property>                                                                
                <name>yarn.nodemanager.resource.memory-mb</name>
               <value>16384</value>
        </property>

        <property>                                                                
               <name>yarn.nodemanager.local-dirs</name>
               <value>/home/hadoop/software/cloud/hadoop-2.6.0/yarn/local</value>
               <description>
                数据写入本地文件系统路径的列表用逗号分隔,多条存储路径可以提高磁盘的读写速度
              </description>
        </property>

        <property>                                                                
               <name>yarn.nodemanager.log-dirs</name>
               <value>/home/hadoop/software/cloud/hadoop-2.6.0/yarn/log</value>
               <description>
                本地文件系统日志路径的列表逗号分隔,多条存储路径可以提高磁盘的读写速度
              </description>
        </property>

         <!-- HA 配置 =============================================================== -->
        <!-- Resource Manager Configs -->
        <property>
                <name>yarn.resourcemanager.connect.retry-interval.ms</name>
                <value>2000</value>
        </property>
        <property>
                <name>yarn.resourcemanager.ha.enabled</name>
                <value>true</value>
        </property>
        <property>
                <name>yarn.resourcemanager.ha.automatic-failover.enabled</name>
                <value>true</value>
        </property>
        <!-- 使嵌入式自动故障转移。HA环境启动,与 ZKRMStateStore 配合 处理fencing -->
        <property>
                <name>yarn.resourcemanager.ha.automatic-failover.embedded</name>
                <value>true</value>
        </property>
        <!-- 集群名称,确保HA选举时对应的集群 -->
        <property>
                <name>yarn.resourcemanager.cluster-id</name>
                <value>yarn-cluster</value>
        </property>
        <property>
                <name>yarn.resourcemanager.ha.rm-ids</name>
                <value>rm1,rm2</value>
        </property>
        <!-- 这里RM主备结点需要单独指定,(可选)
        <property>
                <name>yarn.resourcemanager.ha.id</name>
                <value>rm2</value>
        </property>
        -->
        <property>
                <name>yarn.resourcemanager.scheduler.class</name>
                <value>org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.FairScheduler</value>
        </property>
        <property>
                <name>yarn.resourcemanager.recovery.enabled</name>
                <value>true</value>
        </property>
        <property>
                <name>yarn.app.mapreduce.am.scheduler.connection.wait.interval-ms</name>
                <value>5000</value>
        </property>
        <!-- ZKRMStateStore 配置 -->
        <property>
                <name>yarn.resourcemanager.store.class</name>
                <value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value>
        </property>
        <property>
                <name>yarn.resourcemanager.zk-address</name>
                <value>1421-0000:2181,1421-0003:2181,1421-0004:2181,1421-0005:2181,1421-0006:2181</value>
        </property>
        <property>
                <name>yarn.resourcemanager.zk.state-store.address</name>
                <value>1421-0000:2181,1421-0003:2181,1421-0004:2181,1421-0005:2181,1421-0006:2181</value>
        </property>
        <!-- Client访问RM的RPC地址 (applications manager interface) -->
        <property>
                <name>yarn.resourcemanager.address.rm1</name>
                <value>1423-0001:23140</value>
        </property>
        <property>
                <name>yarn.resourcemanager.address.rm2</name>
                <value>1423-0002:23140</value>
        </property>
        <!-- AM访问RM的RPC地址(scheduler interface) -->
        <property>
                <name>yarn.resourcemanager.scheduler.address.rm1</name>
                <value>1423-0001:23130</value>
        </property>
        <property>
                <name>yarn.resourcemanager.scheduler.address.rm2</name>
                <value>1423-0002:23130</value>
        </property>
        <!-- RM admin interface -->
        <property>
                <name>yarn.resourcemanager.admin.address.rm1</name>
                <value>1423-0001:23141</value>
        </property>
        <property>
                <name>yarn.resourcemanager.admin.address.rm2</name>
                <value>1423-0002:23141</value>
        </property>
        <!--NM访问RM的RPC端口 -->
        <property>
                <name>yarn.resourcemanager.resource-tracker.address.rm1</name>
                <value>1423-0001:23125</value>
        </property>
        <property>
                <name>yarn.resourcemanager.resource-tracker.address.rm2</name>
                <value>1423-0002:23125</value>
        </property>
        <!-- RM web application 地址 -->
        <property>
                <name>yarn.resourcemanager.webapp.address.rm1</name>
                <value>1423-0001:23188</value>
        </property>
        <property>
                <name>yarn.resourcemanager.webapp.address.rm2</name>
                <value>1423-0002:23188</value>
        </property>
        <property>
                <name>yarn.resourcemanager.webapp.https.address.rm1</name>
                <value>1423-0001:23189</value>
        </property>
        <property>
                <name>yarn.resourcemanager.webapp.https.address.rm2</name>
                <value>1423-0002:23189</value>
        </property>
</configuration>

 4.3.7 配置slaves

1421-0000

1423-0001
1423-0002
1423-0003

1421-0003
1421-0004
1421-0005
1421-0006

4.3.8 配置masters

1421-0001

4.3.9 创建需要的目录

/home/hadoop/software/cloud/hadoop-2.6.0/hdfs/data  

/home/hadoop/software/cloud/hadoop-2.6.0/hdfs/name

/home/hadoop/software/cloud/hadoop-2.6.0/hdfs/journal

/home/hadoop/software/cloud/hadoop-2.6.0/tmp

/home/hadoop/software/cloud/hadoop-2.6.0/yarn/local

/home/hadoop/software/cloud/hadoop-2.6.0/yarn/log

5 启动机群

5.1 第一次启动

5.1.1 启动ZK:

在所有的 ZK 节点执行命令:zkServer.sh start,查看各个 ZK 的从属关系:zkServer.sh status 结果为 Mode: follower or leader,注意:哪个 ZK 节点会成为 leader 默认是通过 ZK 快速选举诞生的,这里就不介绍其快速选举的具体流程了。此时,在各个节点都可以查看到 ZK 进程,在 Shell 窗口下输入jps 即可,内容如下:

xxxx QuorumPeerMain
xxxx Jps

5.1.2 格式化ZK(仅第一次需要做)

任意 namenode 节点上执行:hdfs zkfc –formatZK

5.1.3 启动 ZKFC:

ZookeeperFailoverController 是用来监控 NN 状态,协助实现主备 NN 切换的,所以仅仅在主备 NN 节点上启动就行:hadoop-daemon.sh start zkfc,启动后我们可以看到 ZKFC 进程:

xxxx Jps
xxxx DFSZKFailoverController

5.1.4 启动JournalNode

启动用于主备 NN 之间同步元数据信息的共享存储系统 JournalNode,参见角色分配表,在各个 JN 节点上启动:hadoop-daemon.sh start journalnode,启动后在各个 JN 节点都可以看到 JournalNode 进程:

xxxx QuorumPeerMain
xxxx Jps
xxxx JournalNode

5.1.5 格式化并启动NN

格式化:hdfs namenode –format hadoop-cluster,注意:只有第一次启动系统时需格式化,请勿重复格式化。在主 NN 节点执行命令启动 NN:hadoop-daemon.sh start namenode

启动后可以看到 NN 进程:
xxxx Jps
xxxx NameNode
xxxx DFSZKFailoverController

5.1.6 在备 NN 上同步主 NN 的元数据信息:

hdfs namenode –bootstrapStandby,正常执行时的最后部分日志中,INFO util.ExitUtil: Exiting with status 后的数字为0 则是正常退出,即正常启动。而如果为其他数字,则需要到 hadoop 安装目录下的 log 中查询 namenode 启动失败的原因,根据其描述进行解决。

5.1.7 启动备 NN,在备 NN 上执行命令:hadoop-daemon.sh start namenode

5.1.8 设置主 NN

(这一步可以省略,这是在设置手动切换 NN 时的步骤,ZK 已经自动选择一个节点作为主 NN 了,如果两个节点都是Standby,那么可以用下面的命令设置主NN,但是因为是自动切换的,所以两个都是standby说明机群有问题)

hdfs haadmin -transitionToActive nn1

5.1.9 在主 NN 上启动 Datanode,在[nn1]上,启动所有 datanode:hadoop-daemons.sh start datanode

5.1.10 启动yarn:

因为namenode和resourcemanger都要战勇很大量资源,所以把他俩分开部署。首先在1423-0001启动yarn:start-yarn.sh,在备机启动RM:yarn-daemon.sh start resourcemanager

5.1.11 在运行 MRJS 的  1423-003上执行以下命令启动 MR JobHistory Server:mr-jobhistory-daemon.sh start historyserver

5.2 整个集群的启动与关闭

在之后如果没有特殊原因,可以通过命令 start-all.sh 和 stop-all.sh 分别启动或关闭整个 Hadoop 集群。

 5.3 测试Wordcount

bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.1.jar wordcount /hadoop/input/zookeeper.out /hadoop/output/wordcount

6 HBase配置

6.1 配置hbase-env.sh

export JAVA_HOME=/usr/lib/jvm/java-1.7.0-openjdk-amd64
export HBASE_MANAGES_ZK=false

6.2 配置hbase-site.xml

<configuration>
    <property>
        <name>hbase.rootdir</name>
        <value>hdfs://1421-0002:9000/hbase</value>
        <description></description>
    </property>

    <property>
        <name>hbase.cluster.distributed</name>
        <value>true</value>
        <description></description>
    </property>

    <property>
        <name>hbase.master</name>
        <value>1421-0002:6000</value>
        <description></description>
    </property>

    <property>
        <name>hbase.zookeeper.quorum</name>
        <value>1421-0000,1421-0003,1421-0004,1421-0005,1421-0006</value>
        <description></description>
    </property>

    <property>
        <name>hbase.zookeeper.property.clientPort</name>
        <value>2181</value>
        <description></description>
    </property>

    <property>
        <name>hbase.zookeeper.property.dataDir</name>
        <value>/home/hadoop/software/cloud/zookeeper-3.4.6/zoodata</value>
        <description></description>
    </property>

    <property>
        <name>hbase.zookeeper.property.logDir</name>
        <value>/home/hadoop/software/cloud/zookeeper-3.4.6/zoolog</value>
        <description></description>
    </property>

</configuration>

6.3 配置regionservers:这里将所有的DN作为regionservers

1421-0000
1421-0001

1423-0001
1423-0002
1423-0003

1421-0003
1421-0004
1421-0005
1421-0006

6.4 启动

Hbase 的启动非常简单,只需要在主节点上输入 start-hbase.sh 即可启动HMaster 与 HRegionServer 守护进程。

7 常见问题

7.1 在我修改了整个机群的机器名和hadoop,zookeeper配置后,在启动hadoop,发现两个namenode都是standby,之前都是好好的,但是又一次启动之后发现两个NN都是standby,那么只能手动切换了,但是手动切换后刚开始是好的,但是过了一小会就海变成了standby,后来看日志发现可能是因为修改了机器名,但是没有重新格式化,导致了文件中主机名不一致,其中有一个错误是关于ZK中edit的,然后只能重新格式化NN,格式化完就好了,但是数据没备份,没了。。

hdfs haadmin -transitionToActive --forcemanual nn1

附上一些实用命令

执行命令“hdfs  haadmin”,会显示子命令列表,如下

Usage: DFSHAAdmin [-ns <nameserviceId>]
    [-transitionToActive <serviceId>]
    [-transitionToStandby <serviceId>]
    [-failover [--forcefence] [--forceactive] <serviceId> <serviceId>]
    [-getServiceState <serviceId>]
    [-checkHealth <serviceId>]
    [-help <command>]
如果要查看具体用法,使用“hdfs  haadmin  -help  <command>”。其中,
transitionToActivetransitionToStandby是用于在不同状态之间切换的。这些命令没有任何防护错误,很少使用。
failover 初始化一个故障恢复。该命令会从一个失效的NameNode切换到另一个上面。
getServiceState 获取当前NameNode的状态。
checkHealth 检查NameNode的状态。正常就返回0,否则返回非0值。