HBase常见问题答疑解惑【持续更新中】

本文对HBase开发及使用过程中遇到过的常见问题进行梳理总结,希望能解答新加入的HBaser们的一些疑惑。

1. HTable线程安全吗?

HTable不是线程安全的,使用过程中建议一个线程中使用一个HTable对象,不同线程间不要共享HTable对象。

同时,为了提高客户端的效率,不同的HTable对象公用同一个Configuration对象,共享HBase服务端的元数据信息,详见HBase权威指南中有关HTable部分的介绍。

2. HTablePool该如何使用?

HBase 0.90 版本以前,使用HTablePool时通过getTable方法获取HTable对象,使用完成后调用putTable方法将HTable对象放回到池中。

而HBase 0.90 以后的新版本中,使用完成后不再调用putTable方法,而是调用HTable的close方法将HTable对象放回到池中。

3. Scanner的Caching与Batch有什么区别?

caching是一次从服务端取到客户端的记录条数;而batch则是一次返回给客户端(一个Result对象中)的KeyValue的个数。

举个例子:如果每行记录有5个KeyValue,而仅仅设置caching=10,假设scan表过程中表中匹配到的记录数大于10条,那么一次next()操作从服务端返回的是10个Result,每个Result含有5个KeyValue:

* * * * *

* * * * *

* * * * *

* * * * *

* * * * *

* * * * *

* * * * *

* * * * *

* * * * *

* * * * *

而如果同时设置batch=2,那么一次next()操作将返回17个KeyValue:

* *

* *

*

* *

* *

*

* *

* *

*

* *

4. Put(List<Put> puts)效率一定更高吗?

put(list)是用于提高吞吐量的。首先在不同region server之间是并行的;在同一个region server上的同一个region上也是并行的,而在不同region上则是串行的。

因为在同一个region server上,如果put(list)在一个region上执行,那么它是打包写一条日志的,相当于并行写入;而在不同region上执行话,它是一个for循环,而不是走线程池,所以是串行的。

5. Increment的正确性和性能靠谱吗?

目前Increment还无法做到完全的正确性,在网络出现timeout和region server发生failover的时候可能不正确,使用时需要根据应用场景慎重选择。

至于Increment的性能,性能还不错,尤其是在HBase 0.94和普通的Put写操作差别不大,能达到每台region server 7000+。

6. Region个数越多越好吗?

Region过多则影响flush效率和region server failover效率,还有就是对HDFS的压力比较大;Region过少则对读有影响,因为StoreFile数量比较多了,如果每个Region的StoreFile数量很少(线上集群一般维持在1.x~2.x个StoreFile),那么对读操作无明显影响。

写入的话,Region多少影响不大,除非Region特别少并且写压力特别大,比如一个region server只有一个Region的特殊情况。

现在HBase 0.90版本每个region server建议3000个以内Region;而HBase 0.94版本则建议在1000个以内,几百个就算很多了。

7. WAL操作日志的开销有多大?

一般情况下,向region server服务端put数据时,如果开启写WAL日志的话,服务端大概会需要1ms~2ms的开销。而如果不开启WAL日志的话,服务端只有大概0.xms的开销,基本上都是MemStore的内存操作。

另外,不管哪种情况下,对于一次put操作,都还需要加上网络传输延迟RTT开销(一般在0.5ms~1ms以内)。

8. 单表单Region的写入性能有多高?

不考虑任何优化的前提下,Java API在WAL开启的情况下每秒能达到800左右 tps,关闭WAL则能达到1000+ tps,基本上就是网络速度的上限;而Thrift接口大概有10~20%的性能损失,实际测试显示在网络RTT=0.7ms的环境下,能达到每秒550左右tps;在网络RTT=2.0ms的情况下,则只能达到350左右tps。

以上的写入性能数据,与HBase的实际写入性能相差甚远,因为没有考虑进行优化,实际应用中可以从预分region、多客户端、多线程、批量写入等方式使每个region server达到性能极限。

注意:单表单region的情况下,短时间内如果低并发写入没有问题,而如果高并发写入,则写一会之后可能会由于发生region split而导致请求被block住。

9. 单Region Server的写入性能有多高?

如果要压测单个region server的写入能力,那么可以新建一张测试表,同时预先创建多个region(例如:10~50个),然后随机生成rowkey和value写入到HBase集群进行压力测试,最终测试结果除以HBase集群内region server的个数,就可以大概得到单个region server的写入性能值了。

从HBase集群测试团队得到的结果,对于16核CPU,24GB内存的region server机器(DataNode进程分配1GB内存,HBase RegionServer进程分配16GB内存),不开WAL的话,单region server可以达到3w以上tps;开启WAL的话,一般单region server能达到9k~2w tps。而HBase的Thrift接口,可以达到Native Java API 80%~90%左右的性能。

10. Rowkey中包含时间戳导致空Region有什么问题?

假设rowkey中包含时间戳,同时设置了TTL,自动删除过期数据,那么随着时间戳值的增长,会导致过期数据已经被删除,但是空的region还存在,过多的region会影响flush效率和region server failover效率,还有就是对HDFS的压力比较大;同时由于过多空region也会占用一些元数据信息。

解决这个问题,一般有两个方法:

1)按时间周期新建不同的表:例如按天建不同的表,跨天时切换表进行读写,该方法的缺点是每天都需要建表,由于DDL事务都是master做的,只要master出问题就容易影响事务,一般来说为了防止受master影响,需要提前几天把表建好。

