hbase使用中需要注意一些问题
接触hbase已经两年之久,但是真正的在实际项目中使用却只有半年的时间,使用过程中,一方面在在为hbase强大的性能兴奋之余,另一方面却也给我和我的团队造成了很多的麻烦,起初在使用我的水平也就停留在会用而已,根本谈不上优化,但是后来发现,如果想要把它用好,让它在你的业务中不出问题,那么就需要你针对自己的业务去进行优化,下面是我认为在使用中应当注意的几点问题:
1. 安装集群前
- 配置SSH无密码登陆
- DNS。HBase使用本地 hostname 才获得IP地址,正反向的DNS都是可以的。你还可以设置
hbase.regionserver.dns.interface
来指定主接口,设置hbase.regionserver.dns.nameserver
来指定nameserver,而不使用系统带的 - 安装NTP服务,并配置和检查crontab是否生效
- 操作系统调优,包括最大文件句柄,nproc hard 和 soft limits等等
conf/hdfs-site.xml
里面的dfs.datanode.max.xcievers
参数,至少要有4096,建议这个值设置的大一点,要不然你就要忍受不定时regionserver宕机的麻烦,而且集群恢复、移动region过程中,会造成集群整个的io负载严重,特别是当你的zookeeper和hbase部署在一起的时候,可能会因为io过高,导致zookeeper无法响应的情况,最终导致整个集群挂掉,这样的事情我遇到多次,希望大家引以为戒,尽量吧zookeeper进行单独部署。zookeeper的一些设置、优化可以参见:http://www.cnblogs.com/wq920/p/4182720.html
2. HDFS客户端配置
如果你希望Hadoop集群上做HDFS 客户端配置 ,例如你的HDFS客户端的配置和服务端的不一样。按照如下的方法配置,HBase就能看到你的配置信息:
- 在hbase-env.sh里将
HBASE_CLASSPATH
环境变量加上HADOOP_CONF_DIR
。 - 在
${HBASE_HOME}/conf
下面加一个 hdfs-site.xml (或者 hadoop-site.xml) ,最好是软连接 - 如果你的HDFS客户端的配置不多的话,你可以把这些加到 hbase-site.xml上面.
例如HDFS的配置 dfs.replication
你希望复制5份,而不是默认的3份。如果你不照上面的做的话,Hbase只会复制3份。
3. 一些配置参数
以下参数来自apache的hbase版本,如果你使用的其他厂商的hbase,有可能默认值不一样。
zookeeper.session.timeout
:这个默认值是3分钟。这意味着一旦一个server宕掉了,Master至少需要3分钟才能察觉到宕机,开始恢复。你可能希望将这个超时调短,这样Master就能更快的察觉到了。在你调这个值之前,你需要确认你的JVM的GC参数,否则一个长时间的GC操作就可能导致超时。hbase.regionserver.handler.count
:这个设置决定了处理用户请求的线程数量。默认是10,这个值设的比较小,主要是为了预防用户用一个比较大的写缓冲,然后还有很多客户端并发,这样region servers会垮掉。有经验的做法是,当请求内容很大(上MB,如大puts, 使用缓存的scans)的时候,把这个值放低。请求内容较小的时候(gets, 小puts, ICVs, deletes),把这个值放大。把这个值放大的危险之处在于,把所有的Put操作缓冲意味着对内存有很大的压力,甚至会导致OutOfMemory.一个运行在内存不足的机器的RegionServer会频繁的触发GC操作,渐渐就能感受到停顿。一段时间后,集群也会受到影响,因为所有的指向这个region的请求都会变慢。这样就会拖累集群,加剧了这个问题。hbase.client.keyvalue.maxsize
:一个KeyValue实例的最大size。如果设置为0或者更小,就会禁用这个检查。默认10MB。hbase.regionserver.lease.period
:户端租用HRegion server 期限,即超时阀值。单位是毫秒。默认情况下,客户端必须在这个时间内发一条信息,否则视为死掉。默认值为60000。hbase.regionserver.msginterval
:RegionServer 发消息给 Master 时间间隔,单位是毫秒,默认: 3000hbase.regionserver.optionallogflushinterval
:将Hlog同步到HDFS的间隔。如果Hlog没有积累到一定的数量,到了时间,也会触发同步。默认是1秒,单位毫秒。hbase.regionserver.logroll.period
:提交commit log的间隔,不管有没有写足够的值。默认: 3600000hbase.regionserver.thread.splitcompactcheckfrequency
:region server 多久执行一次split/compaction 检查。默认: 20000hbase.balancer.period
:Master执行region balancer的间隔。默认: 300000hbase.hregion.memstore.block.multiplier
:如果memstore有hbase.hregion.memstore.block.multiplier
倍数的hbase.hregion.flush.size
的大小,就会阻塞update操作。这是为了预防在update高峰期会导致的失控。如果不设上界,flush的时候会花很长的时间来合并或者分割,最坏的情况就是引发out of memory异常。默认: 2hbase.hstore.compactionThreshold
:当一个HStore含有多于这个值的HStoreFiles(每一个memstore flush产生一个HStoreFile)的时候,会执行一个合并操作,把这HStoreFiles写成一个。这个值越大,需要合并的时间就越长。默认: 3hbase.hstore.blockingStoreFiles
:当一个HStore含有多于这个值的HStoreFiles(每一个memstore flush产生一个HStoreFile)的时候,会执行一个合并操作,update会阻塞直到合并完成,直到超过了hbase.hstore.blockingWaitTime
的值。默认: 7
4. HBase 和 MapReduce
当 MapReduce job的HBase table 使用TableInputFormat为数据源格式的时候,他的splitter会给这个table的每个region一个map。因此,如果一个table有100个region,就有100个map-tasks,不论需要scan多少个column families 。
通常建议关掉针对HBase的MapReduce job的预测执行
(speculative execution)功能。这个功能也可以用每个Job的配置来完成。对于整个集群,使用预测执行意味着双倍的运算量。这可不是你所希望的,因此我们需要进行如下配置:
MapReduce任务的预测执行缺省是打开的,HBase集群一般建议在系统级关闭预测执行,除非在某种特殊情况下需要打开,此时可以每任务配置。设置mapred.map.tasks.speculative.execution 和 mapred.reduce.tasks.speculative.execution 为 false,可以在job执行的时候设置,也可以直接配置的集群中。
5.HBase 的 Schema 设计
flush和compaction操作是针对一个Region。
Compaction操作现在是根据一个column family下的全部文件的数量触发的,而不是根据文件大小触发的。当很多的column families在flush和compaction时,会造成很多没用的I/O负载(要想解决这个问题,需要将flush和compaction操作只针对一个column family)
行的版本的数量是HColumnDescriptor设置的,每个column family可以单独设置,默认是3。
6. 性能调优
1、长时间GC停顿
Hbase中常见的两种stop-the-world的GC操作:
- 一种是CMS失败的模式
- 另一种是老一代的堆碎片导致的
要想定位第一种,只要将CMS执行的时间提前就可以了,加入 -XX:CMSInitiatingOccupancyFraction
参数,把值调低。可以先从60%和70%开始(这个值调的越低,触发的GC次数就越多,消耗的CPU时间就越长)。要想定位第二种错误,Todd加入了一个实验性的功能,将你的Configuration中的 hbase.hregion.memstore.mslab.enabled
设置为true。
2、使用压缩
3、设置合理的版本
4、控制split和compaction
hbase使用中需要注意一些问题的更多相关文章
- HBase学习系列
转自:http://www.aboutyun.com/thread-8391-1-1.html 问题导读: 1.hbase是什么? 2.hbase原理是什么? 3.hbase使用中会遇到什么问题? 4 ...
- Hadoop、Pig、Hive、Storm、NOSQL 学习资源收集
(一)hadoop 相关安装部署 1.hadoop在windows cygwin下的部署: http://lib.open-open.com/view/1333428291655 http://blo ...
- HBase + Kerberos 配置示例(一)
用过hbase的朋友可能都有过这样的疑问,我写一个java client,好像就提供了zookeeper quorum地址就连上hbase了,那么是不是存在安全问题?的确是,如何解决?hbase中引入 ...
- HBase HTablePool
Instead of creating an HTable instance for every request from your client application, it makes much ...
- HBase存储剖析与数据迁移
1.概述 HBase的存储结构和关系型数据库不一样,HBase面向半结构化数据进行存储.所以,对于结构化的SQL语言查询,HBase自身并没有接口支持.在大数据应用中,虽然也有SQL查询引擎可以查询H ...
- HBase replication
Hbase Replication 介绍 现状 Hbase 的replication目前在业界使用并不多见,原因有很多方面,比如说HDFS目前已经有多份备份在某种程度上帮助HBASE底层数据的安全性, ...
- bulk-load 装载HDFS数据到HBase
bulk-load的作用是用mapreduce的方式将hdfs上的文件装载到hbase中,对于海量数据装载入hbase非常有用,参考http://hbase.apache.org/docs/r0.89 ...
- hbase 学习(十四)Facebook针对hbase的优化方案分析
使用hbase的目的是为了海量数据的随机读写,但是在实际使用中却发现针对随机读的优化和gc是一个很大的问题,而且hbase的数据是存储在Hdfs,而Hdfs是面向流失数据访问进行设计的,就难免带来效率 ...
- 使用Phoenix通过sql语句更新操作hbase数据
hbase 提供很方便的shell脚本,可以对数据表进行 CURD 操作,但是毕竟是有一定的学习成本的,基本上对于开发来讲,sql 语句都是看家本领,那么,有没有一种方法可以把 sql 语句转换成 h ...
随机推荐
- 深入理解JVM 垃圾收集器(上)
HotSpot虚拟机中的垃圾收集器 GC评价标准 GC调优 响应时间 吞吐量 1.新生代收集器 Serial收集器 ParNew收集器 Parallel Scavenge收集器 2.老年代收集器 Se ...
- HDU 1176 免费馅饼 简单动态规划
世道很简单的动态规划,但是却错了,让我很无语,改来改去还是不对,第二天有写就对了,之后我就耐着性子慢慢比较之前的错误代码,发现 第一次错:纯粹用了a[i][j]+=max3(a[i+1][j-1], ...
- eclipse文档字体大小设置
步骤如下
- SQL优化器执行过程之逻辑算子
我们提到了两种SQL优化器,分别是RBO和CBO.那么无论是RBO,还是CBO都包含了一系列优化规则,这些优化规则可以对关系表达式进行等价转换,从而寻找最优的执行计划. 那么常见的优化规则就包括: 列 ...
- jquery.js和jquery.min.js的区别介绍
1.区别:jquery官网提供2种jQuery的下载,一种是jquery.js另一种是jquery.min.js文件名不一定完全相同,但通常情况下:jquery.js是完整的未压缩的jQuery库,文 ...
- KindEditor 上传文件
Jsp页面代码: <script> var editor; KindEditor.ready(function(K) { editor = K.create('textarea[name= ...
- 不同局域网如何利用charles对app进行抓包
晚上遇到了一种尴尬的场景:电脑并没有无线网卡,电脑是通过有线连接的,但是手机连的是公共的wifi,二者并不在同一个网段 在试过很多办法无解后,终于百度出一种"曲线救国"的办法(以荣 ...
- 使用MouseWithoutBordersSetup共享鼠标键盘教程
1.下载MouseWithoutBordersSetup软件 2.需要共享鼠标键盘的电脑都要安装[注:这些电脑在同一个局域网] 3.运行软件后,图标上右键—>Settings 注意大红框的地方, ...
- 【spark】常用转换操作:sortByKey()和sortBy()
1.sortByKey() 功能: 返回一个根据键排序的RDD 示例 val list = List(("a",3),("b",2),("c" ...
- 5天不再惧怕多线程——第一天 尝试Thread
随笔 - 218 文章 - 1 评论 - 3819 5天不再惧怕多线程——第一天 尝试Thread 原本准备在mongodb之后写一个lucene.net系列,不过这几天用到多线程时才发现自己 ...