hbase性能调优 :
rowkey的设计:
设计原则:写入要分散,减少regoin的热点问题
hbase与hive仓库的上层应用服务于:用户画像,报表,做的交付项目
用户画像数据上线为亿条:用户行为数据,一条数据很大
订单类数据上线为数十亿条:条数众多,但每条数据不是特别大
理论上,绝大部分数据都要经过hive加工处理:
1.数据分为内部数据,存在于关系型数据,通过sqoop全量/增量导入到hive
2.外部数据:抓取的,供应商提供的,不方便暴漏数据的数据(包括内部数据),以文件形式缓存到本地,load到hdfs上
3.hive处理完的汇总数据,数据量不大通过sqoop导入orcale。
4.某些不方便暴漏数据库的数据,数据量大以文件方式存在,且为为结构化数据,load到hdfs上通过mapReduce处理,hive使用外部表,做后续处理。
5.resful接口推过来的数据(json格式)解析后,写入hbase;hive做映射表处理数据
hbase提供明细数据查询接口:
用户画像数据上线为亿条:用户行为数据,一条数据很大
订单类数据上线为数十亿条:条数众多,但每条数据不是特别大
1.通常不用hive映射到hbase的方式,如造成数据倾斜:如预分区,二级索引做不到。
2.hbase创建预分区表:通过mr等形式从hdfs写入到hbase
3.某些不方便暴漏数据库的数据,数据量大以文件方式存在,且为为结构化数据,load到hdfs上通过mapReduce处理后的明细数据写入到hbase
4.resful接口推过来的数据(json格式)解析后,写入hbase;
5.用户画像:建立二级索引:用户标签等多维查询
6.订单数据:建立二级索引:时间范围,订单类型,来源系统等多维查询
mapReduce的用途:
1.处理数据:某些不方便暴漏数据库的数据,数据量大以文件方式存在,且为为结构化数据,load到hdfs上通过mapReduce处理,hive使用外部表,做后续处理。
2.提供查询接口:1).hbase创建预分区表:通过mr等形式从hdfs写入到hbase
2).使用mr为hbase创建二级索引
hbase自身的操作:
1.rowkey的设计:
1).RowKey必须进行散列化处理(比如MD5散列/随机数),同时建表必须进行预分区处理
例:使数据均匀分布到regionServer中,防止不必要的裂变
(1).用户画像:用户标签等多维查询
有身份证:来源系统+idtype+身份证+五位随机数
无身份证:来源系统+idtype+手机号码+五位随机数
倒序,使rowkey离散化,均匀的插入到各个预分区中
说明:取随机数的位数与数据量有关
(2).订单数据:时间范围,订单类型,来源系统等多维查询
来源系统+订单+时间戳(精确到日or月:看数据量,大的精确到日,小的精确到月)
倒序,根据rowkey的分布,均匀的插入到各个预分区中
2.多维数据的查询建立二级索引:
hbase本身的查询方式只有两种:1.通过rowkey查询。2.全表扫描
二级索引:空间换时间,1.单独建立一张索引表。2.索引数据与主数据共存一张表。
索引数据:多维度列通过列过滤器全表扫描拿到rowkey,rowkey当作列,rowkey前缀+多维度列当作rowkey存储,同时保证索引数据与主数据在同一个分区,减少了io。索引数据的建立通过mr实现
2.插入数据:单行单列,单行多列,多行单列,多行多列
2.查询操作:
1).尽量通过rowkey查询:直接根据rowkey查询;根据rowkey过滤器查询(范围过滤器饿,前缀匹配过滤器);建立二级索引
2).全表扫描:过滤器的使用:
列族,列过滤器,value过滤器,时间戳过滤器,列数过滤器,分页过滤器。这个网上一搜一堆
HBase客户端优化:
1.配置扫描器缓存 :
有三个地方可以进行配置:
1)在HBase的conf配置文件中进行配置
2)通过调用HTable.setScannerCaching(int scannerCaching)进行配置
3)通过调用Scan.setCaching(int caching)进行配置。三者的优先级越来越高。
优化原理:在解释这个问题之前,首先需要解释什么是scan缓存,通常来讲一次scan会返回大量数据,因此客户端发起一次scan请求,实际并不会一次就将所有数据加载到本地,而是分成多次RPC请求进行加载,这样设计一方面是因为大量数据请求可能会导致网络带宽严重消耗进而影响其他业务,另一方面也有可能因为数据量太大导致本地客户端发生OOM。在这样的设计体系下用户会首先加载一部分数据到本地,然后遍历处理,再加载下一部分数据到本地处理,如此往复,直至所有数据都加载完成。数据加载到本地就存放在scan缓存中,默认100条数据大小。
2.使用批量get进行读取请求
优化原理:HBase分别提供了单条get以及批量get的API接口,使用批量get接口可以减少客户端到RegionServer之间的RPC连接数,提高读取性能。另外需要注意的是,批量get请求要么成功返回所有请求数据,要么抛出异常。
3.查询指定列族或者列
优化原理:HBase是典型的列族数据库,意味着同一列族的数据存储在一起,不同列族的数据分开存储在不同的目录下。如果一个表有多个列族,只是根据Rowkey而不指定列族进行检索的话不同列族的数据需要独立进行检索,性能必然会比指定列族的查询差很多,很多情况下甚至会有2倍〜3倍的性能损失。
4.使用过滤器可以提高操作表的效率
1. Comparision Filters(比较过滤器)
RowFilter
FamilyFilter
QualifierFilter
ValueFilter
DependentColumnFilter
2. Dedicated Filters(专用过滤器)
SingleColumnValueFilter
SingleColumnValueExcludeFilter
PrefixFilter
PageFilter
KeyOnlyFilter
FirstKeyOnlyFilter
TimestampsFilter
RandomRowFilter
3、Decorating Filters(附加过滤器)
SkipFilter
WhileMatchFilters
HBase服务器端优化:
1.读请求是否均衡:RowKey必须进行散列化处理(比如MD5散列),同时建表必须进行预分区处理
http://www.cnblogs.com/yingjie2222/p/6084255.html
写操作:
通常 MapReduce 在写HBase时使用的是 TableOutputFormat 方式,在reduce中直接生成put对象写入HBase,该方式在大数据量写入时效率低下(HBase会block写入,频繁进行flush,split,compact等大量IO操作),并对HBase节点的稳定性造成一定的影响(GC时间过长,响应变慢,导致节点超时退出,并引起一系列连锁反应),而HBase支持 bulk load 的入库方式,它是利用hbase的数据信息按照特定格式存储在hdfs内这一原理,直接在HDFS中生成持久化的HFile数据格式文件,然后上传至合适位置,即完成巨量数据快速入库的办法。配合mapreduce完成,高效便捷,而且不占用region资源,增添负载,在大数据量写入时能极大的提高写入效率,并降低对HBase节点的写入压力。
通过使用先生成HFile,然后再BulkLoad到Hbase的方式来替代之前直接调用HTableOutputFormat的方法有如下的好处:
(1)消除了对HBase集群的插入压力
(2)提高了Job的运行速度,降低了Job的执行时间
目前此种方式仅仅适用于只有一个列族的情况,在新版 HBase 中,单列族的限制会消除。
2、bulkload 流程与实践
bulkload 方式需要两个Job配合完成:
(1)第一个Job还是运行原来业务处理逻辑,处理的结果不直接调用HTableOutputFormat写入到HBase,而是先写入到HDFS上的一个中间目录下(如 middata)
(2)第二个Job以第一个Job的输出(middata)做为输入,然后将其格式化HBase的底层存储文件HFile
(3)调用BulkLoad将第二个Job生成的HFile导入到对应的HBase表中