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的个数。

更多精彩内容:http://www.bianceng.cnhttp://www.bianceng.cn/database/extra/

举个例子:如果每行记录有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个月进行适应。

时间: 2024-10-25 06:53:10

HBase的常见疑难问题的相关文章

启动Oracle常见疑难问题分析

oracle|问题 启动Oracle常见疑难问题分析 (2003-10-1)  本文出自<网管员世界>2003年第10期"故障诊断"栏目 实例和数据库的启动与关闭是DBA的重要职责之一.只有打开数据库,其他用户才能对数据库中的数据进行操作.一旦数据库关闭,便不能对其操作.对于DBA们来说,关闭和重新启动数据库以便优化.调整应用程序的运行是经常碰到的事情.如果用户已经进入了数据库,使用SHUTDOWN IMMEDIATE 或SHUTDOWN ABORT命令来执行关闭数据库,则

PHP常用函数和常见疑难问题解答

虽然PHP在整体功能上不如Java强大,但相比PHP而言Java算是较重量级的,所以在小中型系统的开发上,使用PHP的趋势不可挡,就算是大型网站,比如淘宝也部分使用了PHP(Java后台逻辑+PHP前台展示),所以赶紧开始学PHP啦 首先介绍下比较简单但必不可少且实用的知识,可以当手册查询,适合像我一样的新手看.   PHP常用库函数介绍   一.PHP字符串操作常用函数 1.确定字符串长度  int strlen(string str) 2.比较两个字符串 a. strcmp函数对两个字符串进

解答Win8系统中邮件相应的常见疑难

  导读:解答Win8系统邮件常见疑难,目前一些喜欢在系统中使用邮件服务的童鞋们,在操作使用微软最新研发的Win8操作系统下,使用了一段时间之后,网络中就出现了一系列的问题症状,这些相对应的症状疑难我们又该如何对其进行操作解决呢? 如何向"邮件"中添加电子邮件帐户? 在"开始"屏幕上,点击或单击"邮件". 1.从屏幕右边缘向中间轻扫,然后点击"设置". 2.点击或单击"帐户". 3.点击或单击"添

Linux常见疑难问答​

原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://chenguang.blog.51cto.com/350944/1328871 Linux常见疑难问答 (1)按a~z顺序排列启动服务进程. #exportLC_ALL=C           #英文环境变量设置,主要用于解决乱码问题 #chkconfig –list | grep [z-a] : | grepon $ sort (2)显示运行级别为5的所有服务. #chkcon

JS常见疑难点分析之match,charAt,charCodeAt,map,search用法分析

本文实例讲述了JS常见疑难点分析之match,charAt,charCodeAt,map,search用法.分享给大家供大家参考,具体如下: JavaScript match() 方法 定义和用法 match() 方法可在字符串内检索指定的值,或找到一个或多个正则表达式的匹配. 该方法类似 indexOf() 和 lastIndexOf(),但是它返回指定的值,而不是字符串的位置. 语法 匹配字符串,返回指定的值 stringObject.match(searchvalue) 匹配正则,返回指定

PHP常用函数和常见疑难问题解答_php技巧

首先介绍下比较简单但必不可少且实用的知识,可以当手册查询,适合像我一样的新手看. PHP常用库函数介绍 一.PHP字符串操作常用函数1.确定字符串长度 int strlen(string str)2.比较两个字符串a. strcmp函数对两个字符串进行二进制安全的比较,并区分大小写int strcmp(string str1,string str2)b. 以不区分大小写的方式比较两个字符串int strcasecmp(string str1,string str2) 3.求两个字符串相同部分in

Oracle基础知识-启动Oracle常见疑难问题分析

实例和数据库的启动与关闭是DBA的重要职责之一.只有打开数据库,其他用户才能对数据库中的数据进行操作.一旦数据库关闭,便不能对其操作.对于DBA们来说,关闭和重新启动数据库以便优化.调整应用程序的运行是经常碰到的事情.如果用户已经进入了数据库,使用SHUTDOWN IMMEDIATE 或SHUTDOWN ABORT命令来执行关闭数据库,则用户将失去连接,直到数据库重新启动.经常关闭和启动会对数据库性能造成一定的影响,当然也会影响到用户对数据库的使用.本文从管理数据库的角度来分析在Oracle启动

常见疑难BIOS设置选项详解

主机板BIOS中有很多设置可能大家经常都"耳熟能详"了,不过朋友们对其名称的熟悉程度并不能代表对其意义完全理解.上周陪一位友人去购机,在装机时笔者看见那装机人员在主机板的BIOS里设来设去的.笔者便随意的问道"Graphics Aperture Size这个选项是什么意思?".装机人员回答了一句"设置显存大小",然后笔者再追问其意义时,只听那人说"我也不知道到底有什么意思".天啊!他都不知道是什么意思,居然还在帮我们装机!有了

CF玩不了?CF常见疑难问题解决方法

[科技讯]12月115.html">26日消息,相信CF玩家在游戏时都曾遇到过游戏打不开,游戏报错,游戏玩不了游戏不能全屏等等烦人的情况.尤其是对于win7用户来说,令人苦恼的兼容问题无时不刻不影响着玩家的http://www.aliyun.com/zixun/aggregation/18698.html">游戏体验.那么如何解决这些问题呢?今天小编就为大家整理了一些玩家平时可能遇到的棘手问题的解决方法,希望对玩家们有所帮助. 问题1.游戏安全系统检测到游戏文件缺失或损坏,