hadoop 和 hbase 高可用模式部署

本贴最后更新于 2200 天前,其中的信息可能已经时移世异

记录 apache 版本的 hadoop 和 hbase 的安装,并启用高可用模式。

1. 主机环境

我这里使用的操作系统是 centos 6.5,安装在 vmware 上,共三台。

主机名 IP 操作系统 用户名 安装目录
node1 192.168.1.101 centos 6.5 wxyuan /opt/hadoop,/opt/hbase
node2 192.168.1.102 centos 6.5 wxyuan /opt/hadoop,/opt/hbase
node3 192.168.1.103 centos 6.5 wxyuan /opt/hadoop,/opt/hbase

2. 集群规划

node1 node2 node3
NameNode NameNode
DataNode DataNode DataNode
DFSZKFailoverController DFSZKFailoverController
ResourceManager ResourceManager
NodeManager NodeManager NodeManager
JournalNode JournalNode JournalNode
HMaster HMaster
HRegionServer HRegionServer HRegionServer
Zookeeper Zookeeper Zookeeper

hadoop、hbase、zookeeper 和 jdk 的版本信息如下:

组件 版本号
JDK 1.7.079
Hadoop 2.6.0
HBase 1.1.3
Zookeeper 3.4.6

下载地址:
JDK: http://www.oracle.com/technetwork/java/javase/downloads/java-archive-downloads-javase7-521261.html
zookeeper: http://archive.apache.org/dist/zookeeper/
hadoop: https://archive.apache.org/dist/hadoop/core/
hbase: http://archive.apache.org/dist/hbase/

hadoop 和 bhase 的高可用依赖于 zookeeper,所以需要安装 zookeeper 集群.关于 JDK 和 zookeeper 的安装,这里不再叙述。

3. 配置 SSH 免密码登陆

高可用模式下,hadoop 的故障切换需要通过 ssh 登陆到其它机器,进行主备切换,因此需要配置主机间的免密码登陆。配置方式可参考 Linux 配置 ssh 免密码登陆

4. 安装 hadoop

我这里安装使用的是普通用户(非 root 安装),下载的版本是 hadoop-2.6.0.tar.gz。

4.1 修改配置文件

(1). 上传 hadoop-2.6.0.tar.gz 到/opt/hadoop 目录下;
(2). 解压 tar -zxvf hadoop-2.6.0.tar.gz;
(3). 修改配置文件:core-site.xml,hdfs-site.xml,yarn-site.xml,mapred-site.xml,配置文件在/opt/hadoop/hadoop-2.6.0/etc/hadoop 目录下;
修改 core-site.xml,内容如下:

<configuration>
    <!-- hdfs连接地址,集群模式(高可用) -->
    <property>
        <name>fs.defaultFS</name>
        <value>hdfs://cluster</value>
    </property>
    <!-- namenode,datanode数据存放目录 -->
    <property>
        <name>hadoop.tmp.dir</name>
        <value>/opt/hadoop/hadoop-2.6.0/tmp</value>
    </property>
    <!-- zookeeper地址 -->
    <property>
        <name>ha.zookeeper.quorum</name>
        <value>node1:2181,node2:2181,node3:2181</value>
    </property> 
</configuration>

修改 hdfs-site.xml,内容如下:

