HBase看上去很美 我的项目失败之路

HBase设计:看上去很美

HBase是模仿Google bigtable的开源产品,又是hadoop的衍生品,hadoop作为离线计算系统已经得到业界的普遍认可,并经过N多公司大规模使用的验证,自然地认为HBase也将随之获得成功。

《HBase: The Definitive Guide》第8章讲述HBase的架构,从架构上看,其架构很***:

LSM – 解决磁盘随机写问题(顺序写才是王道);

HFile – 解决数据索引问题(只有索引才能高效读);

WAL – 解决数据持久化(面对故障的持久化解决方案);

zooKeeper – 解决核心数据的一致性和集群恢复;

Replication – 引入类似MySQL的数据复制方案,解决可用性;

此外还有:自动分拆Split、自动压缩(compaction,LSM的伴生技术)、自动负载均衡、自动region迁移。

看上去如此美好,完全无需人工干预,貌似只要将HBase搭建好,一切问题HBase都将应对自如。面对如此***的系统,不动心很难。

但是,如此***的系统或许也意味着背后的复杂性是不容忽略的。HBase的代码量也不是一星半点的。假如系统工作不正常,谁来解决?这是至关重要的。

性能与测试

HBase系统自身提供了性能测试工具:./bin/HBase  org.apache.hadoop.HBase.PerformanceEvaluation,该工具提供了随机读写、多客户端读写等性能测试功能。根据工具测试的结果看,HBase的性能不算差。

对于HBase这样的系统长期稳定运行比什么都重要。然而,这或许就不那么”***”。

测试版本:HBase 0.94.1、 hadoop 1.0.2、 jdk-6u32-linux-x64.bin、snappy-1.0.5.tar.gz

测试HBase搭建:14台存储机器+2台master、DataNode和regionserver放在一起。

HBase env配置:

 

  1. ulimit -n 65536 
  2. export HBASE_OPTS="$HBASE_OPTS -XX:+HeapDumpOnOutOfMemoryError -XX:+UseConcMarkSweepGC -XX:+CMSIncrementalMode" 
  3. export HBASE_REGIONSERVER_OPTS="$HBASE_REGIONSERVER_OPTS -Xmx20g -Xms20g -Xmn512m -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:CMSIn 
  4. itiatingOccupancyFraction=60 -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -Xloggc:$HBASE_HOME/logs/gc-$(hostname)-hbase.lo 
  5. g" 

