1.概述
1.我分析的是hbase-1.2.4这个版本
2.首先从bin/start-hbase.sh开始,这个文件首先去执行配置脚本bin/ hbase-config.sh 。bin/ hbase-config.sh这个脚本里在其中加载了
这三个配置。这里有个疑问conf/regionservers文件打开内容是localhost,但是regionservers是复数,说明可以配置多个regionserver在不同的机器上运行,这是我的猜测,没有查找到相关资料
然后backup-masters文件
hbase增加backup master 为了增加hbase集群的可用性,可以为hbase增加多个backup master。当master挂掉后,backup master可以自动接管整个hbase的集群。
配置backup master的方式是在hbase的conf下增加文件backup-masters,在该文件里面增加backup master的机器列表,每台机器一条记录。
如:
[hadoop@hadoop01 conf]$ cat backup-masters
hadoop02
整个集群启动后,在hadoop02的机器上也会启动hmaster的进程:
[hadoop@hadoop02 logs]$ jps
4301 Jps
4175 HMaster
查看hadoop02上该master的log,可以看到如下的信息:
2012-04-10 05:53:10,120 INFO org.apache.hadoop.hbase.master.ActiveMasterManager: Another master is the active master, hadoop01,60000,1334008045435; waiting to become the next active master
该信息说明,当前hbase集群有活动的master节点,该master节点为hadoop01,所以hadoop02节点开始等待,直到hadoop01上的master挂掉。hadoop02会变成新的hmaster节点。
当当前的master挂掉后,backup master会接管,进而变成新的active master
2012-04-10 06:48:52,436 DEBUG org.apache.hadoop.hbase.master.ActiveMasterManager: No master available. Notifying waiting threads
2012-04-10 06:48:52,438 INFO org.apache.hadoop.hbase.master.ActiveMasterManager: Master=hadoop02,60000,1334011638701
2012-04-10 06:48:52,443 DEBUG org.apache.hadoop.hbase.master.ActiveMasterManager: A master is now available
原文地址:http://www.oratea.net/?p=1177
然后是
hbase-daemons.sh --config hbase-1.2.4/conf start zookeeper
hbase-daemon.sh --config hbase-1.2.4/conf start master
hbase-daemons.sh --config hbase-1.2.4/conf --hosts hbase-1.2.4/conf/regionservers start regionserver
hbase-daemons.sh --config hbase-1.2.4/conf --hosts conf/backup-masters start master-backup
分别去启动各个进程
查看hbase-daemons.sh发现在这个文件中
先启动zookeeper然后输入密码
然后启动regionserver
最后再启动master-backup
但是都是用hbase-daemon.sh这个脚本去启动
查看hbase-daemon.sh发现在这个文件中
每次都执行配置文件
这里是检查是否有hbase相关的进程已经启动了
这里是log日志的存放位置,pid等等
启动程序
上面的调用这个,这个里面可以看到最终使用bin/hbase 这个命令启动的,打开这个命令可以看到 hbase的主要的三个进程的主类
分别是:master
org.apache.hadoop.hbase.master.HMaster
Regionserver org.apache.hadoop.hbase.regionserver.HRegionServer
Zookeeper org.apache.hadoop.hbase.zookeeper.HQuorumPeer
因为上面启动是最先启动的zookeeper,所以我们先查看zookeeper的源代码
这里遇到了第一个配置,hbase.regionserver.global.memstore.upperLimit
hbase.regionserver.global.memstore.upperLimit被hbase.regionserver.global.memstore.size这个配置给取代了。这个配置在文档中说的意思是
hbase/hbase-common/src/main/resources/hbase-default.xml
<property>
<name>hbase.regionserver.global.memstore.size</name>
<value></value>
<description>Maximum size of all memstores in a region server before new
updates are blocked and flushes are forced. Defaults to 40% of heap (0.4).
Updates are blocked and flushes are forced until size of all memstores
in a region server hits hbase.regionserver.global.memstore.size.lower.limit.
The default value in this configuration has been intentionally left emtpy in order to
honor the old hbase.regionserver.global.memstore.upperLimit property if present.</description>
</property>
HBase region server作为一个Java程序,启动时应该指定max heap size,比方说8G。那这8G会被如何使用呢?
- 作为每个region的mem store,缺省是64M。那么如果这个region server一共有100个region的话,就要用掉64M*100=6.4G内存了。
- 作为block cache用,缺省是20%的内存用作block cache,那么就是8G*20% = 1.6G。
- 其他对象分配。
从上面的情况可以看到,如果这个region server只有8G的heap size的话,在100个region的情况下,内存已经完全用完了(6.4G+1.6G),这样的话,就非常容易出OutOfMemoryError了。当然在实际使用中,基本不会因为这个原因产生OOME。这主要是因为HBase的这个配置hbase.regionserver.global.memstore.upperLimit(缺省是40%的内存)起了作用。但这是有代价的。其代价就是block住所有在这个region server上的update操作并强制进行flush以释放内存。这样的话,整个region server在这段时间内就不响应任何请求。所以,应该限制每个HBase region server的region个数。按照Google的经验,这个数字应该不超过100。
读HBase的source code可以发现,对于put heavy的应用来说,mem store flush只发生在mem store满的情况。而由flush又进一步引起minor compaction, major compaction和split。所以为了减少flush次数,似乎应该增大mem store size并相应减少region个数。这样应该会对写入速度有好处。回头实验下吧。