十分钟开发HBase应用

背景

HBase是一个分布式NoSQL数据库,部署HBase集群并不简单,即使是搭建开发环境也有各种坑。虽然官方提供了单机版HBase,但你还需要知道Trunk的代码只能运行在Java7以上,不要企图用OpenJDK,构建项目需要安装Maven,如果不注意这些搭个环境就不止10分钟了,更别提陷入Dependency Hell

有人说过“让Hadoop开发像家庭作业一样简单”,容器技术的出现让这成为可能,可以用Docker封装HBase运行环境,通过统一的接口来运行。本文将介绍如何在十分钟内跑起你的HBase应用。

实践

首先,我们需要安装HBase集群来开发和测试,下载HBase源码运行单机版固然可以,前提是你已经安装配置好Java和Maven环境,或者你可以运行命令docker run -d --net=host tobegit3hub/standalone-hbase-0.94继续阅读

HFile和HLog的回收机制

正常回收流程

  • HBase数据主要存储在分布式文件系统上HFile和HLog文件中。HBase数据基于LSM模型,写操作写到内存(MemStore)和Write Ahead Log(HLog, 放在.logs下regionserver目录下)就返回。
  • 当内存不足或者MemStore超过一定大小的时候,HBase会将MemStore的数据顺序写到分布式文件系统上,形成一个HFile。
  • 当RegionServer进程down机时候,regionserver的log目录会被HMaster重命名(添加-splitting后缀),目录下所有hlog会被logSpliter分割成为各个region的recover.edits. 当log split完成之后,HMaster会将log移动到.oldlog目录下。
  • 当小的HFile过多的时候,会将多个小的HFile压缩形成一个大的HFile。压缩完成之后这些小的HFile就被移动.archive目录下。
  • 如果HLog里所有记录对应的数据都已经刷新到HFile上,HLog就被RegionServer移动到.oldlog目录下。
  • HMaster上的定时线程HFileCleaner/LogCleaner周期性扫描archive目录和.oldlog目录, 判断目录下的HFile或者HLog是否可以被删除,如果可以, 就直接删除文件.
  • 继续阅读

HBase社区开发FAQ

hbase社区官方网址: https://hbase.apache.org/  hbase相关文档,设计等, 这里是最全的,建议多上这个网址。

HBase英文文档:https://hbase.apache.org/book/book.html, 和主干代码同步的。如果不习惯英文,可以参考中文文档:http://abloz.com/hbase/book.html 不过稍微有些滞后。

定阅社区讨论邮件和社区issue:http://hbase.apache.org/mail-lists.html

下面主要分享一下参与hbase社区开发一些常见问题,希望对准备参与hbase社区开发的同学有所帮助。 继续阅读

小米在HBaseCon 2014上的分享

HBaseCon是一年一度的HBase全球开发者大会,HBase社区的主要贡献者、开发者、重要用户都会参加。对HBase有重大贡献的团队和个人会在大会上做演讲和分享。

小米作为HBase的重要使用者,在业务中应用HBase的同时,也根据业务应用中遇到的问题和需求改进HBase,并将改进贡献回HBase社区。目前为止团队已经提交了超过130个改进,其中”new write ahead log threading model”和”reverse scanners”是HBase 0.98.0版本发布时被重点提到的四大改进中的前两个。

今年的HBaseCon,我们团队中的两位HBase Committer,谢良和冯宏华受邀做了题目为”HBase at Xiaomi”的演讲,主要分享了HBase在小米的使用情况,遇到的问题和所做的改进,以及下一步的改进计划。

点击这里下载ppt:HBase_at_Xiaomi_HBaseCon_2014

模拟机器故障

在进行Failover测试中,我们需要用软件模拟出CPU、内存、磁盘与网络等硬件的故障,这里总结一下所用到的工具与技术。

1. RestartHost
可以通过硬件控制卡强制重启机器,从而达到模拟宕机与重启操作系统的效果。如果权限允许也可以直接发reboot命令。

