`
zlx19900228
  • 浏览: 51691 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Hbase Put源码解析

阅读更多
原创文章,请各位多多指导,有错误希望各位能及时告诉我,感激不尽~
(1) Put put = new Put(key);首先会构造put对象,以传入的rowkey,如果未传入时间戳,那么就会默认为null,接下来就会判断是否传入的控制hbase事务的rowlock,如果传入的rowlock不为空,那么就拿到lockId,赋值给当前lockid.
(2) 接下来调用put.add(cfbt,columnKey,columnValue);它会先从familyMap中根据family转化成的byte[]数组,拿出List<KeyValue>,如果为null,(第一次插入相关cf数据),会新建一个list,接下来会根据family, qualifier, ts, value这几个参数,生成keyvalue,keyvalue的结构为

调用的代码为
return  new KeyValue(this.row, family, qualifier, ts, KeyValue.Type.Put,value);将生产好的keyvalue,加入cf对于的keyvalue list中,然后将信息再全部放入familyMap中。
(3) 当put中add完要加入的colmn对应的cf,name,value之后,便调用table.put方法,这里调用的方法是天蓉师姐改过源码之后的putOne方法,原来的put方法会将你放入的put加入一个writeBuffer的arraylist中,然后统计当前currentWriteBufferSize的大小,如果大于了writeBufferSize,并且设置了autoflush,就会调用flushCommits方法,这个方法会将你放入writeBuffer中的所有put对象,在新版本中是采用的调用processBatch方法,processBatch内部有retry机制,如果是retry,就会根据retry次数得到一个pausetime,然后sleep该pausetime。  接下来,会通过tablename,row,是否启用缓存这3个参数,去定位region:
HRegionLocation loc = locateRegion(tableName, row.getRow(), true);
(a) 如果tableName == -ROOT- 就会调用waitRootRegionLocation方法,通过zookeeper得到rootregion的地址。接下来返回一个new HRegionLocation(HRegionInfo.ROOT_REGIONINFO, hsa);
(b) 如果tableName == .META.,就会调用locateRegionInMeta方法,先去从缓存中拿,如果缓存中没有,会组合metakey,然后去获得这个row所在的的region在哪个哪个regionServer上。
(c) 如果不是.META.表也不是-ROOT-表,那么也会调用locateRegionInMeta方法,parentTable传入meta表,依然通过参数形成metakey,
定位到region之后,拿到region对应的serveraddress,然后组装MultiAction,将HserverAddress以及MultiAction放入Map<HServerAddress, MultiAction> actionsByServer中,接下来遍历actionsByServer,建立异步任务,createCallable,然后将异步任务submit给threadpool,call方法会调用public MultiResponse multi(MultiAction multi)方法,为这个multiaction中对应的每个action,即每个活动,判断action类型,delete,get,put,然后针对不同的做不同的处理,这些是多线程的 处理,核心会调用doMiniBatchPut方法,并在写入完之后,清空writeBuffer
doMiniBatchPut方法:
1. 第一步是尽最大可能获得锁,(Try to acquire as many locks as we can),保证我们至少有一个锁,期间会检验checkFamilies,并且如果没有足够的rows,会陷入阻塞,numReadyToWrite这个属性就是判断有多少个rows需要put,知道获得了next one,然后就是获得锁的过程。
2. 第二步,更新时间戳。
3. 第三步,写入WAL日志,WALLog与mysql的binlog类似,作用都是灾难恢复,它记录所有的数据改动。一旦服务器崩溃,通过重放log,我们可以恢复崩溃之前的数据。这也意味如果写入WAL失败,整个操作将认为失败。(红色字体参考的是网上资料)。
4. 第四步,写入memstore中,然后返回OperationStatusCode.SUCCESS。
(4) 当doMiniBatchPut调用完成之后,会返回addedSize,此时,将memstoreSize加上addedSize然后判断是否满足条件flush到磁盘,这里的条件是看size > this.memstoreFlushSize;而memstoreFlushSize是由regionInfo.getTableDesc().
getMemStoreFlushSize()获得的。默认大小是long DEFAULT_MEMSTORE_FLUSH_SIZE = 1024*1024*64L;64MB。如果满足了flush条件,就会把writestate.flushRequested标志位设为true,由单独的线程flush到磁盘上,成为一个StoreFile。

但是官方的插入策略第一步是放入本地缓存中,即writeBuffer中,只有满足条件了,才会调用flushCommits方法,也就是说放入本地缓存的时候,并没有计入WAL日志,如果这个时候机器挂了,那么数据就丢失了,无法恢复。

其他实现是:
直接调用HregionServer的put方法,不将put放入writeBuffer中,得到相应的region之后,调用region的put方法,这里的put方法,也是更新时间戳,写入WAL日志,写入memstore中。

(5) Hregion存储了table中某一个region的数据,它存储了每一行的所有columns,一个table由一个或多个Hregions组成,一个Hregion中包含了多个Hstore,Store是包含了部分列的行的集合,同时,他们组成了这些行的所有数据。
一个Hregion是靠表以及key的范围定义的,它至少包含一个store,store的数量是可配置的,以便同时进来的数据能存放在同一个store中,目前,我们近似通过为每个列族创建一个store
HtableDescriptor包含了hregion所在的table的元数据信息,regionname是一个Hregion的唯一标识符,(startKey, endKey]定义了这个Hregion的key区间。
  • 大小: 66.1 KB
分享到:
评论
1 楼 liuyindong 2012-10-29  
  咋这么复杂呢,亲

相关推荐

    【No0057】HBase源码解析与开发实战.txt

    ### HBase源码解析与开发实战 #### 一、HBase简介 HBase是一个分布式的、面向列的开源数据库,该技术来源于 Fay Chang 所撰写的 Google 论文 “Bigtable:一个结构化数据的分布式存储系统”。就像 Bigtable 利用了...

    HBase实战源码

    《HBase实战源码》是针对Apache HBase这一分布式、高性能、基于列族的NoSQL数据库的深度解析书籍。源码分析是理解HBase工作原理和技术细节的重要途径。HBase在大数据领域扮演着关键角色,它能够处理海量数据并提供...

    HBaseTest_hbase_源码

    《深入理解HBase:从HBaseTest源码解析开始》 HBase,作为Apache软件基金会的一个开源项目,是构建在Hadoop之上的分布式列式数据库,特别适合处理大规模数据。其设计灵感来源于Google的Bigtable,提供高吞吐量的...

    hbase-1.2.6-bin+src.tar.rar

    本文将围绕"Hbase-1.2.6-bin+src.tar.rar"这一资源,深入探讨HBase的核心概念、架构、功能以及源码解析。 一、HBase概述 1.1 核心概念 - 表(Table):HBase中的数据组织方式,由多个行组成。 - 行(Row):通过...

    Hbase调用JavaAPI实现批量导入操作

    在批量导入前,通常需要对输入数据进行预处理,如解析文件,生成`Put`对象,设置行键和列族。行键设计很重要,因为它影响数据的分布和查询性能。 5. **优化批量导入**: - 使用多线程并行处理:可以将数据分成多...

    C#使用Thrift2操作HBase数据库

    HBase返回的结果通常是二进制的,需要解码后才能解析为有意义的数据。 在描述中提到的“便于快速入门”,可能包含了基础的示例代码或教程,例如如何设置连接参数,如何构造put和get请求,以及如何处理响应。文件名...

    [原创]HbaseClient

    通过阅读源码,我们可以发现HbaseClient在执行操作时,会先将请求序列化成protobuf消息,然后通过HBase的RPC协议发送到RegionServer。RegionServer接收到请求后,解析并执行对应的操作,最后将结果返回给客户端。 ...

    HBASE API

    **HBase API 深入解析** HBase,作为一个分布式、列式存储的NoSQL数据库,是Apache Hadoop生态系统中的重要组成部分。它被设计用来处理海量数据,支持高并发读写操作,尤其适用于实时大数据查询场景。HBase API是...

    No.1HBase3.0张铎.zip

    - HBase的下载与编译:获取源码,进行编译并安装。 - 配置文件详解:hbase-site.xml、regionservers等关键配置文件的设置。 - 初始化HBase:启动Master和RegionServer,创建第一个表。 4. **HBase操作与管理** ...

    hbase-0.98.12.1-hadoop2-bin.tar.gz

    《HBase 0.98.12.1 on Hadoop 2:深入解析与实践》 HBase,全称为Hadoop Base,是一款基于Google Bigtable理念设计的开源分布式数据库,是Apache软件基金会的重要项目之一。它专为大规模数据集(数十亿行,百万列)...

    Hbase实战

    七、源码解析 对于希望深入了解HBase的开发者,阅读源码是必不可少的。HBase的开源特性使其内部机制透明,可以通过源码学习其数据分布、并发控制、故障恢复等机制。 总结,HBase是一款强大的大数据存储解决方案,...

    HBase SQL Phoenix

    2. 编译式查询:Phoenix将SQL查询编译成HBase的Get和Put操作,减少了中间解析步骤,提高了性能。 3. 分区和索引:Phoenix支持基于列的分区,以及创建二级索引,优化查询性能。 4. 动态Schema:Phoenix允许在运行时...

    hadoop mr file2hfile2hbase

    2. **编写Mapper**:Map阶段,你需要编写一个Mapper类,这个类负责读取输入文件中的每一行数据,解析出行键、列族、列限定符和值,然后生成HBase的Put对象。Put对象表示对HBase表的一次写操作。 3. **编写Reducer**...

    源码笔记资料(1).zip

    总结,这份资料集为学习和使用HBase提供了一条清晰的路径,从基础安装到源码解析,再到实战演练,覆盖了HBase学习的全过程。通过深入学习,你可以更好地驾驭这个强大的大数据存储系统,应对日益增长的数据处理需求。

    hadoop使用

    8. **HBase操作Java API**:使用HBase Java API可以进行更复杂的操作,如连接到HBase(`HBaseConfiguration.create()`)、创建表(`HTableDescriptor`)、写入数据(`Put`)、读取数据(`Get`)和扫描数据(`Scan`)...

    leveldb-1.7.0.tar.gz

    《深入解析Google LevelDB:1.7.0版本源码剖析》 Google的LevelDB是一款高效、轻量级的键值对存储系统,被广泛应用于嵌入式系统、日志记录、缓存以及分布式系统等领域。它以简洁的API、优秀的性能和可靠性著称。在...

    Hadoop 2.5.2安装和部署

    在IT行业中,Hadoop是一个广泛使用的开源框架,用于存储和...在部署完成后,可以考虑学习和掌握Hadoop的数据处理框架如MapReduce和Spark,以及Hadoop生态中的其他工具,如Hive、Pig和HBase等,以充分发挥Hadoop的潜力。

    阿里面试问题总结.docx

    - **put操作流程**:计算键的哈希值、确定存储位置、检查是否有冲突、插入或更新键值对。 - **考察点**:数据结构基础知识、哈希算法原理。 #### Redis集群机制 - **主要内容**:Redis集群通过节点间的复制和数据分...

Global site tag (gtag.js) - Google Analytics