HBase核心知识点总结

一、HBase介绍

1. 基本概念

HBase是一种Hadoop数据库,经常被描述为一种稀疏的,分布式的,持久化的,多维有序映射,它基于行键、列键和时间戳建立索引,是一个可以随机访问的存储和检索数据的平台。HBase不限制存储的数据的种类,允许动态的、灵活的数据模型,不用SQL语言,也不强调数据之间的关系。HBase被设计成在一个服务器集群上运行,可以相应地横向扩展。

2. HBase使用场景和成功案例
  • 互联网搜索问题:爬虫收集网页,存储到BigTable里,MapReduce计算作业扫描全表生成搜索索引,从BigTable中查询搜索结果,展示给用户。
  • 抓取增量数据:例如,抓取监控指标,抓取用户交互数据,遥测技术,定向投放广告等
  • 内容服务
  • 信息交互
3. HBase Shell命令行交互

启动Shell $ hbase shell
列出所有的表 hbase > list
创建名为mytable的表,含有一个列族hb hbase > create ' mytable' , 'hb'

在‘mytable’表的'first'行中的‘hb:data’列对应的数据单元中插入字节数组‘hello HBase’

hbase > put  'mytable' , 'first' , 'hb:data' , 'hello HBase' 

读取mytable表 ‘first’行的内容: hbase > get 'mytable' , 'first'
读取mytable表所有的内容: hbase > scan ‘mytable'

二、入门

  1. API
    和数据操作有关的HBase API有5个,分别是 Get(读),Put(写),Delete(删),Scan(扫描)和Increment(列值递增)

  2. 操作表
    首先要创建一个configuration对象

   Configuration conf = HBaseConfiguration.create();

使用eclipse时的话还必须将配置文件添加进来。

   conf.addResource(**new** Path("E:\\share\\hbase-site.xml"));
    conf.addResource(**new** Path("E:\\share\\core-site.xml"));
    conf.addResource(**new** Path("E:\\share\\hdfs-site.xml"));

使用连接池创建一张表。

   HTablePool pool = new HTablePool(conf,1);
   HTableInterface usersTable = pool.getTable("users");
3. 写操作

用来存储数据的命令是put,往表里存储数据,需要创建Put实例。并制定要加入的行

  Put put = new Put(byte[]  row) ;
  Put的add方法用来添加数据,分别设定列族,限定符以及单元格的指
  put.add(byte[] family , byte[] qualifier , byte[] value) ; 

最后提交命令给表

  usersTable.put(put);
  usersTable.close();

修改数据,只需重新提交一次最新的数据即可。

HBase写操作的工作机制
hbase_write

HBase每次执行写操作都会写入两个地方:预写式日志(write-ahead log,也称HLog)和MemStore(写入缓冲区),以保证数据持久化,只有当这两个地方的变化信息都写入并确认后,才认为写动作完成。MemStore是内存里的写入缓冲区,HBase中数据在永久写入硬盘之前在这里累积,当MemStore填满后,其中的数据会刷写到硬盘,生成一个HFile。

4. 读操作

创建一个Get命令实例,包含要查询的行

Get get = new Get(byte[]  row) ;

执行addColumn()或addFamily()可以设置限制条件。
将get实例提交到表会返回一个包含数据的Result实例,实例中包含行中所有列族的所有列。

Result  r = usersTable.get(get) ;

可以对result实例检索特定的值

byte[] b = r.getValue(byte[] family , byte[] qualifier) ;
HBase读操作工作机制:
hbase_read

BlockCache用来保存从HFile中读入内存的频繁访问的数据,避免硬盘读,每个列族都有自己的BlockCache。从HBase中读出一行,首先会检查MemStore等待修改的队列,然后检查BlockCache看包含该行的Block是否最近被访问过,最后访问硬盘上的对应HFile。

5. 删除操作

创建一个Delete实例,指定要删除的行。

Delete delete = new Delete(byte[]  row) ;

可以通过deleteFamily()和deleteColumn()方法指定删除行的一部分。

6. 表扫描操作
Scan scan = new Scan() 可以指定起始行和结束行。
setStartRow() , setStopRow() , setFilter()方法可以用来限制返回的数据。
addColumn()和addFamily()方法还可以指定列和列族。
HBase模式的数据模型包括

