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. 使用 IDEA 创建 Maven Web 项目 (四)- 让 WEB 应用跑起来

    在 IDEA 中配置 Tomcat 单击 IDEA 工具栏上的 Edit Configurations... (在一个下拉框中),弹出 Run/Debug Configurations 对话框. 单击 ...

  2. 错误: 找不到或无法加载主类 tomcat-juli.jar

    错误: 找不到或无法加载主类 tomcat-juli.jar 然后就可以用了.

  3. 采用apicloud开发移动端项目心得体会

    作为第一批吃螃蟹的,来说一说apicloud做移动端项目的一些体会. 刚开始接到项目,需要移动端开发两个项目,公司人员里面没有一个会原生android或者ios开发的,目前能出的技术也就是web,后端 ...

  4. IOS GCD使用实例大全

    GCD是大家在IOS开发过程中经常使用的一种多线程管理机制.原理这里就不多说了,大家关心的大部分都是它的使用,下面主要介绍GCD的主要方法及其实例. 1.认识主队列,感受串行队列的运行,运行结果打印的 ...

  5. 用websocket实现后台推送消息

    1前台实现 connect:function() { var webSocketIP = window.CRM_CONFIG.WebSocketIP; var target = 'ws://'+web ...

  6. Linux网络常用头文件说明

    sys/types.h:数据类型定义 sys/socket.h:提供socket函数及数据结构 netinet/in.h:定义数据结构sockaddr_in arpa/inet.h:提供IP地址转换函 ...

  7. one hot encoding

    转自:http://blog.sina.com.cn/s/blog_5252f6ca0102uy47.html 问题由来 在很多机器学习任务中,特征并不总是连续值,而有可能是分类值. 例如,考虑一下的 ...

  8. Linode VPS上架日本东京2号机房,性能速度评测报告(推荐)

    我非常喜欢的海外免备案vps品牌linode日本机房长期缺货,中国用户想买都买不到.不过近日,陆续有国内朋友收到了Linode邀请,Tokyo 2日本东京机房开启内测,很快正式上架销售. 苦等太久的站 ...

  9. 一个App从创意到最终上架到App Store里的整个过程是怎样的?

    一个App从创意到最终上架到App Store里的整个过程是怎样的? 制作App需要什么软件?应该看什么书?需要哪些设备?推到App Store里,需要注册什么网站?是否需要付费?需要什么证书之类的? ...

  10. 浅谈html入门

    一. 学习web前端开发基础技术需要掌握:HTML.CSS.JavaScript语言.下面就来了解下这三门技术都是用来实现什么的:1. HTML是网页内容的载体.内容就是网页制作者放在页面上想要让用户 ...