HBase 对比 Kudu

对比方面 HBase Kudu
开发语言 Java Java、C++(核心)
数据模型 key-value系统,无模式 强类型的结构化表
软件架构 利用ZK进行Master选举,数据存储到HDFS实现容错 使用Raft协议实现高可用,底层数据存储使用Raft实现多副本
存储方式 列簇式存储 纯列式存储
数据分区 一致性哈希 Hash或Range
索引 支持 不支持
数据一致性 强一致 Snashot和External Consisitency

架构

HBase

  • Master:管理与监控的RegionServer,管理HBase元数据;
  • Zookeeper:分布式协调服务,存储Meta表位置、Master位置、RS当前工作状态;
  • RegionServer:维护Master分配的Region(表一段区间的内容),接受客户端的读写请求;
  • HDFS:提供多副本的数据存储(包括Storefile和HLOG),HBase作为HDFS的客户端,与HDFS低耦合;
  • Java实现,内存的释放通过GC来完成,在内存比较紧张时可能引发full GC进而导致服务不稳定;

Kudu

  • TServer:管理Tablet,接收其他TServer中Leader Tablet传来的同步消息;
  • TMaster:管理Tablet的基本信息、表的基本信息,监听TServer状态,多个TMaster之间通过Raft协议实现数据同步、高可用;
  • Tablet:负责表中某块内容的读写,类似Region;由一或多个Rowset组成;
  • 相当于把HBase中ZK的功能放在TMaster,比HBase中Master的功能更重;
  • 数据存储模块集成在自身结构(避免HDFS读取小文件时延太大的问题);
  • 核心模块用的C++来实现,没有full gc的风险。

存储

HBase

  • K-V型的NoSQL数据库,建表时指定一或多个列蔟,列蔟下有任意个列,相同列蔟的列存放在一起(面向列蔟存储),比行式存储有更高的压缩比;
  • 每行数据包括:rowkey:columnFamily:columnQulifier:timestamp,其中columnQulifier为数据行是否删除的标记、TimeStamp区分多版本数据;
  • 建表时不需要指定列和类型(value字段转换成二进制的字节流),相当于可以动态该表表结构;
  • 每个cell存放多个版本的数据,更新删除通过插入一条新版本的数据实现;
  • 表设计时一般会用单个列蔟,此时与行式存储无太大区别;

Kudu

  • 完全的列式存储;
  • 数据分三个部分:BaseData(当前数据),UndoRecords(历史修改数据),RedoRecords(未merge到当前数据的更新操作);
  • 建表时要定义每列的类型(设置合适的编码方式),实现更高的数据压缩比,降低I/O压力;
  • 主键唯一,不能把更新操作转换成插入一条新版本的数据。

读写过程

HBase

特点

  • 写入缓存:Memstore,同时会将写入操作顺序写入HLOG(WAL)保证数据不丢失;
  • 读出缓存:BlockCache,采用LRU策略;
  • 采用了LSM-tree的多组件算法作为数据组织方式,一个Region存在多个Storefile;
  • 采用了非原地更新的方式(插入新版本数据),能实现快速的更新和删除,导致满足指定rowkey,列族、列名要求的数据有多个,并且可能分布在不同的Storefile中;
  • timestamp属性可以设置,按顺序写入Storefile的数据timestamp可能不是递增的;
  • 可考虑读写中使用的优化技术如Bloomfilter、timestamp range;

写过程

  • 1、客户端通过缓存的RS信息或访问ZK取得Region所在的RS信息;
  • 2、RS接受客户端写入请求,先将写入的操作写入WAL,然后写入Memstore,HBase向客户端确认写入成功;
  • 一定情况下(Memstore达到一定阈值或region占用内存超过一定阈值或手动flush),HBase将Memstore中的数据flush成Storefile,存放到HDFS;
  • HBase将Storefile根据一定策略合并。

读过程

  • 1、客户端通过缓存或访问ZK取得Region所在的RS信息;
  • 2、RS 接收读请求,要准确的读到相应版本的数据,需要找到所有可能存储有该条数据的位置,包括在内存中未flush的Memstore,已经flush到HDFS上的storefile,所以需要在1 Memstore + N Storefile中查找;
  • 3、在所有数据中通过timestamp中得到最终数据。

Kudu

特点

  • Tablet负责表某块内容读写,由一或多个Rowset组成:
    • MemRowset:处于内存的Rowset,负责新数据写入请求,只有一个;
    • DiskRowSet:MemRowset达到一定程序刷入磁盘后生成,由一个CFile(Base Data)、多个DeltaFile(UNDO records & REDO records)和位于内存的DeltaMemStore(达到一定大小后会将数据刷入磁盘生成新的REDO records)组成。
  • Kudu后台有一个类似HBase的compaction线程按照一定策略对tablet进行合并:
    • 将多个DeltaFile(REDO records)合并成一个大的DeltaFile
    • 将多个REDO reccords文件与Base data进行合并,并生成新的 UNDO records;
    • 将多个DiskRowset之间进行合并,减少DiskRowset的数量。
  • 最终数据存储在本地磁盘,每个tablet设置多个副本且由多个TServer负责维护,写入请求由Leader Tablet处理,副本之间通过Raft协议保证强一致性;