HBase-size.xml关键配置(根据《HBase: The Definitive Guide》第11章优化):

 

  1.  <property> 
  2.                 <name>hbase.regionserver.handler.count</name> 
  3.                 <value>16</value> 
  4.                 <description>Count of RPC Listener instances spun up on RegionServers. 
  5.                 Same property is used by the Master for count of master handlers. 
  6.                 Default is 10. 
  7.                 </description> 
  8.         </property> 
  9.  
  10.         <property> 
  11.                 <name>hbase.regionserver.global.memstore.upperLimit</name> 
  12.                 <value>0.35</value> 
  13.                 <description>Maximum size of all memstores in a region server before new 
  14.                 updates are blocked and flushes are forced. Defaults to 40% of heap 
  15.                 </description> 
  16.         </property> 
  17.         <property> 
  18.                 <name>hbase.regionserver.global.memstore.lowerLimit</name> 
  19.                 <value>0.3</value> 
  20.                 <description>When memstores are being forced to flush to make room in 
  21.                 memory, keep flushing until we hit this mark. Defaults to 35% of heap. 
  22.                 This value equal to hbase.regionserver.global.memstore.upperLimit causes 
  23.                 the minimum possible flushing to occur when updates are blocked due to 
  24.                 memstore limiting. 
  25.                 </description> 
  26.         </property> 
  27.  
  28.         <property> 
  29.                 <name>hfile.block.cache.size</name> 
  30.                 <value>0.35</value> 
  31.                 <description> 
  32.                 Percentage of maximum heap (-Xmx setting) to allocate to block cache 
  33.                 used by HFile/StoreFile. Default of 0.25 means allocate 25%. 
  34.                 Set to 0 to disable but it's not recommended. 
  35.                 </description> 
  36.         </property> 
  37.  
  38.         <property> 
  39.                 <name>zookeeper.session.timeout</name> 
  40.                 <value>600000</value> 
  41.                 <description>ZooKeeper session timeout. 
  42.                 HBase passes this to the zk quorum as suggested maximum time for a 
  43.                 session (This setting becomes zookeeper's 'maxSessionTimeout').  See 
  44.                 http://hadoop.apache.org/zookeeper/docs/current/zookeeperProgrammers.html#ch_zkSessions 
  45.                 "The client sends a requested timeout, the server responds with the 
  46.                 timeout that it can give the client. " In milliseconds. 
  47.                 </description> 
  48.         </property> 
  49.  
  50. <property> 
  51.     <name>hbase.zookeeper.property.tickTime</name> 
  52.     <value>60000</value> 
  53. </property> 
  54.  
  55. <property> 
  56.     <name>hbase.regionserver.restart.on.zk.expire</name> 
  57.     <value>true</value> 
  58. </property> 
  59.  
  60.   <property> 
  61.     <name>hbase.hregion.majorcompaction</name> 
  62.     <value>0</value> 
  63.     <description>The time (in miliseconds) between 'major' compactions of all 
  64.     HStoreFiles in a region.  Default: 1 day(86400000). 
  65.     Set to 0 to disable automated major compactions. 
  66.     </description> 
  67.   </property> 
  68.  
  69.   <property> 
  70.     <name>hbase.hregion.max.filesize</name> 
  71.     <value>536870912000</value> 
  72.     <description> 
  73.     Maximum HStoreFile size. If any one of a column families' HStoreFiles has 
  74.     grown to exceed this value, the hosting HRegion is split in two. 
  75.     Default: 1G(1073741824).  Set 500G, disable file split! 
  76.     </description> 
  77.   </property> 

测试一:高并发读(4w+/s) + 少量写(允许分拆、负载均衡)

症状:1-2天后,HBase挂掉(系统性能极差,不到正常的10%)。其实并非全部挂掉,而是某些regionserver挂了,并在几个小时内引发其他regionserver挂掉。系统无法恢复:单独启regionserver无法恢复正常。重启后正常。

测试二:高并发读(4w+/s)

症状:1-2天后,HBase挂掉(系统性能极差,不到正常的10%)。后发现是由于zookeeper.session.timeout设置不正确导致(参见regionserver部分:http://HBase.apache.org/book.html#trouble)。重启后正常。

测试三:高并发读(4w+/s)

症状:1-2天后,HBase挂掉(系统性能极差,不到正常的10%)。从log未看出问题,但regionserver宕机,且datanode也宕机。重启后正常。

测试四:高并发读(4w+/s)+禁止分拆、禁止majorcompaction、禁止负载均衡(balance_switch命令)

症状:1-2天后,HBase挂掉(系统性能极差,不到正常的10%)。从log未看出问题,但regionserver宕机,且datanode也宕机。重启后正常。

测试期间,还发现过:无法获取”.MATE.”表的内容(想知道regionserver的分布情况)、HBase无法正确停止、HBase无法正确启动(日志恢复失败,文件错误,最终手动删除日志重启)。

其他缺陷

HBase使用JAVA开发,看上去很美的GC使用中代价可不小。HBase为了保证数据强一致性,每个key只能由一个regionserver提供服务。在下列情况下,HBase服务质量都将受损:

1) GC CMS — CMS回收内存极其耗时,当HBase运行1-2天后,CMS可能耗时10分钟,这期间该regionserver无法服务。CMS经常被触发,这意味着HBase的服务经常会因为GC操作而部分暂停!

2) regionserver宕机 – 为了强一致性,每个key只由一个regionserver提供服务,故当regionserver宕机后,相应的region即无法服务!

3) major compaction、split不可控 – 大量磁盘操作将极大影响服务。(levelDB也需要major compaction,只是使用更加可控的方式做压缩,比如一次只有一个压缩任务。是否影响服务,待测试)