2)将时间戳字段进行处理:rowkey中不直接存储当前的时间戳timestamp,而改为存储自当周周一凌晨00:00:00开始累计的时间戳值(秒或毫秒等均可),这样表中最多存储一周数据对应的region数,当下周开始后就开始复用之前的region,从而避免了region的膨胀。相应地,查询端也需要对时间戳timestamp进行响应的处理。考虑到扩展性,假设要保存的数据超过一周时间,那么该方法也可以从1周扩展到1个月进行适应。

HBase常见问题答疑解惑【持续更新中】的更多相关文章

  1. iOS UI、Xcode、调试、代码等常见问题总汇(持续更新中)

    以前比较懒,遇到问题解决了就完事了,有些问题再次遇到时忘记了当初是怎么解决的,又要查各种资料来解决.好记忆不如烂笔头,不管简单还是复杂都记一下吧,所以决定写一篇常见问题总结,方便以后查阅.现在有点忙, ...

  2. angularjs开发常见问题-1(持续更新中...)

    angularJs中学习中- 1.刷新当前页面数据:$state.reload service.create(data).then(function (newItem) { flash.success ...

  3. git 常见问题收集(持续更新中)

    1.问题:在配置完成github上的ssh后如何使用ssh? 答: 1)http方式 url =https://github.com/username/test_repo.git 2)ssh方式:把u ...

  4. 史上最全的spark面试题——持续更新中

    史上最全的spark面试题——持续更新中 2018年09月09日 16:34:10 为了九亿少女的期待 阅读数 13696更多 分类专栏: Spark 面试题   版权声明:本文为博主原创文章,遵循C ...

  5. git常用命令(持续更新中)

    git常用命令(持续更新中) 本地仓库操作git int                                 初始化本地仓库git add .                       ...

  6. Atom使用记录(持续更新中)

    部分内容取自:http://www.jianshu.com/p/dd97cbb3c22d,我自己也在使用,持续更新中 Atom安装插件在窗口中File---Setting---install 在里面进 ...

  7. Pig基础学习【持续更新中】

    *本文参考了Pig官方文档以及已有的一些博客,并加上了自己的一些知识性的理解.目前正在持续更新中.* Pig作为一种处理大规模数据的高级查询语言,底层是转换成MapReduce实现的,可以作为MapR ...

  8. Pig语言基础-【持续更新中】

      ***本文参考了Pig官方文档以及已有的一些博客,并加上了自己的一些知识性的理解.目前正在持续更新中.***   Pig作为一种处理大规模数据的高级查询语言,底层是转换成MapReduce实现的, ...

  9. java视频教程 Java自学视频整理(持续更新中...)

    视频教程,马士兵java视频教程,java视频 1.Java基础视频 <张孝祥JAVA视频教程>完整版[RMVB](东西网) 历经5年锤炼(史上最适合初学者入门的Java基础视频)(传智播 ...

随机推荐

  1. 从ICassFactory为CLSID为{17BCA6E8-A950-497E-B2F9-AF6AA475916F}的COM组件创建实例失败,原因是出现以下错误:c001f011.(Microsoft.Server.manageDTS

    从ICassFactory为CLSID为{17BCA6E8-A950-497E-B2F9-AF6AA475916F}的COM组件创建实例失败,原因是出现以下错误:c001f011.(Microsoft ...

  2. C#中转义字符

    编程中很多细节问题我们都要十分的注意,要不一个小小的字母错误就能引起程序的无法运行. C#中转义字符分2中,一种是\,一种是@. @符号在C#中有两个作用作用1.在字符串的前面加@表示取消字符串中的转 ...

  3. oc之对象作为类的属性

    对象做为类的属性 1. 一个Target中的类无法直接在另外1个Target中访问. 2. 类的属性代表什么? a. 类的属性代表这类事物具有的共同的特征 b. 类的属性代表这个类所拥有的东西. 灯: ...

  4. HTML target 属性

    定义和用法 <a> 标签的 target 属性规定在何处打开链接文档. 如果在一个 <a> 标签内包含一个 target 属性,浏览器将会载入和显示用这个标签的 href 属性 ...

  5. 安装windows后grub的恢复

    问题: 原本是:双系统(linux和windows),后来换windows版本覆盖了grub2 解决方法: 进入windows后下载并安装EasyBCD并添加grub2的选项,重启看见了熟悉的启动项, ...

  6. 剑指offer ------ 刷题总结

    面试题3 -- 搜索二维矩阵 写出一个高效的算法来搜索 m × n矩阵中的值. 这个矩阵具有以下特性: 1. 每行中的整数从左到右是排序的. 2. 每行的第一个数大于上一行的最后一个整数. publi ...

  7. CSS3之3D效果中的transform运用

    css3中添加了很多新的标签 属性 描述 css transform 向元素应用 2D 或 3D 转换. 3 transform-origin 允许你改变被转换元素的位置. 3 transform-s ...

  8. hdu1029

    #include<iostream>#include<string.h>using namespace std;int main(){ int n,i; int t; int ...

  9. HDOJ_就这么个烂题总是WA先放这把

    #include<stdio.h> __int64 A[100]={0}; __int64 B[100]={0}; __int64 SUM[100]={0}; int main() {in ...

  10. 变形属性 transform

    transform功能可以实现文字或图像的旋转.绽放.倾斜.与移动: 注意点:1.其移动.旋转.倾斜.与绽放这4种效果的使用先后顺序不同,页面会显示不同的结果: 2.属性值有一个参数与有多个参数的别: ...