表:HBase用表来组织数据。
行:在表里,数据按行存储,行由行键唯一标识。行键没有数据类型,为字节数组byte[]。
列族:行里的数据按照列族分组,列族必须事先定义并且不轻易修改。表中每行拥有相同的列族。
列限定符:列族里的数据通过列限定符或列来定位,列限定符不必事先定义。
单元:存储在单元里的数据称为单元值,值是字节数组。单元由行键,列族或列限定符一起确定。
时间版本:单元值有时间版本,是一个long类型。

一个HBase数据坐标的例子:
hbase_position

HBase可以看做是一个键值数据库。HBase的设计是面向半结构化数据的,数据记录可能包含不一致的列,不确定大小等。

三、分布式的HBase、HDFS和MapReduce

1. 分布式模式的HBase

HBase将表会切分成小的数据单位叫region,分配到多台服务器。托管region的服务器叫做RegionServer。一般情况下,RgionServer和HDFS DataNode并列配置在同一台物理硬件上,RegionServer本质上是HDFS客户端,在上面存储访问数据,HMaster分配region给RegionServer,每个RegionServer托管多个region。

hbase_cluster

HBase中的两个特殊的表,-ROOT-和.META.,用来查找各种表的region位置在哪。-ROOT-指向.META.表的region,.META.表指向托管待查找的region的RegionServer。

一次客户端查找过程的3层分布式B+树如下图:
hbase_b-tree
HBase顶层结构图:
hbase_structure

zookeeper负责跟踪region服务器,保存root region的地址。
Client负责与zookeeper子集群以及与HRegionServer的联系。
HMaster负责在启动HBase时,把所有的region分配到每个HRegion Server上,也包括-ROOT-和.META.表。
HRegionServer负责打开region,并创建对应的HRegion实例。HRegion被打开后,它为每个表的HColumnFamily创建一个Store实例。每个Store实例包含一个或多个StoreFile实例,StoreFile是实际数据存储文件HFile的轻量级封装。每个Store有其对应的一个MemStore和多个StoreFile组成,一个HRegionServer共享一个HLog实例。

HBase访问的一次基本的流程:

a、 客户端通过zookeeper获取含有-ROOT-的region服务器名。
b、 通过含有-ROOT-的region服务器查询含有.META.表中对应的region服务器名。
c、 查询.META.服务器获取客户端查询的行键数据所在的region服务器名。
d、 通过行键数据所在的region服务器获取数据。

HFile结构图:
hfile_structure

Trailer有指向其他块的指针,Index块记录Data和Meta块的偏移量,Data和Meta块存储数据。默认大小是64KB。每个块包含一个Magic头部和一定数量的序列化的KeyValue实例。

KeyValue格式:
key_structure

该结构以两个分别表示键长度和值长度的定长数字开始,键包含了行键,列族名和列限定符,时间戳等。

预写日志WAL(Write Ahead Log)

每次更新都会写入日志,只有写入成功才会通知客户端操作成功,然后服务器可以按需自由地批量处理或聚合内存中的数据。

编辑流在memstore和WAL之间分流的过程:
data_flow

处理过程:客户端通过RPC调用将KeyValue对象实例发送到含有匹配region的HRegionServer。接着这些实例被发送到管理相应行的HRegion实例,数据被写入到WAL,然后被放入到实际拥有记录的存储文件的MemStore中。当memstore中的数据达到一定的大小以后,数据会异步地连续写入到文件系统中,WAL能保证这一过程的数据不会丢失。

2. HBase和MapReduce

从MapReduce应用访问HBase有3种方式:作业开始时可以用HBase作为数据源,作业结束时可以用HBase接收数据,任务过程中用HBase共享资源。

  • 使用HBase作为数据源

阶段map

protected void map(ImmutableBytesWritable rowkey,Result result,Context context){
};

从HBase表中读取的作业以[rowkey:scan result]格式接收[k1,v1]键值对,对应的类型是ImmutableBytesWritable和Result。

创建实例扫描表中所有的行

Scan scan = new Scan();
scan.addColumn(…);

接下来在MapReduce中使用Scan实例。

TableMapReduceUtil.initTableMapperJob(tablename,scan,map.class,

输出键的类型.class,输出值的类型.class,job);

  • 使用HBase接收数据

