hbase原理是什么其工作原理

温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!&&|&&
LOFTER精选
网易考拉推荐
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
阅读(183)|
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
历史上的今天
在LOFTER的更多文章
loftPermalink:'',
id:'fks_',
blogTitle:'HBase是什么其工作原理',
blogAbstract:'\r\nHBase是什么\r\nHBase是Apache Hadoop中的一个子项目,Hbase依托于Hadoop的HDFS作为最基本存储基础单元,通过使用hadoop的DFS工具就可以看到这些这些数据 存储文件夹的结构,还可以通过Map/Reduce的框架(算法)对HBase进行操作,如下图所示:\r\n\r\nHBase在产品中还包含了Jetty,在HBase启动时采用嵌入式的方式来启动Jetty,因此可以通过web界面对HBase进行管理和查看当前运行的一些状态,非常轻巧方便。\r\nHBase是Apache Hadoop中的一个子项目,现已成为Apache的顶级项目。\r\nHBase是Google Bigtable(基于Google File System)的开源山寨版本。\r\n',
blogTag:'',
blogUrl:'blog/static/',
isPublished:1,
istop:false,
modifyTime:0,
publishTime:4,
permalink:'blog/static/',
commentCount:0,
mainCommentCount:0,
recommendCount:0,
bsrk:-100,
publisherId:0,
recomBlogHome:false,
currentRecomBlog:false,
attachmentsFileIds:[],
groupInfo:{},
friendstatus:'none',
followstatus:'unFollow',
pubSucc:'',
visitorProvince:'',
visitorCity:'',
visitorNewUser:false,
postAddInfo:{},
mset:'000',
remindgoodnightblog:false,
isBlackVisitor:false,
isShowYodaoAd:false,
hostIntro:'',
hmcon:'1',
selfRecomBlogCount:'0',
lofter_single:''
{list a as x}
{if x.moveFrom=='wap'}
{elseif x.moveFrom=='iphone'}
{elseif x.moveFrom=='android'}
{elseif x.moveFrom=='mobile'}
${a.selfIntro|escape}{if great260}${suplement}{/if}
{list a as x}
推荐过这篇日志的人:
{list a as x}
{if !!b&&b.length>0}
他们还推荐了:
{list b as y}
转载记录:
{list d as x}
{list a as x}
{list a as x}
{list a as x}
{list a as x}
{if x_index>4}{break}{/if}
${fn2(x.publishTime,'yyyy-MM-dd HH:mm:ss')}
{list a as x}
{if !!(blogDetail.preBlogPermalink)}
{if !!(blogDetail.nextBlogPermalink)}
{list a as x}
{if defined('newslist')&&newslist.length>0}
{list newslist as x}
{if x_index>7}{break}{/if}
{list a as x}
{var first_option =}
{list x.voteDetailList as voteToOption}
{if voteToOption==1}
{if first_option==false},{/if}&&“${b[voteToOption_index]}”&&
{if (x.role!="-1") },“我是${c[x.role]}”&&{/if}
&&&&&&&&${fn1(x.voteTime)}
{if x.userName==''}{/if}
网易公司版权所有&&
{list x.l as y}
{if defined('wl')}
{list wl as x}{/list}利用BulkLoad向Hbase插入数据过程详解
写在开头:花了差不多有一个多星期的时间来尝试使用BulkLoad向Hbase插入数据,遇到了好多问题,也走了好多弯路。现在配置成功,给大家一个参考,方便他人。赠人玫瑰,手留余香。
在使用bulkload进行手动Hbase插入的过程:
我们使用的是hadoop-1.0.3,相应的Hbase版本为hbase-0.94.3
(其他的版本可能遇到的问题会不一样,这里大家参考就好)
1.将3个包:guava-11.0.2.jar、zookeeper-3.4.3.jar、protobuf-java-2.4.0a.jar放到$HADOOP_HOME/lib下
2.Hadoop配置:
去掉hadoop-env.sh里HADOOP_CLASSPATH前的注释,并在其前一行添加HBASE_HOME,如下,
export HBASE_HOME = XXX
HADOOP_CLASSPATH=$HBASE_HOME/hbase-X.X.X.jar:$HBASE_HOME/hbase-X.X.X-test.jar:$HBASE_HOME/conf:${HBASE_HOME}/lib/zookeeper-X.X.X.jar:${HBASE_HOME}/lib/guava-11.0.2.jar
3.将$HBASE_HOME/conf下的hbase-site.xml拷到$HADOOP_HOME/conf目录下,将$HBASE_HOME/下的hbase-X.X.X.jar拷到$HADOOP_HOME/lib目录下,并启动/重启hadoop和hbase
4.将文档上传到hdfs上(我们这里将Hfile文件上传到hdfs的/hongjian目录下)
hadoop fs -put ../zm_GraduateStudent-S-PO /hongjian
5.在HBase新建将要导入的表(只需要表名和列族名)
'zm_GraduateStudent-S-PO','d','f'(这里我们新建表"zm_GraduateStudent-S-PO",rowkey是默认的,有两个列族分别为"d"和"f")
后来发现,其实创建表名,bulkload的过程也会自动在hbase中自动创建相应的表。
6.上传数据
$HADOOP_HOME/bin/hadoop jar $HBASE_HOME/hbase-0.94.3.jar
&completebulkload&hdfs://master:54310/hongjian/zm_GraduateStudent-S-PO
zm_GraduateStudent-S-PO
整个过程遇到很多问题,具体的解决办法,列举如下:
1、如果报错Caused by: java.lang.IllegalStateException: The value of
the hbase.metrics.showTableName&conf option has
not been specified in
SchemaMetrics的问题的话,这是hbase-0.94.3的bug,需要更新。
在https://issues.apache.org/jira/browse/HBASE-4802这里下载patch文件,
在src的父目录下,执行patch -p0 & *3*
*3*指的是patch的目录地址
然后用maven进行重新编译:mvn package -Dmaven.test.skip.exec=true
如果你没有安装maven的话,在http://maven.apache.org/download.cgi下载一个maven,然后执行
mvn package -Dmaven.test.skip.exec=true
此过程需要联网,下载相应的依赖。
2、bulkload这个命令只能执行一遍,执行之后,hdfs里面的数据会被移动插入到hbase里面。其实bulkload的过程就是一个移动数据的过程。
如果重复bulkload,会报错如下:
$HADOOP_HOME/bin/hadoop jar $HBASE_HOME/hbase-0.94.3.jar
&completebulkload&hdfs://master:54310/hongjian/*1*
*1*指的是你的Hfile文件目录&
*2*指的是你在Hbase中需要插入的表名
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。当前位置: > HBase 之 HMaster 工作原理
HBase 之 HMaster 工作原理时间:日11:04来源:IT168网
原标题:HBase 之 HMaster 工作原理
  HMaster  监控所有的RegionServer,一般运行在namenode  架构图  从图中可以看出,主要有External Interfaces、Executor Services、Zookeeper System Trackers、File System Interfaces、Chores和Others六部分组成  1. External InterfacesInfoServer, 一个jetty部署的web应用,默认端口  60010,查看集群状态。RpcServer,提供rpc与master的通信方式,支持Writable和protobuf。Master MXBean,提供JMX查询状态metrics,知道有就好,一般也用不上。  2. Executor Services  监听Zookeeper的消息队列,交给各种handler处理  Open Region Service,当master监测到一个region成功运行(通过ZK的watch机制),发送一个消息RS ZKREGION_OPENED给这个service,这个事件会触发OpenRegionHandler方法。Close Region Service,同上,消息为:RS ZKREGION_CLOSEDServer Operations Service, master检测到有region需要split,交给SplitRegionHandler处理,同时,master需要关闭一个region非root或meta,发送一条消息:M SERVERSHUTDOWN ,交给ServerShutdownHandler处理Meta Server Operation Service,当关闭的region是ROOT或者META的宿主机,Table Operation Service,对表的删除、disable、enable、修改、创建,  3. Zookeeper System Trackers  master或者regionServer是通过zokeeper实现跟踪特定的消息事件  Active Master Manager,处理master的所有时间,包括master的选举Region Server Tracker,维护region的一个list,挂载到/hbase/rs目录下,任何region的新增和删除,都在这个目录下Drainning Server Tracker,region server退役之后,转变成draining Server挂载在/hbase_root/drainingCatalog Tracker,-ROOT或者.METACluster Status Tracker,集群是否正常启动Assignment Manager,当master挂掉之后,可以通过这里找到过渡时期的regionRoot Region Tracker,监控root的位置和状态变化Load Balance,决定是否要在RegionServer之中移动RegionMeta Node TrackerMaster Address Tracker  4. File System InterfacesMasterFileSystem,抽象的一个文件系统Log Cleaner,一个后台任务(chores),默认有两个TimeToLiveLogCleaner和ReplicationLogCleaner,可以自己实现,添加到配置中。HFile Cleaner一个HBase内置的周期性的任务。默认有一个TimeToLiveHFileCleaner在执行,可以自己实现,添加到配置中。  5. ChoresBalancer Chore,用来平衡hdfs机群的datanode是否平衡,有一个可配置的阈值,一般是10%,会检查所有node的使用率,自动迁移blocks。Catalog Janitor Chore,一个检查catelog的任务,查看未使用的regions,进行垃圾回收Log Cleaner Chore(同上)HFile Cleaner Chore (同上)  6. OthersServer Manager,维护regionserver的信息,维护online和dead的server,处理regionServer的启动、关闭、死亡Co-Processor Host,通用的框架和Hbase服务调用,自己实现hbase的二级索引的时候一般会用到。  分享到:  0 个人觉得赞好文章 点个赞您已经赞过了+1