<configuration>

    <property>  
        <name>dfs.nameservices</name>  
        <value>cluster</value>  
    </property>  

    <property>  
        <name>dfs.ha.namenodes.cluster</name>  
        <value>nn01,nn02</value>  
    </property>
    <!-- nn01的RPC通信地址 -->
    <property>  
        <name>dfs.namenode.rpc-address.cluster.nn01</name>  
        <value>node1:9000</value>  
    </property>  
    <!-- nn01的http通信地址 -->
    <property>  
        <name>dfs.namenode.http-address.cluster.nn01</name>  
        <value>node1:50070</value>  
    </property>  
     <!-- nn02的RPC通信地址 -->
    <property>  
        <name>dfs.namenode.rpc-address.cluster.nn02</name>  
        <value>node2:9000</value>  
    </property>  
    <!-- nn02的http通信地址 -->
    <property>  
        <name>dfs.namenode.http-address.cluster.nn02</name>  
        <value>node2:50070</value>  
    </property>  
    <!-- 指定NameNode的元数据在JournalNode上的存放位置 -->
    <property>  
        <name>dfs.namenode.shared.edits.dir</name>  
        <value>qjournal://node1:8485;node2:8485;node3:8485/cluster</value>  
    </property>  
    <!-- 指定JournalNode在本地磁盘存放数据的位置 -->
    <property>  
        <name>dfs.journalnode.edits.dir</name>  
        <value>/opt/hadoop/hadoop-2.6.0/journaldata</value>  
    </property>  
    <!-- 开启NameNode故障时自动切换 -->
    <property>  
        <name>dfs.ha.automatic-failover.enabled</name>  
        <value>true</value>  
    </property>  
    <!-- 配置失败自动切换实现方式 -->
    <property>  
        <name>dfs.client.failover.proxy.provider.cluster</name>  
        <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>  
    </property>  
     <!-- 配置隔离机制,需要ssh免登陆,默认端口22 -->
    <property>  
        <name>dfs.ha.fencing.methods</name>  
        <value>sshfence</value>  
    </property>
    <!--<property>
             <name>dfs.ha.fencing.methods</name>
             <value>sshfence(hadoop:22022)</value>
    </property>-->
    
    <!-- 如果使用ssh进行故障切换,ssh通信所需要的密钥存储位置。注意:密钥默认保存在当前用户家目录的.ssh目录下,请根据实际情况修改 -->
    <property>  
        <name>dfs.ha.fencing.ssh.private-key-files</name>  
        <value>/home/wxyuan/.ssh/id_rsa</value>  
    </property>  

    <!-- connect-timeout超时时间 -->
    <property>  
        <name>dfs.ha.fencing.ssh.connect-timeout</name>  
        <value>30000</value>  
    </property>  

</configuration>

修改 yarn-site.xml,内容如下:

<configuration>
    <!-- 启用HA高可用性 -->
    <property>  
       <name>yarn.resourcemanager.ha.enabled</name>  
       <value>true</value>  
    </property>  

    <!-- 指定resourcemanager的名字 -->
    <property>  
       <name>yarn.resourcemanager.cluster-id</name>  
       <value>yrc</value>  
    </property>  

    <!-- 配置2个resourcemanager -->
    <property>  
       <name>yarn.resourcemanager.ha.rm-ids</name>  
       <value>rm1,rm2</value>  
    </property>  

    <property>  
       <name>yarn.resourcemanager.hostname.rm1</name>  
       <value>node1</value>  
    </property>  
    <property>  
       <name>yarn.resourcemanager.hostname.rm2</name>  
       <value>node2</value>  
    </property>  

    <property>  
       <name>yarn.resourcemanager.zk-address</name>  
       <value>node1:2181,node2:2181,node3:2181</value>  
    </property> 

     <!-- 指定nodemanager启动时加载server的方式为shuffle server -->
    <property>  
       <name>yarn.nodemanager.aux-services</name>  
       <value>mapreduce_shuffle</value>  
    </property> 
</configuration>

修改 mapred-site.xml(该文件不存在,需要手动创建),cp mapred-site.xml.template mapred-site.xml,内容如下:

<configuration>
<!-- 采用yarn作为mapreduce的资源调度框架 -->
    <property>  
        <name>mapreduce.framework.name</name>  
        <value>yarn</value>  
    </property>  
</configuration>

(4) 修改 slaves 文件 vim slaves,内容如下:

node1
node2
node3

(5) 修改 hadoop-env.sh 文件,指定 jdk 的地址

# The java implementation to use.
export JAVA_HOME=/opt/java/jdk1.7.0_79

(6) 配置用户的环境变量,vim ~/.bash_profile,增加如下内容

# hadoop environment variables 
export HADOOP_HOME=/opt/hadoop/hadoop-2.6.0
export PATH=$HADOOP_HOME/bin:$PATH

4.2 拷贝复制到其它机器