reduce阶段

protected void reduce(
    ImmutableBytesWritable rowkey,Iterable<put>values,Context context){
};

把reducer填入到作业配置中,

TableMapReduceUtil.initTableReducerJob(tablename,reduce.class,job);
3. HBase实现可靠性和可用性

HDFS作为底层存储,为集群里的所有RegionServer提供单一命名空间,一个RegionServer读写数据可以为其它所有RegionServer读写。如果一个RegionServer出现故障,任何其他RegionServer都可以从底层文件系统读取数据,基于保存在HDFS里的HFile开始提供服务。接管这个RegionServerz服务的region。


四、优化HBase

0. 合理设计RowKey避免Region热点出现
1. 随机读密集型

优化方向:高效利用缓存和更好的索引

  • 增加缓存使用的堆的百分比,通过参数 hfile.block.cache.size 配置。
  • 减少MemStore占用的百分比,通过hbase.regionserver.global.memstore.lowerLimit和hbase.regionserver.global.memstore.upperLimit来调节。
  • 使用更小的数据块,使索引的粒度更细。
  • 打开布隆过滤器,以减少为查找指定行的Key Value对象而读取的HFile的数量。
  • 设置激进缓存,可以提升随机读性能。
  • 关闭没有被用到随机读的列族,提升缓存命中率。
2. 顺序读密集型

优化方向:减少使用缓存。

  • 增大数据块的大小,使每次硬盘寻道时间取出的数据更多。
  • 设置较高的扫描器缓存值,以便在执行大规模顺序读时每次RPC请求扫描器可以取回更多行。 参数 hbase.client.scanner.caching 定义了在扫描器上调用next方法时取回的行的数量。
  • 关闭数据块的缓存,避免翻腾缓存的次数太多。通过Scan.setCacheBlocks(false)设置。
  • 关闭表的缓存,以便在每次扫描时不再翻腾缓存。
3. 写密集型

优化方向:不要太频繁刷写,合并或者拆分。

  • 关闭WAL预写日志,直接写入MemStore中,提高写的性能。

  • 调高底层存储文件(HStoreFile)的最大大小,Region越大意味着在写的时候拆分越少。通过参数 hbase.hregion.max.filesize设置。

  • 增大MemStore的大小,通过参数hbase.hregion.memstore.flush.size调节。刷写到HDFS的数据越多,生产的HFile越大,会在写的时候减少生成文件的数量,从而减少合并的次数。

  • 在每台RegionServer上增加分配给MemStore的堆比例。把upperLimit设为能够容纳每个region的MemStore乘以每个RegionServer上预期region的数量。

  • 垃圾回收优化,在hbase-env.sh文件里设置,可以设置初始值为:-Xmx8g -Xms8g -Xmn128m -XX:+UseParNewGC -XX:+UseConcMarkSweepGC
    -XX:CMSInitiatingOccupancyFraction=70

  • 打开MemStore-Local Allocation Buffer这个特性,有助于防止堆的碎片化。 通过参数hbase.hregion.memstore.mslab.enabled设置。

4. 混合型优化参考

优化方向:需要反复尝试各种组合,然后运行测试,得到最佳结果。
影响性能的因素还包括:

  • 压缩:可以减少集群上的IO压力
  • 好的行键Key的设计,结合业务逻辑及查询分析
  • 在预期集群负载最小的时候手工处理大合并
  • 优化RegionServer处理程序计数

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

推荐阅读更多精彩内容

  • 一、简介 Hbase:全名Hadoop DataBase,是一种开源的,可伸缩的,严格一致性(并非最终一致性)的分...
    菜鸟小玄阅读 2,362评论 0 12
  • 本文首先简单介绍了HBase,然后重点讲述了HBase的高并发和实时处理数据 、HBase数据模型、HBase物理...
    达微阅读 2,724评论 1 13
  • HBase那些事 @(大数据工程学院)[HBase, Hadoop, 优化, HadoopChen, hbase]...
    分痴阅读 3,925评论 3 17
  • HBase存储架构图 HBase Master 为Region server分配region 负责Region s...
    kimibob阅读 5,561评论 0 52
  • 参考:https://www.jianshu.com/p/569106a3008f 最近在逐步跟进Hbase的相关...
    博弈史密斯阅读 845评论 1 1