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);
??? }
?
?
?