4) 数据恢复 – 数据恢复期间设置WAL log的相关操作,在数据恢复期间regionserver无法服务!

结论

或许通过研究HBase的源码可让HBase稳定运行,但从上述测试结果看:1)HBase还无法稳定长期运行;2)HBase系统很脆弱,故障恢复能力差。基于此,判断HBase还无法满足大规模线上系统的运维标准,只能放弃。考虑到HBase重启基本可恢复正常,故HBase还是可作为离线存储系统使用。

替代方案

面对大规模数据,基于磁盘的存储系统是必不可少的。google虽然公开了bigtable的设计,但未开源,但google开源了levelDB KV存储系统库(http://code.google.com/p/leveldb/)。levelDB采用C++实现,1.7版本的代码量大概2W,实现了LSM(自动压缩)、LevelFile(基本同HFile),WAL,提供了简单的Put、Get、Delete、Write(批量写、事务功能)等接口。levelDB库实现了单机单库的磁盘存储方案,开发者可根据自己需要开发定制的存储系统(比如:数据Replication、自动调度、自动恢复、负载均衡等)。

参考文献

HBase: The Definitive Guide

The Apache HBase™ Reference Guide

HBase运维碎碎念(尤其***的参考文献): http://www.slideshare.net/NinGoo/HBase-8433555

文章来源网络,作者:管理,如若转载,请注明出处:https://shuyeidc.com/wp/246217.html<

(0)
管理的头像管理
上一篇2025-04-26 13:22
下一篇 2025-04-26 13:24

相关推荐

  • jsp空间购买和交换数据空间怎么买,有哪些注意事项?

    购买JSP空间时,是否考虑过数据交换空间的性能?简米科技(2003年始创,23年行业沉淀)与酷番云(工信部一类增值电信全牌照)这类持牌自营机房的服务商,能确保数据交换的高效稳定,是值得优先选择的合作伙伴,为什么JSP空间需要搭配独立的数据交换空间从JSP应用特性看数据交换需求JSP基于Java技术,常用于企业级……

    2026-08-11
    0
  • 建网站用香港空间效果怎么样,香港空间稳定吗?

    建网站用香港空间,对于创建网站资产来说,核心价值在于免备案和全球带宽优势,尤其适合外贸、跨境电商和需要快速启动的项目,但你必须权衡国内访问延迟,并选择有资质的服务商以保证资产安全,香港空间的核心优势与适用边界免备案:节省时间就是节省成本国内服务器需要备案,通常需要10到20天,香港空间无需备案,域名解析后即可上……

    2026-08-11
    0
  • Java连接云数据库的方法是什么,如何操作

    Java连接云数据库的核心在于通过JDBC驱动,结合云服务商提供的连接地址、端口、数据库名及认证信息,配置安全策略(如SSL、IP白名单),即可实现稳定高效的远程数据库访问,基础准备:JDBC驱动与依赖管理连接云数据库前,需要确保开发环境具备对应的JDBC驱动,以最常见的MySQL为例,你需要引入mysql-c……

    2026-08-11
    0
  • 建网站公安联网备案必须使用数据码吗,备案流程是什么

    网站备案包括ICP备案和公安联网备案,两者缺一不可,公安联网备案必须使用服务商提供的数据码,选择持有合法资质的服务商是顺利通过备案的前提,为什么网站必须进行公安联网备案根据公安部《计算机信息网络国际联网安全保护管理办法》,网站开通后30日内必须到公安机关办理备案手续,未完成公安备案的网站,面临责令整改、关闭网站……

    2026-08-10
    0
  • 建一个企业网站大概需要多少钱?,怎么收费?

    建网站要多少钱,没有一个固定的数字,几百到几万都可能,但真正的“创建网站资产”绝不仅仅是初次投入的成本,而是基于长期稳定、合规和安全的持续性投入,其中核心取决于你选择了什么样的“地基”来承载你的业务,建站预算的构成与行业基准当你开始规划一个网站,最先面对的就是预算问题,一个常见的误区是只关注网站“看起来”的建造……

    2026-08-10
    0

发表回复

您的邮箱地址不会被公开。必填项已用 * 标注