2. CpuLimit
要限制单个进程的CPU使用率,可以使用开源工具cpulimit,我们需要在测试服务器上安装cpulimit,然后通过pid或者进程名对进程进行限制,如cpulimit -p 10086 -l 50即可限制pid为10086的进程CPU使用率不能超过50%,这里有一篇简易的使用教程。如果想模拟机器CPU紧张的情景,也可以使用openssl工具,Netflix提供的脚本就是通过使用openssl speed来耗尽服务器的CPU,这样做的好处是真实地模拟了我们的测试场景,弊端就是会影响其他进程的执行。
继续阅读

HBase行数统计

分布式数据库HBase本身不支持SQL语法,要统计表的行数,只能通过其他的方式来实现。HBase的shell脚本提供了count命令,但该命令只是简单地scan全表然后将行数累加,效率很低只能用于测试或者统计小表了。另一解决方案是使用MapReduce,HBase自身提供了org.apache.hadoop.hbase.mapreduce.RowCounter类,可以方便地在命令行调用进行统计,但执行效率仍难以达到我们的需求。HBase 0.92引入了Coprocessor这项特性,可以很方便地在RegionServer端实现各类聚集操作,通过AggregationClient#rowCount这个接口就可以相对高效地统计表的行数了。

Coprocessor提供了Observer和Endpoint两项特性,前者允许通过重写函数在RegionServer端注入用户代码,后者则相当于数据库中的触发器(详细介绍参考Reference[1])。社区依此为聚集操作提供了AggregateProtocol接口和AggregateImplement实现,我们使用AggregationClient就可以并发对每个region进行rowCount等操作,同时设置了FirstKeyOnlyFilter以提高执行效率,然后将结果返回client端进行累加,与直接scan全表相比极大提高了统计的并行度,配置HBase使用Coprocessor可以参考Reference[2]继续阅读

Hive SQL优化之 Count Distinct

Hive是Hadoop的子项目,它提供了对数据的结构化管理和类SQL语言的查询功能。SQL的交互方式极大程度地降低了Hadoop生态环境中数据处理的门槛,用户不需要编写程序,通过SQL语句就可以对数据进行分析和处理。目前很多计算需求都可以由Hive来完成,极大程度地降低了开发成本。

目前,Hive底层使用MapReduce作为实际计算框架,SQL的交互方式隐藏了大部分MapReduce的细节。这种细节的隐藏在带来便利性的同时,也对计算作业的调优带来了一定的难度。未经优化的SQL语句转化后的MapReduce作业,它的运行效率可能大大低于用户的预期。本文我们就来分析一个简单语句的优化过程。 继续阅读

小米Minos

minos随着公司业务的快速增长,业务产生的数据量突飞猛涨,海量数据的存储与处理成了亟需解决的问题,小米大数据团队应运而生。小米大数据团队承担着为全公司提供海量数据的存储与处理服务平台的任务,整个平台是基于Hadoop生态系统的若干明星产品来搭建的。随着接入业务数量的增加,集群规模的增长,集群的布署、升级、监控以及管理成为比较头疼的问题,我们亟需一套能够方便布署、升级集群,同时能够直观查看机群运行状态的系统。希望能够通过这样的系统,一方面可以降低集群维护成本,减轻维护集群的压力;一方面可以实时查看集群的运行状态,让团队成员及至让用户了解集群的健康状况;另一方面也可以及时把集群的故障反馈给团队成员,能够让团队成员在第一时间发现问题、解决问题,把对业务的影响降到最小。因此,我们的目标就是有一套集群级别的配置、布署和监控系统,这就是我们今天要讲的主角—Minos。 继续阅读

Facebook L2 Cache与Bucket Cache的对比测试

先简单介绍下背景:

关于bucket cache,可以参考:https://issues.apache.org/jira/browse/HBASE-7404 或是http://zjushch.iteye.com/blog/1751387。我们重点关注测试的是用在普通磁盘场景下解决gc问题的用法。

关于facebook的l2 cache,可以从0.89-fb branch的svn提交记录comments中了解:

svn log -r 1492797
————————————————————————
r1492797 | liyin | 2013-06-14 02:18:20 +0800 (Fri, 14 Jun 2013) | 43 lines

[master] Implements a secondary compressed cache (L2 cache)

Author: avf

Summary:
This revision implements compressed and encoded second-level cache with off-heap
(and optionally on-heap) storage and a bucket-allocator based on HBASE-7404. 继续阅读