scp -r /opt/hadoop/hadoop-2.6.0 wxyuan@node2:/opt/hadoop
scp -r /opt/hadoop/hadoop-2.6.0 wxyuan@node3:/opt/hadoop

4.3 启动 hadoop

启动 hadoop 前,需要执行几步格式化操作:
(1) 启动 journalnode,三台机器都要这一步操作(仅第一次启动 hadoop 时,需要这一步操作,之后不再需要手动启动 journalnode)

cd /opt/hadoop/hadoop-2.6.0/sbin
sh hadoop-daemon.sh start journalnode

(2) 在 node1 上执行格式化操作,格式化 namenode 和 zkfc

hdfs namenode -format
hdfs zkfc -formatZK

(3) namenode 主从信息同步:复制 node1 上的/opt/hadoop/hadoop-2.6.0/tmp 目录到 node2 的/opt/hadoop/hadoop-2.6.0 目录下,

scp -r /opt/hadoop/hadoop-2.6.0/tmp wxyuan@node2:/opt/hadoop/hadoop-2.6.0

上述步骤完成后,接下来我们就可以启动 hadoop 了,在 node1 机器上执行下面的命令,

# 启动hdfs
cd /opt/hadoop/hadoop-2.6.0/sbin
sh start-dfs.sh
# 启动yarn
sh start-yarn.sh

在 node2 机器上启动 ResourceManager(备用主节点的 ResourceManager 需要手动启动)

cd /opt/hadoop/hadoop-2.6.0/sbin
sh yarn-daemon.sh start resourcemanager

在每台机器上,使用 jps 命令可查看启动的进程,这里以我的机器为例,查看相关进程
node1 机器

[wxyuan@node1 sbin]$ jps
13245 NameNode
11922 DataNode
12228 DFSZKFailoverController
11654 QuorumPeerMain
12328 ResourceManager
12423 NodeManager
11439 JournalNode

node2 机器

[wxyuan@node2 ~]$ jps
9025 NodeManager
8546 JournalNode
9183 ResourceManager
8472 QuorumPeerMain
8945 DFSZKFailoverController
8717 NameNode
8782 DataNode

node3 机器

[wxyuan@node3 ~]$ jps
8464 QuorumPeerMain
8655 DataNode
8534 JournalNode
8789 NodeManager

4.4 web 界面查看 hadoop 信息

(1) 浏览器访问 http://node1:50070
hadoop-node1.png
可以看到,当前节点 node1 处于 active 状态。
浏览器访问 http://node2:50070
hadoop-node2.png
可以看到,当前节点 node2 处于 standby 状态。
(2) 查看每个 datanode 的信息,http://node1:50075 、http://node2:50075 、http://node3:50075
(3) 查看 yarn 的 web 控制台,浏览器访问 http://node1:8088/cluster
yarn.png

4.5 测试高可用

(1) 在 node1 节点上执行 jps 命令,查看 namenode 进程的 pid,使用 kill 命令杀死该进程,此时浏览器访问 http://node2:50070 ,可以看到状态已经变成 active。
(2) 重新启动 node1 的 namenode,sh start-dfs.sh,浏览器访问 http://node1:50070 ,可以看到此时状态已经变成 standby。
注意:hadoop 进程日志位于/opt/hadoop/hadoop-2.6.0/logs 目录下。

5. 安装 hbase

这里我下载的版本是 hbase-1.1.3-bin.tar.gz

5.1 修改配置文件

(1). 上传 hadoop-2.6.0.tar.gz 到/opt/hbase 目录下;
(2). 解压 tar -zxvf hbase-1.1.3-bin.tar.gz;
(3). 修改配置文件:hbase-env.sh,hbase-site.xml,配置文件在/opt/hbase/hbase-1.1.3/conf 目录下;
对于 hbase-env.sh,需要修改的内容有三处:

//指定jdk目录
# The java implementation to use.  Java 1.7+ required.
export JAVA_HOME=/opt/java/jdk1.7.0_79

//指定pid文件目录
# The directory where pid files are stored. /tmp by default. 
export HBASE_PID_DIR=/opt/hbase/hbase-1.1.3/pids