写过程(插入)

  • 连接TMaster获取表相关信息(分区、Tablet);
  • 找到负责读写请求Tablet的TServer,Kudu接收到请求后检查是否符合要求(表结构);
  • Kudu在TServer的所有rowset中(内存、磁盘)根据主键查找,存在相同的返回错误;
  • Kudu在MemRowset中写入一行新数据,如达到阈值则将数据写入磁盘(DiskRowSet),并生成一个memrowset继续接收新数据的请求。

写过程(更新)

  • 前两步相同;
  • 待更新数据可能位于MemRowset中,也可能位于DiskRowSet:
    • 位于MemRowset:找到待更新数据所在行, 然后将更新操作记录在所在行中一个mutation链表中;在memrowset将数据落盘时,Kudu会将更新合并到base data,并生成UNDO records用于查看历史版本的数据和MVCC,UNDO records实际上也是以DeltaFile的形式存放;
    • 位于DiskRowSet:找到待更新数据所在的DiskRowset , 每个DiskRowset 都会在内存中设置一个DeltaMemStore,将更新操作记录在DeltaMemStore中,在DeltaMemStore达到一定大小时,flush在磁盘,形成Delta并存在方DeltaFile中。
  • Kudu提交更新时通过Raft协议将同步到其他replica,如没有在MemRowset和DiskRowSet中找到这条数据则返回错误,deltafile太多时会采用一定策略对一组deltafile合并。

读过程

  • 连接TMaster获取表相关信息(分区、Tablet);
  • Client找到相应Tablet的Tserver,Kudu接收读请求并记录timestamp(默认当前时间);
  • Kudu找到待读数据的所有相关信息:
    • 位于MemRowset:根据读取操作中包含的timestamp 信息将该timestamp前提交的更新操作合并到base data中,这个更新操作记录在该行数据对应的mutation链表中;
    • 位于DiskRowSet:在所有DeltaFile中找到所有目标数据相关的UNDO record和REDO records,REDO records可能位于多个DeltaFile中,根据读操作中包含的timestamp信息判断是否需要将base data进行回滚或者利用REDO records将base data进行合并更新。

特点

  • HBase写的时候,不管是新插入一条数据还是更新数据,都当作插入一条新数据来进行;而Kudu将插入新数据与更新操作分别看待;

  • Kudu表结构中必须设置一个唯一键,插入数据的时候必须判断一些该数据的主键是否唯一,所以插入的时候其实有一个读的过程;而HBase没有太多限制,待插入数据将直接写进memstore;

  • HBase实现数据可靠性是通过将落盘的数据写入HDFS来实现,而Kudu是通过将数据写入和更新操作同步在其他副本上实现 数据可靠性。

  • 在HBase中,读取的数据可能有多个版本,所以需要结合多个storefile进行查询;Kudu数据只可能存在于一个DiskRowset或 者MemRowset中,但是因为可能存在还未合并进原数据的更新,所以Kudu也需要结合多个DeltaFile进行查询;

  • HBase写入或者更新时可以指定timestamp,导致storefile之间timestamp范围的规律性降低,增加了实际查询storefile的数量;Kudu不允许人为指定写入或者更新时的timestamp值,DeltaFile之间timestamp连续,可以更快的找到需要的DeltaFile;

  • HBase通过timestamp值可以直接取出数据;而Kudu实现多版本是通过保留UNDO records(已经合并过的操作)和REDO records(未合并过的操作)完成,在一些情况下Kudu需要将base data结合UNDO records进行回滚或者结合REDO records进行合并然后才能得到真正所需要的数据。

HBase和Kudu在读取一条数据时都需要从多个文件中搜寻相关信息。Kudu将插入和更新操作分开,一条数据只可能存在于一个DiskRowset或者MemRowset中,只需要搜寻到一个rowset中存在指定数据就不用继续往下找了,用户不能设置更新和插入时的timestamp值,减少了在rowset中DeltaFile的读取数量。这样在scan情况下可以结合列式存储的优点实现较高的读性能,特别是在更新数量较少的情况下能够有效提高scan性能。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,881评论 4 368
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 68,052评论 1 301
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 110,598评论 0 250
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,407评论 0 217
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,823评论 3 294
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,872评论 1 224
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,037评论 2 317
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,778评论 0 204
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,505评论 1 247
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,745评论 2 253
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,233评论 1 264
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,568评论 3 260
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,231评论 3 241
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,141评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,939评论 0 201
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,954评论 2 283
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,784评论 2 275

推荐阅读更多精彩内容

  • 最近在逐步跟进Hbase的相关工作,由于之前对Hbase并不怎么了解,因此系统地学习了下Hbase,为了加深对Hb...
    飞鸿无痕阅读 50,064评论 19 271
  • 本文首先简单介绍了HBase,然后重点讲述了HBase的高并发和实时处理数据 、HBase数据模型、HBase物理...
    达微阅读 2,681评论 1 13
  • 一、简介 Hbase:全名Hadoop DataBase,是一种开源的,可伸缩的,严格一致性(并非最终一致性)的分...
    菜鸟小玄阅读 2,309评论 0 12
  • 1. HBase介绍,Hbase是什么? HBase -- Hadoop Database ,是一个高可靠、高性能...
    奉先阅读 3,686评论 1 36
  • 一、HBase简介 Hbase是什么 HBase是一种构建在HDFS之上的分布式、面向列、多版本、非关系型的数据库...
    便利蜂数据平台阅读 952评论 0 4