内容简介:一、HBase介绍1、基本概念HBase是一种Hadoop数据库,经常被描述为一种稀疏的,分布式的,持久化的,多维有序映射,它基于行键、列键和时间戳建立索引,是一个可以随机访问的存储和检索数据的平台。HBase不限制存储的数据的种类,允许动态的、灵活的数据模型,不用SQL语言,也不强调数据之间的关系。HBase被设计成在一个服务器集群上运行,可以相应地横向扩展。
编辑推荐: |
本文来自于36大数据,HBase是一种Hadoop数据库,是一个可以随机访问的存储和检索数据的平台 |
一、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-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) ;
工作机制:
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可以看做是一个键值数据库。HBase的设计是面向半结构化数据的,数据记录可能包含不一致的列,不确定大小等。
三、分布式的HBase、HDFS和MapReduce
1、分布式模式的HBase
HBase将表会切分成小的数据单位叫region,分配到多台服务器。托管region的服务器叫做RegionServer。一般情况下,RgionServer和HDFS DataNode并列配置在同一物理硬件上,RegionServer本质上是HDFS客户端,在上面存储访问数据,HMaster分配region给RegionServer,每个RegionServer托管多个region。
HBase中的两个特殊的表,-ROOT-和.META.,用来查找各种表的region位置在哪。-ROOT-指向.META.表的region,.META.表指向托管待查找的region的RegionServer。
一次客户端查找过程的3层分布式B+树如下图:
HBase顶层结构图:
zookeeper负责跟踪region服务器,保存root region的地址。
Client负责与zookeeper子集群以及HRegionServer联系。
HMaster负责在启动HBase时,把所有的region分配到每个HRegion Server上,也包括-ROOT-和.META.表。
HRegionServer负责打开region,并创建对应的HRegion实例。HRegion被打开后,它为每个表的HColumnFamily创建一个Store实例。每个Store实例包含一个或多个StoreFile实例,它们是实际数据存储文件HFile的轻量级封装。每个Store有其对应的一个MemStore,一个HRegionServer共享一个HLog实例。
一次基本的流程:
a、 客户端通过zookeeper获取含有-ROOT-的region服务器名。
b、 通过含有-ROOT-的region服务器查询含有.META.表中对应的region服务器名。
c、 查询.META.服务器获取客户端查询的行键数据所在的region服务器名。
d、 通过行键数据所在的region服务器获取数据。
HFile结构图:
Trailer有指向其他块的指针,Index块记录Data和Meta块的偏移量,Data和Meta块存储数据。默认大小是64KB。每个块包含一个Magic头部和一定数量的序列化的KeyValue实例。
KeyValue格式:
该结构以两个分别表示键长度和值长度的定长数字开始,键包含了行键,列族名和列限定符,时间戳等。
预写日志WAL:
每次更新都会写入日志,只有写入成功才会通知客户端操作成功,然后服务器可以按需自由地批量处理或聚合内存中的数据。
编辑流在memstore和WAL之间分流的过程:
处理过程:客户端通过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
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、写密集型
优化方向:不要太频繁刷写,合并或者拆分。
调高底层存储文件(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压力
好的行键设计
在预期集群负载最小的时候手工处理大合并
优化RegionServer处理程序计数
以上所述就是小编给大家介绍的《HBase核心知识点总结》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- JS核心知识点梳理——数据篇
- 讲解 Zookeeper 的五个核心知识点
- JS核心知识点梳理——原型、继承(上)
- 【MQ系列】RabbitMq核心知识点小结
- JS核心知识点梳理——异步,单线程,运行机制
- Spring Boot MQ:RabbitMQ 核心知识点小结
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Domain-Driven Design Distilled
Vaughn Vernon / Addison-Wesley Professional / 2016-6-2 / USD 36.99
Domain-Driven Design (DDD) software modeling delivers powerful results in practice, not just in theory, which is why developers worldwide are rapidly moving to adopt it. Now, for the first time, there......一起来看看 《Domain-Driven Design Distilled》 这本书的介绍吧!