本文相关推荐
16-03-0116-03-1116-03-2616-03-3016-04-0116-04-18
Copyright ©
All Right Reserved. 今日热点新闻网所有文章来源网络,如有侵权请联系我们删除!为Hbase建立高可用性多主节点 - ImportNew
| 标签: , , ,
Hadoop与HBase的设计中的从节点能够进行自动错误恢复。因为集群中存在大量的机器,所以很可能出现单台服务器的硬件错误或者单个从节点的异常。
至于主节点,HBase自身是不存在单点故障(Single Point of Failure – SPOF)的。HBase使用ZooKeerper作为中央控制服务。ZooKeeper用于三台以上的服务器集群之中,只要还有超过半数的服务器在线,ZooKeeper就能够正常提供服务。
HBase将活动主节点、域根节点服务器(root region server)地址以及其它重要的运行数据存放于ZooKeeper。因此,我们就可以在其它机器上开启两个或多个HMaster守护进程,其中第一个启动的HMaster作为HBase机器的活动主节点。
不过,HDFS的NameNode可能引起集群的单点故障。NameNode保存了HDFS全部文件系统的镜像在自己的本地存储之中。一旦NameNode异常,HDFS就无法使用了,导致HBase也无法使用。HDFS当中还有一个Secondary NameNode,它并不是一个备份NameNode,只是提供了一个NameNode的时间点保存镜像(checkpoint)。所以HBase集群的高可用性(highly available),实际上就是保持NameNode的高可用性。
本文中,我们将描述如何搭建两台高可用性的主节点,节点之间使用Heartbeat 互相探测。Heartbeat在Linux集群的HA的方案中被广泛使用,用于通讯与身份识别。Heartbeat 需要与集群资源管理(Cluster Resource Manager – CRM)绑定用于启动和停止集群服务。Heartbeat 推荐使用集群资源管理器来实现。我们将使用Heartbeat 和Pacemaker来搭建一个虚拟IP(Virtual IP – VIP)地址,然后将它与活动的主节点关联起来。因为EC2不支持静态IP,所以我们不能够在EC2上面实现上述方案,但我们将使用弹性IP(Elastic IP – EIP)来达到我们的目的。
我们主要着眼于建立NameNode和HBase,你也可以使用相似的方式来建立JobTracker节点。
你应当已经安装好HDFS与HBase。我们需要使用一台已经准备好的机器建立一个备用的主节点(master2),确认所有的依赖都已经被正确的配置好了,将Hadoop与HBase的根目录从活动的主节点(master1)同步到备份节点上。
我们同样也需要NFS。搭建好NFS服务器,从 master1 和 master2 上挂载相同的NFS目录。确认hadoop用户在NFS目录中有写权限。在NFS中建立目录存储Hadoop的元信息(metadata)。我们假设该目录为/mnt/nfs/hadoop/dfs/name.
我们为两个主节点建立虚拟IP,假设IP地址与DNS映射如下:
master1: IP地址为 10.174.14.11
master2: IP地址为 10.174.14.12
master: IP地址为 10.174.14.10稍后会设置为虚拟IP
下面开始介绍如何建立两台高可用性主节点。
安装并配置Heartbeat 与Pacemaker
首先,我们安装Heartbeat 与Pacemaker,并且做一些配置
在 master1 and master2 上执行如下命令以安装Heartbeat 与Pacemaker(在centos 6.0 64x,使用yum可以安装,译者注):
root# apt-get install heartbeat cluster-glue cluster-agents pacemaker
在 master1 与master2 上对Heartbeat 进行如下配置:
root# vi /etc/ha.d/ha.cf
# enable pacemaker, without stonith
# 开启pacemaker,不使用stonith
# (译者注:STONITH这个名词为“Shoot The Other Node In The Head” .
# STONITH的作用便是当宕机发生时,主要服务器可以藉此功能让备份服务器开机,以避免备份服务器启用浮动IP与相关服务,
# 与主要服务器互抢控制权)
# log where ?
logfacility local0
# warning of soon be dead
warntime 10
# declare a host (the other node) dead after:
deadtime 20
# dead time on boot (could take some time until net is up)
initdead 120
# time between heartbeats
keepalive 2
# the nodes
node master1
node master2
# heartbeats, over dedicated replication interface!
ucast eth0 master1 # ignored by master1 (owner of ip)
ucast eth0 master2 # ignored by master2 (owner of ip)
# ping the name server to assure we are online
建立认证(authkeys )文件,在master1 与master2 上使用root用户执行下述脚本:
root# ( echo -ne “auth 1\n1 sha1 “; \
dd if=/dev/urandom bs=512 count=1 | openssl md5 ) \
& /etc/ha.d/authkeys
root# chmod 0600 /etc/ha.d/authkeys
创建并安装一个NameNode资源代理
Pacemaker 需要依靠资源代理来管理集群。在我们的例子中,虚拟IP和HDFS的NameNode服务就是希望用Pacemaker管理的集群资源。Pacemaker通过IP地址资源代理来管理虚拟IP,因此只需要建立NameNode的资源代理:
1 在 master1 和master2 的root用户下的 .bashrc 文件加入环境变量,别忘记在系统中应用这些变动:
root# vi /root/.bashrc
export JAVA_HOME=/usr/local/jdk1.6
export HADOOP_HOME=/usr/local/hadoop/current
export OCF_ROOT=/usr/lib/ocf
执行如下命令来应用上述修改:
root# source /root/.bashrc
建立一个名为namenode的标准开放集群框架(Open Clustering Framework - OCF)资源代理文件。Namenode资源代理文件文件开头包含如下内容:
root# vi namenode
: ${OCF_FUNCTIONS_DIR=${OCF_ROOT}/resource.d/heartbeat}
. ${OCF_FUNCTIONS_DIR}/.ocf-shellfuncs
echo &Usage: $0 {start|stop|status|monitor|meta-data|validate-all}&
添加meta_data() 方法。该方法将资源代理的元数据导出到标准输出。每个资源代理都需要有一组对于自身目标以及支持参数的XML元数据描述:
root# vi namenode
meta_data() {cat &&END
&?xml version=&1.0&?&
&!DOCTYPE resource-agent SYSTEM &ra-api-1.dtd&&
&resource-agent name=&namenode&&
&version&0.1&/version&
&longdesc lang=&en&&
This is a resource agent for NameNode. It manages HDFS namenode daemon.
&/longdesc&
&shortdesc lang=&en&&Manage namenode daemon.&/shortdesc&
&parameters&&/parameters&
&action name=&start& timeout=&120& /&
&action name=&stop& timeout=&120& /&
&action name=&status& depth=&0& timeout=&120& interval=&120& /&
&action name=&monitor& depth=&0& timeout=&120& interval=&120& /&
&action name=&meta-data& timeout=&10& /&
&action name=&validate-all& timeout=&5& /&
&/actions&
&/resource-agent&
添加namenode_start() 方法。Pacemaker使用这个方法在服务器上开启NameNode的守护进程。在这个方法中,我们检测NameNode是否已经启动,如果未启动,我们通过hadoop用户执行hadoop-daemon.sh 来启动:
root# vi namenode
namenode_start() {
# if namenode is already started on this server, bail out early
namenode_status
if [ $? -eq 0 ]; then
ocf_log info &namenode is already running on this server, skip&
return $OCF_SUCCESS
# start namenode on this server
ocf_log info &Starting namenode daemon...&
su - hadoop -c &${HADOOP_HOME}/bin/hadoop-daemon.sh start name node&
if [ $? -ne 0 ]; then
ocf_log err &Can not start namenode daemon.&
return $OCF_ERR_GENERIC;
return $OCF_SUCCESS
添加namenode_stop() 方法。Pacemaker使用这个方法停止服务器上的NameNode守护进程。在这个方法中,我们检查NameNode是否已经停止,如果尚未停止,我们通过hadoop用户执行hadoop-daemon.sh 来停止:
root# vi namenode
namenode_stop () {
# if namenode is not started on this server, bail out early
namenode_status
if [ $? -ne 0 ]; then
ocf_log info &namenode is not running on this server, skip&
return $OCF_SUCCESS
# stop namenode on this server
ocf_log info &Stopping namenode daemon...&
su - hadoop -c &${HADOOP_HOME}/bin/hadoop-daemon.sh stop name node&
if [ $? -ne 0 ]; then
ocf_log err &Can not stop namenode daemon.&
return $OCF_ERR_GENERIC;
return $OCF_SUCCESS
添加namenode_status() 方法。Pacemaker使用这个方法在服务器上检测NameNode守护进程的状态。在这个方法中,我们jps 命令来打印出 hadoop 用户所有运行的java进程,并使用grep 方法来过滤出NameNode守护进程来观察其是否正常启动:
root# vi namenode
namenode_status () {
ocf_log info &monitor namenode&
su - hadoop -c &${JAVA_HOME}/bin/jps& | egrep -q &NameNode&
# grep will return true if namenode is running on this machine
if [ $rc -eq 0 ]; then
ocf_log info &Namenode is running&
return $OCF_SUCCESS else
ocf_log info &Namenode is not running& return $OCF_NOT_RUNNING
添加namenode_validateAll() 方法。确保在我们运行其它方法之前,所有的环境变量都已经被正确的设置了:
root# vi namenode
namenode_validateAll () {
if [ -z &$JAVA_HOME& ]; then
ocf_log err &JAVA_HOME not set.&
exit $OCF_ERR_INSTALLED
if [ -z &$HADOOP_HOME& ]; then
ocf_log err &HADOOP_HOME not set.&
exit $OCF_ERR_INSTALLED
# Any subject is OK
return $OCF_SUCCESS
添加如下主例程。调用上述方法来实现必须的标准开放集群框架( OCF)代理动作:
root# vi namenode
# See how we were called.
if [ $# -ne 1 ]; then
exit $OCF_ERR_GENERIC
namenode_validateAll
case $1 in
meta-data) meta_data
exit $OCF_SUCCESS;;
usage) usage
exit $OCF_SUCCESS;;
case $1 in
status|monitor) namenode_;
start) namenode_;
stop) namenode_;
validate-all);;
exit $OCF_ERR_UNIMPLEMENTED;;
在 master1 和 master2 上修改namenode的文件权限:
root# chmod 0755 namenode
root# ocf-tester -v -n namenode-test /full/path/of/namenode
2 确认在进入下一步之前,上述所有代码测试通过,否则高可用性集群可能会出现异常.
将namenode 资源代理安装到master1 和 master2 的 hac 目录之下:
root# mkdir ${OCF_ROOT}/resource.d/hac
root# cp namenode ${OCF_ROOT}/resource.d/hac
root# chmod 0755 ${OCF_ROOT}/resource.d/hac/namenode
配置高可用性的NameNode
我们已经通过Heartbeat 和 Pacemaker配置了高可用性的NameNode。接下来就是配置一个虚拟地址,Hadoop 和HBase使用该虚拟IP地址作为他们的主节点地址。虚拟IP首先指向活动的主节点,一旦主节点异常,Heartbeat 和 Pacemaker能够检测,并且将虚拟IP转换到备用主节点,然后在上面启动NameNode。
启动 master1 and master2 的Heartbeat :
root# /etc/init.d/heartbeat start
修改 crm 默认配置。master1 或 master2 的所有资源相关命令都只执行一次:
root# crm configure property stonith-enabled=false
root# crm configure property default-resource-stickiness=1
3 使用虚拟IP地址加入一个虚拟IP资源:
root# crm configure primitive VIP ocf:heartbeat:IPaddr params ip=&#.14.10″ op monitor interval=”10s”
4 修改Hadoop的配置,使用虚拟IP地址。在修改配置以后,同步配置文件到所有主节点、客户端和子节点:
hadoop$ vi $HADOOP_HOME/conf/core-site.xml
&property&
&name&fs.default.name&/name&
&value&hdfs://master:8020&/value&
&/property&
5 配置Hadoop将元信息同时写入本地与NFS,同步配置文件到所有主节点、客户端和子节点:
hadoop$ vi $HADOOP_HOME/conf/hdfs-site.xm
&property&
&name&dfs.name.dir&/name&
&value&/usr/local/hadoop/var/dfs/name,/mnt/nfs/hadoop /dfs/name&/value&
&/property&
6 将步骤5中创建的 namenode 资源代理加入到Pacemaker,我们将NAMENODE作为它的资源名称:
root# crm configure primitive NAMENODE ocf:hac:namenode op monitor interval=&#s” timeout=&#s” op start timeout=&#s” op stop timeout=&#s” meta resource-stickiness=+
7 将虚拟IP资源与NAMENODE资源配置为一个资源组:
root# crm configure group VIP-AND-NAMENODE VIP NAMENODE
8 为虚拟IP资源与NAMENODE资源定义托管(colocation):
root# crm configure colocation VIP-WITH-NAMENODE inf: VIP NAMENODE
9 为虚拟IP资源与NAMENODE资源定义资源排序
root# crm configure order IP-BEFORE-NAMENODE inf: VIP NAMENODE
10 使用crm_mon 命令来验证之前的Heartbeat与资源定义。若一切正常,应该看到如下输出:
root@master1 hac$ crm_mon -1r
============
Last updated: Tue Nov 22 22:39:11 2011
Stack: Heartbeat
Current DC: master2 (7fd92a93-e071-4fcb-993f-9a84e6c7846f) - partition with quorum
Version: 1.0.9-f31d7ddc114f58978b
2 Nodes configured, 1 expected votes
1 Resources configured.
============
Online: [ master1 master2 ]
Full list of resources:
Resource Group: VIP-AND-NAMENODE
VIP (ocf::heartbeat:IPaddr): Started master1
NAMENODE (ocf::hac:namenode): Started master1
11 确认虚拟IP资源与NAMENODE资源在同一台服务器上.
12 停止master1 的Heartbeat , 虚拟IP与NAMENOD 在数秒后在 master2 上启动.
13 重新启动master1 的Heartbeat,虚拟IP与NAMENOD 应当还是在 master2. 相关资源不应当回到 master1.
启动DataNode, HBase集群并备份HBase主节点(master)
确认了高可用性的配置正常工作之后,我们可以启动HDFS和HBase了。注意NameNode已经被Pacemaker启动了,所以我们只需要启动DataNode:
16 一切正常的话,启动DataNode:
hadoop@master$ for i in 1 2 3
ssh slave$i &$HADOOP_HOME/bin/hadoop-daemon.sh start datanode&
从虚拟IP指向的活动主节点(master1 )启动HBase集群:
hadoop@master$ $HBASE_HOME/bin/start-hbase.sh
启动备份节点(master2 )的HMaster进程:
hadoop@master2$ $HBASE_HOME/bin/hbase-daemon.sh start master
下图描述了上述步骤执行完成后的集群架构:
首先,两台主节点上都安装了 Heartbeat 与 Pacemake,并配置了Heartbeat以支持Pacemaker。
在“创建并安装资源代理”章节的第步,我们新建了一个实现标准OCF资源代理的namenode 脚本。其中最重要的部分就是namenode_status,它负责检测NameNode守护进程的状态。我们通过jps 命令来打印出 hadoop 用户所有运行的java进程,并使用grep 方法来过滤出NameNode守护进程来观察其是否正常启动。Pacemaker 使用namenode 资源代理来开启/关闭/监控NameNode守护进程。在namenode 的脚本中,namenode_start 和namenode_stop 是通过hadoop-daemon.sh 对单独服务器的Hadoop 守护进程启动和停止。你能够本文中找到相关源码。
当namenode 资源代理测试、安装完成并正常运行之后启动Heartbeat 。我们修改了一些 crm 的默认配置, default-resource-stickiness=1 非常重要,因为它关闭了资源的自动恢复。
在配置高可用性的NameNode一节中的第三到五步,我们在Pacemaker中添加了虚拟IP资源,并配置了Hadoop 和HBase。这样当活动主节点异常之后,可以切换至备用主节点。
同一章节的第六步,我们配置了Hadoop (HDFS NameNode)将元数据同时写入本地与NFS。若活动主节点异常,备用主节点会读取相同的NFS目录,启动NameNode,从而使用最新的元数据信息,在活动主节点异常之前恢复HDFS的状态。
在步骤7到10中,我们通过 namenode 资源代理构建了名为NAMENODE的资源,然后将 虚拟IP与NAMENOD 配置为一个资源组(步骤8),保证在同一服务器(步骤9),以正确顺序启动(步骤10)。这样可以保证不会出现虚拟IP指向master1,而NameNode在 master2 上面启动。
因为Pacemaker 会通过 namenode 资源代理启动NameNode,所以我们需要单独启动DataNode,也就是我们在步骤1中所做的内容:启动DataNode,HBase集群和HBase备份主节点。
HBase正常启动后,启动备份服务器上面的备份HBase主节点 (HMaster)。在备份服务器的日志中,可发现如下内容证明启动的是备份主节点 (HMaster):
23:38:55,168 INFO org.apache.hadoop.hbase.master.ActiveMasterManager: Another master is the active master, ip-10-174-14-15.us-pute.internal:60000; waiting to become the next active master
最终NameNode 和HMaster在两台服务器上启动,并且可以随时进行异常切换,避免了集群中的单点异常。
然而,在生产环境实际运用还有很多问题需要处理。我们还要对高可用性集群进行各种特殊情况测试,如单台服务器断电、网线断开、交换机关闭或者能想到的其它任意情况。
另一方面来说,单点故障其实没有想象中那么严重。根据我们的经验,几乎所有的集群宕机都是因为异常操作或者软件升级,所以保持系统的简单性会让系统更稳定。
更多内容(Amzone EC2)
在 Amazon EC2 上建立高可用性的HBase集群更为复杂,因为EC2不支持静态IP地址,我们无法使用虚拟IP。可以考虑使用弹性IP(elastic-ip EIP)。在EC2中,弹性IP类似静态IP,弹性IP只是与你的账户关联,不是其它什么特殊实例。一旦活动主节点异常,我们可以使用Heartbeat自动关联弹性IP启动备份服务器。接着定义Hadoop和HBase使用与一个公共实例DNS关联的弹性IP来访问当前活动的主节点。在namenode 资源代理中,我们不但要启动或停止NameNode,而且还要处理所有的DataNode。因为活动主节点的IP变化了,DataNode必须重启之后才能访问新的主节点。
因为本文的范围有限,所以我们忽略掉一些细节。我们构建了一个弹性IP(elastic-ip EIP)资源代理来实现上述目的,相关源码在本文中可以找到。
英文原文:,编译: -
译文链接:
【如需转载,请在正文中标注并保留原文链接、译文链接和译者等信息,谢谢合作!】
关于作者:
致力于互联网大型分布式领域,实践各种软件过程与自动化。爱生活,爱JAVA。新浪微博:
欢迎交流你的理解
关于ImportNew
ImportNew 专注于 Java 技术分享。于日 11:11正式上线。是的,这是一个很特别的时刻 :)
ImportNew 由两个 Java 关键字 import 和 new 组成,意指:Java 开发者学习新知识的网站。 import 可认为是学习和吸收, new 则可认为是新知识、新技术圈子和新朋友……
新浪微博:
推荐微信号
反馈建议:@
广告与商务合作QQ:
– 好的话题、有启发的回复、值得信赖的圈子
– 写了文章?看干货?去头条!
– 为IT单身男女服务的征婚传播平台
– 优秀的工具资源导航
– 活跃 & 专业的翻译小组
– 国内外的精选博客文章
– UI,网页,交互和用户体验
– JavaScript, HTML5, CSS
– 专注Android技术分享
– 专注iOS技术分享
– 专注Java技术分享
– 专注Python技术分享
& 2016 ImportNew}

我要回帖

更多关于 hbase原理和设计 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信