//禁用HBase自带的Zookeeper,因为我们是使用独立的Zookeeper
# Tell HBase whether it should manage it's own instance of Zookeeper or not.                                                  
export HBASE_MANAGES_ZK=false   

修改 hbase-site.xml,内容如下:

<configuration>
    <property>
        <name>hbase.rootdir</name>
        <value>hdfs://cluster/hbase</value>
    </property>
  <property>
        <name>hbase.cluster.distributed</name>
        <value>true</value>
  </property>
  <property>
        <name>hbase.zookeeper.quorum</name>
        <value>node1:2181,node2:2181,node3:2181</value>
  </property>
  <property>
        <name>hbase.tmp.dir</name>
        <value>/opt/hbase/hbase-1.1.3/tmp/hbase</value>
  </property>
  <property>
        <name>hbase.zookeeper.property.dataDir</name>
        <value>/opt/hbase/hbase-1.1.3/tmp/data</value>
  </property>
  <property>
        <name>hbase.regionserver.restart.on.zk.expire</name>
        <value>true</value>
  </property>
  <property>
        <name>hbase.master.info.port</name>
        <value>60010</value>
  </property>
</configuration>

(4) 拷贝/opt/hadoop/hadoop-2.6.0/etc/hadoop 目录下的 core-site.xml 和 hdfs-site.xml 文件到/opt/hbase/hbase-1.1.3/conf 下,如果缺少这两个文件,启动 hbase 时会出现未知主机的异常,导致进程启动失败
(5) 修改 regionservers 文件

node1
node2
node3

(6) 新增 backup-masters 文件 vim /opt/hbase/hbase-1.1.3/conf/backup-master,内容如下:

node2

(7) 配置用户的环境变量,vim ~/.bash_profile,增加如下内容:

# hbase environment variables
export HBASE_HOME=/opt/hbase/hbase-1.1.3
export PATH=$HBASE_HOME/bin:$PATH

5.2 拷贝复制到其它机器

scp -r /opt/hbase/hbase-1.1.3 wxyuan@node2:/opt/hbase
scp -r /opt/hbase/hbase-1.1.3 wxyuan@node3:/opt/hbase 

5.3 启动 hbase 进程

cd /opt/hbase/hbase-1.1.3/bin
sh start-hbase.sh

使用 jsp 命令可查看 hbase 相关进程:HMaster、HRegionServer

5.4 登陆 web 界面查看 hbase 信息

(1) 浏览器访问 http://node1:60010, 可以看到 node1 是 master
hbase-node1.png
(2) 浏览器访问 http://node2:60010
hbase-node2.png

5.5 高可用测试

(1) 在 node1 节点上执行 jps 命令,查看 HMaster 进程的 pid,使用 kill 命令杀死该进程,此时浏览器访问 http://node2:60010 ,可以看到 node2 变成了 master。
(2) 重新启动 node1 的 HMaster,sh start-hbase.sh,http://node1:60010
注意:hbase 进程日志位于/opt/hbase/hbase-1.1.3/logs 目录下。

关于 hbase 基本的 shell 命令,可参考 HBase shell 基本命令介绍

  • B3log

    B3log 是一个开源组织,名字来源于“Bulletin Board Blog”缩写,目标是将独立博客与论坛结合,形成一种新的网络社区体验,详细请看 B3log 构思。目前 B3log 已经开源了多款产品:SymSoloVditor思源笔记

    1063 引用 • 3453 回帖 • 203 关注
  • HBase

    HBase 是一个分布式的、面向列的开源数据库,该技术来源于 Fay Chang 所撰写的 Google 论文 “Bigtable:一个结构化数据的分布式存储系统”。就像 Bigtable 利用了 Google 文件系统所提供的分布式数据存储一样,HBase 在 Hadoop 之上提供了类似于 Bigtable 的能力。

    17 引用 • 6 回帖 • 73 关注
  • Hadoop

    Hadoop 是由 Apache 基金会所开发的一个分布式系统基础架构。用户可以在不了解分布式底层细节的情况下,开发分布式程序。充分利用集群的威力进行高速运算和存储。

    86 引用 • 122 回帖 • 625 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...