失效链接处理 |
性能调优(参数)指导手册 - HBase分册 PDF 下载
本站整理下载:
提取码:5lep
相关截图:
主要内容:
1. HBase 调优前相关规划设计
//要做好调优,前期相关的规划设计也非常重要。如:HBase 的 rowkey 设计,Region 预
分区,二级索引设计等;本章节主要阐述与性能调优强相关的部分设计约束。本文主要
描述相关的要点,具体的设计请参考相关的二次开发文档指导。
1.1. Rowkey 设计
Rowkey 作用:
1) 每个 Key 值被用来唯一的识别一行记录
2) 用来快速的检索一条用户数据
3) 用户数据是基于 Key 值全局排序的
设计 Rowkey 考虑因素:
1) 用户最有价值/频率最高的查询场景是基于哪个字段进行的
2) 查询时是否需要按照某个字段进行排序
3) 被选定作为 RowKey 的字段,是否能够唯一的识别一行记录
1.2. 预分区
默认情况下,在创建 HBase 表的时候会自动创建一个 region 分区,当导入数据的时候,
所有的 HBase 客户端都向这一个 region 写数据,直到这个 region 足够大了才进行切分。
一种可以加快批量写入速度的方法是通过预先创建一些空的 regions,这样当数据写入
HBase 时,会按照 region 分区情况,在集群内做数据的负载均衡。
Region 预分的目标:
1) 在表数据量不断增长的情况下,Region 自动分裂期间会有很短暂的时间该 Region
不能提供读写服务。因此,预分 Region 可以尽量减少或避免在线系统的 Region 自
动分裂。
2) 提高数据写入性能。如果采用 BulkLoad 方式进行数据导入时,Reduce 的个数等于
用户表的 Region 个数(主索引的 Region 个数+二级索引的 Region 个数)。Reduce
的个数也很大的影响着 BulkLoad 的性能。如果采用 Java 接口进行实时数据的写入,
Region 分布在多个物理节点上也可以提高写入性能。
3) 提高数据读取性能。每个 Region 的数据是一个 RowKey 的范围,因此该范围内的数
据读取则必然经过该 Region,因此当该多索引数据预分成多个 Region 之后,通过该
索引的读取请求则可以由多台机器节点来分担,从而提高读取性能。
4) 使得数据尽可能的均匀分布在各个 Region 中,从而使读写请求能够比较均匀的分布
在各个物理节点上
1.3. 二级索引
影响查询的关键的因素在于所提供的查询条件能否将 RowKey 限定在一个较合理的范围
区间内。
构建索引基本原则
1) 应该对所有的查询请求进行全面分析,基于确实能够缩小查询范围的一部分列来构
建索引。
2) 应该基于离散度较好的列来构建二级索引。
a) 离散度概念:对于数据表中的某个列 A,它的所有的可能的枚举值共有 M 个,
而数据表的总记录为 N 条,我们通过如下的方法来简单的计算列 A 的离散度:
列 A 的离散度 = M/N
3) 应该要考虑多个索引所带来的存储空间膨胀以及性能下降问题。建议,在充分分析
了各种查询场景的情况下,通过构建尽量少的索引,来满足更多的查询场景。
2. 关键参数配置指导
如果同时存在读和写的操作,这两种操作的性能会互相影响。如果写入导致的 flush 和
Compaction 操作频繁发生,会占用大量的磁盘 IO 操作,从而影响读取的性能。如果写
入导致阻塞较多的 Compaction 操作,就会出现 Region 中存在多个 HFile 的情况,从而影
响读取的性能。所以如果读取的性能不理想的时候,也要考虑写入的配置是否合理。
2.1. 提升写效率
2.1.1. 客户端调优
2.1.1.1. AutoFlush
【参数值】
setAutoFlush
【参数解析】
autoflush=false 的原理是当客户端提交 delete 或 put 请求时,将该请求在客户端缓存,
直到数据超过 2M(hbase.client.write.buffer 决定)或用户执行了 hbase.flushcommits()时才
向 regionserver 提交请求。因此即使 htable.put()执行返回成功,也并非说明请求真的成
功了。假如还没有达到该缓存而 client 崩溃,该部分数据将由于未发送到 regionserver
而丢失。这对于零容忍的在线服务是不可接受的。
autoflush=true 虽然会让写入速度下降 2-3 倍,但是对于很多在线应用来说这都是必须打
开的,也正是 hbase 为什么让它默认值为 true 的原因。当该值为 true 时,每次请求都
会发往 regionserver,而 regionserver 接收到请求后第一件事就是写 hlog,因此对 io 的要
求是非常高的,为了提高 hbase 的写入速度,应该尽可能高地提高 io 吞吐量,比如增加
磁盘、使用 raid 卡、减少 replication 因子数等。
【如何调优】
经验设定:
setAutoFlush = false
2.1.1.2. 使用 Put List 方式提交请求
可以极大地提升写性能。
2.1.2. Memstore 相关
当 regionserver(以下简称RS)收到一个写请求,会将这个请求定位到某个特定的 region。
每个 region 存储了一系列的 row,每个 row 对应的数据分散在一个或多个 ColumnFamily
(以下简称 CF)中 。特定 CF 的数据都存储在对应的 store 里面,而每个 store 都由一
个 memstore 和数个 storefile 组成。memstore 存储在 RS 的内存中,而 storefile 则存储
在 HDFS 上。当一个写请求到达 RS 的时候,该请求对应的数据首先会被 memstore 存储,
直到达到一定的临界条件,memstore 里面的数据才会 flush 到 storefile。
使用 memstore 的主要原因是为了使存储在 HDFS 上的数据是有序的(按 row) 。HDFS
设计为顺序读写的,已有的文件不能被修改。这就意味着,因为 hbase 收到的写请求是
无序的,所以如果直接将这些数据写到 HDFS 上,以后再对文件里面的内容做排序就是
一件极其困难的事情;无序的数据存储方式,又会大大影响后续的读请求性能。为了解
决这种问题,hbase 会将最近的某些写请求放到内存中(也就是 memstore),并将这些数
据在 flush 到 storefile 之前做好排序
|