首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > 其他数据库 >

hbase写数据历程

2013-12-04 
hbase写数据过程博文说明:1、研究版本hbase0.94.12;2、贴出的源代码可能会有删减,只保留关键的代码?从client

hbase写数据过程

博文说明:1、研究版本hbase0.94.12;2、贴出的源代码可能会有删减,只保留关键的代码

?

从client和server两个方面探讨hbase的写数据过程。

一、client端

?

1、写数据API

? ? 写数据主要是HTable的单条写和批量写两个API,源码如下:

for (int i = 0; i < workingList.size(); i++) {

}

if (!region.getRegionInfo().isMetaTable()) {

//检查HRegionServer的memstore总内存占用量是否已经超过了hbase.regionserver.global.memstore.upperLimit(默认值是0.4)或者hbase.regionserver.global.memstore.lowerLimit(默认值是0.35)的限制,如果超过了则会在flush队列中添加一个任务,其中如果是超过了upper的限制则会阻塞所有的写memstore的操作,直到内存降至lower限制以下。

boolean writeToWAL = put.getWriteToWAL();

//region会调用Store的add()方法把数据保存到相关Store的memstore中

//region在保存完数据后,会检查是否需要flush memstore,如果需要则发出flush请求,由HRegionServer的flush守护线程异步执行。

?? OperationStatus codes[] = region.batchMutate(putsWithLocks);

? ? $ bin/hbase org.apache.hadoop.hbase.util.Merge <tablename> <region1> <region2>

? ? 参数<region1>需要写region的名称,比如:
? ? gd500M,4-605-52-78641,1384227418983.ccf74696ef8a241088356039a65e1aca

? ? 由上图可见,表gd500M的新region的用户是hdfs,执行如下命令,修改所属用户,注意最好是对hbase根目录进行用户改变,因为不只是新region的用户是hdfs,还有一些在merge过程中形成的日志文件等也会是hdfs用户

? ? 修改后查看新region的用户信息,已经改为hbase:


?
? ? compact合并的级别

在HRegionServer启动时会开启一个守护线程定时扫描集群下的所有在线的region下的storeFile文件,对所有符合Store.needsCompaction()或Store.isMajorCompaction()的store进行合并操作,默认周期是10000秒(大概2.7小时),其中如果hbase.hregion.majorcompaction配置为0则该守护线程永远也不会触发major合并?源代码如下:

}

?

boolean result = false;

long mcTime = getNextMajorCompactTime();

if (filesToCompact == null || filesToCompact.isEmpty() || mcTime == 0) {

// TODO: Use better method for determining stamp of last major (HBASE-2990)

? ?通过HBaseAdmin或者CompactionTool可以触发表下的所有region和列簇进行compact合并(minor或者major)。HBaseAdmin还可以触发表下的指定列簇的compact操作。

? 有很多情况均会触发Store的compact,比如:执行CompactionTool工具的compact方式、flush memstore等。

a、hbase内部自动触发(HRegionServer的定时器、flush memstore等)

b、客户端等外部触发(hbase管理工具、HBaseAdmin(client端管理类)、CompactionTool等)

HTableDescriptor desc = region.getTableDesc();

??? if (desc != null) {

????? this.desiredMaxFileSize = desc.getMaxFileSize();

??? }

??? if (this.desiredMaxFileSize <= 0) {

????? this.desiredMaxFileSize = conf.getLong(HConstants.HREGION_MAX_FILESIZE,

??????? HConstants.DEFAULT_MAX_FILE_SIZE);

??? }

?

?

?

热点排行