原文出自: http://abloz.com/hbase/book.html

Apache HBase™ 参考指南

Revision History
Revision 0.95-SNAPSHOT 2012-12-03T13:38
中文版翻译整理 周海汉

译者:HBase新版 0.95 文档和0.90版相比,变化较大,文档补充更新了很多内容,章节调整较大。本翻译文档的部分工作基于颜开工作。英文原文地址在此处。旧版0.90版由颜开翻译文档在此处。0.95版翻译最后更新请到此处( http://abloz.com/hbase/book.html )浏览。反馈和参与请到此处 (https://code.google.com/p/hbasedoc-cn/)或访问我的blog(http://abloz.com),或给我发email。

最终版生成pdf供下载。

贡献者:

周海汉邮箱:ablozhou@gmail.com, 网址:http://abloz.com/

颜开邮箱: yankaycom@gmail.com, 网址:http://www.yankay.com/


摘要

这是 Apache HBase (TM)的官方文档。 HBase是一个分布式,版本化,面向列的数据库,构建在 Apache Hadoop和 Apache ZooKeeper之上。


目录

1. 入门
1.1. 介绍1.2. 快速开始
2. Apache HBase (TM)配置
2.1. 基础条件2.2. HBase 运行模式: 独立和分布式2.3. 配置文件2.4. 配置示例2.5. 重要配置
3. 升级
3.1. 从 0.94.x 升级到 0.96.x3.2. 从 0.92.x 升级到 0.94.x3.3. 从 0.90.x 升级到 0.92.x3.4. 从0.20x或0.89x升级到0.90.x
4. HBase Shell
4.1. 使用脚本4.2. Shell 技巧
5. 数据模型
5.1. 概念视图5.2. 物理视图5.3. 表5.4. 行5.5. 列族5.6. Cells5.7. Data Model Operations5.8. 版本5.9. 排序5.10. 列元数据5.11. Joins
6. HBase 和 Schema 设计
6.1. Schema 创建6.2. column families的数量6.3. Rowkey 设计6.4. 版本数量6.5. 支持的数据类型6.6. Joins6.7. 生存时间 (TTL)6.8. 保留删除的单元6.9. 第二索引和替代查询路径6.10. 模式设计对决6.11. 操作和性能配置选项6.12. 限制
7. HBase 和 MapReduce
7.1. Map-Task 分割7.2. HBase MapReduce 示例7.3. 在MapReduce工作中访问其他 HBase 表7.4. 推测执行
8. HBase安全
8.1. 安全客户端访问 HBase8.2. 访问控制
9. 架构
9.1. 概述9.2. 目录表9.3. 客户端9.4. 客户请求过滤器9.5. Master9.6. RegionServer9.7. 分区(Regions)9.8. 批量加载9.9. HDFS
10. 外部 APIs
10.1. 非Java语言和 JVM交互10.2. REST10.3. Thrift10.4. C/C++ Apache HBase Client
11. 性能调优
11.1. 操作系统11.2. 网络11.3. Java11.4. HBase 配置11.5. ZooKeeper11.6. Schema 设计11.7. 写到 HBase11.8. 从 HBase读取11.9. 从 HBase删除11.10. HDFS11.11. Amazon EC211.12. 案例
12. 故障排除和调试 HBase
12.1. 通用指引12.2. Logs12.3. 资源12.4. 工具12.5. 客户端12.6. MapReduce12.7. NameNode12.8. 网络12.9. RegionServer12.10. Master12.11. ZooKeeper12.12. Amazon EC212.13. HBase 和 Hadoop 版本相关12.14. 案例
13. 案例研究
13.1. 概要13.2. Schema 设计13.3. 性能/故障排除
14. HBase 运维管理
14.1. HBase 工具和实用程序14.2. 分区管理14.3. 节点管理14.4. HBase 度量(Metrics)14.5. HBase 监控14.6. Cluster 复制14.7. HBase 备份14.8. 容量规划
15. 创建和开发 HBase
15.1. HBase 仓库15.2. IDEs15.3. 创建 HBase15.4. 添加 Apache HBase 发行版到Apache的 Maven Repository15.5. 更新 hbase.apache.org15.6. 测试15.7. Maven 创建命令15.8. 加入15.9. 开发15.10. 提交补丁
16. ZooKeeper
16.1. Using existing ZooKeeper ensemble16.2. SASL Authentication with ZooKeeper
17. Community
17.1. Decisions17.2. Community Roles
A. FAQ
B. 深入hbck
B.1. 运行 hbck 以查找不一致B.2. 不一致(Inconsistencies)B.3. 局部修补B.4. 分区重叠修补
C. HBase中的压缩
C.1. CompressionTest 工具C.2. hbase.regionserver.codecsC.3. LZOC.4. GZIPC.5. SNAPPYC.6. 修改压缩 Schemes
D. YCSB: Yahoo! 云服务评估和 HBase
E. HFile 格式版本 2
E.1. MotivationE.2. HFile 格式版本 1 概览E.3. HBase 文件格式带 inline blocks (version 2)
F. HBase的其他信息
F.1. HBase 视频F.2. HBase 展示 (Slides)F.3. HBase 论文F.4. HBase 网站F.5. HBase 书籍F.6. Hadoop 书籍
G. HBase 历史
H. HBase 和 Apache 软件基金会(ASF)
H.1. ASF开发进程H.2. ASF 报告板I. Enabling Dapper-like Tracing in HBase
I.1. SpanReceiversI.2. Client Modifications
词汇表

表索引

5.1. Table webtable5.2. ColumnFamily anchor5.3. ColumnFamily contents8.1. Operation To Permission Mapping

这本书是 HBase 的官方指南。 版本为 0.95-SNAPSHOT 。可以在HBase官网上找到它。也可以在 javadoc, JIRA 和 wiki 找到更多的资料。

此书正在编辑中。 可以向 HBase 官方提供补丁JIRA.

这个版本系译者水平限制,没有理解清楚或不需要翻译的地方保留英文原文。

最前面的话

若这是你第一次踏入分布式计算的精彩世界,你会感到这是一个有趣的年代。分布式计算是很难的,做一个分布式系统需要很多软硬件和网络的技能。你的集群可以会因为各式各样的错误发生故障。比如HBase本身的Bug,错误的配置(包括操作系统),硬件的故障(网卡和磁盘甚至内存) 如果你一直在写单机程序的话,你需要重新开始学习。这里就是一个好的起点: 分布式计算的谬论.

Chapter 1. 入门

Table of Contents

1.1. 介绍1.2. 快速开始
1.2.1. 下载解压最新版本1.2.2. 启动 HBase1.2.3. Shell 练习1.2.4. 停止 HBase1.2.5. 下一步该做什么

1.1. 介绍

Section 1.2, “快速开始”会介绍如何运行一个单机版的HBase.他运行在本地磁盘上。 Section 2, “配置” 会介绍如何运行一个分布式的HBase。他运行在HDFS上

1.2. 快速开始

本指南介绍了在单机安装HBase的方法。会引导你通过shell创建一个表,插入一行,然后删除它,最后停止HBase。只要10分钟就可以完成以下的操作。

1.2.1. 下载解压最新版本

选择一个 Apache 下载镜像,下载 HBase Releases. 点击 stable目录,然后下载后缀为 .tar.gz 的文件; 例如 hbase-0.95-SNAPSHOT.tar.gz.

解压缩,然后进入到那个要解压的目录.

$ tar xfz hbase-0.95-SNAPSHOT.tar.gz $ cd hbase-0.95-SNAPSHOT

现在你已经可以启动HBase了。但是你可能需要先编辑 conf/hbase-site.xml 去配置hbase.rootdir,来选择HBase将数据写到哪个目录 .

<?xml version="1.0"?> <?xml-stylesheet type="text/xsl" href="configuration.xsl"?> <configuration> <property> <name>hbase.rootdir</name> <value>file:///DIRECTORY/hbase</value> </property> </configuration>

将 DIRECTORY 替换成你期望写文件的目录. 默认 hbase.rootdir 是指向 /tmp/hbase-${user.name} ,也就说你会在重启后丢失数据(重启的时候操作系统会清理/tmp目录)

1.2.2. 启动 HBase

现在启动HBase:

$ ./bin/start-hbase.sh starting Master, logging to logs/hbase-user-master-example.org.out

现在你运行的是单机模式的Hbaes。所有的服务都运行在一个JVM上,包括HBase和Zookeeper。HBase的日志放在logs目录,当你启动出问题的时候,可以检查这个日志。

是否安装了 java ?

你需要确认安装了Oracle的1.6 版本的java.如果你在命令行键入java有反应说明你安装了Java。如果没有装,你需要先安装,然后编辑conf/hbase-env.sh,将其中的JAVA_HOME指向到你Java的安装目录。

1.2.3. Shell 练习

shell连接你的HBase

$ ./bin/hbase shell HBase Shell; enter 'help<RETURN>' for list of supported commands. Type "exit<RETURN>" to leave the HBase Shell Version: 0.90.0, r1001068, Fri Sep 24 13:55:42 PDT 2010 hbase(main):001:0>

输入 help 然后 <RETURN> 可以看到一列shell命令。这里的帮助很详细,要注意的是表名,行和列需要加引号。

创建一个名为 test 的表,这个表只有一个 列族 为 cf。可以列出所有的表来检查创建情况,然后插入些值。

hbase(main):003:0> create 'test', 'cf' 0 row(s) in 1.2200 seconds hbase(main):003:0> list 'table' test 1 row(s) in 0.0550 seconds hbase(main):004:0> put 'test', 'row1', 'cf:a', 'value1' 0 row(s) in 0.0560 seconds hbase(main):005:0> put 'test', 'row2', 'cf:b', 'value2' 0 row(s) in 0.0370 seconds hbase(main):006:0> put 'test', 'row3', 'cf:c', 'value3' 0 row(s) in 0.0450 seconds

以上我们分别插入了3行。第一个行key为row1, 列为 cf:a, 值是 value1。HBase中的列是由 列族前缀和列的名字组成的,以冒号间隔。例如这一行的列名就是a.

检查插入情况.

Scan这个表,操作如下

hbase(main):007:0> scan 'test' ROW COLUMN+CELL row1 column=cf:a, timestamp=1288380727188, value=value1 row2 column=cf:b, timestamp=1288380738440, value=value2 row3 column=cf:c, timestamp=1288380747365, value=value3 3 row(s) in 0.0590 seconds

Get一行,操作如下

hbase(main):008:0> get 'test', 'row1' COLUMN CELL cf:a timestamp=1288380727188, value=value1 1 row(s) in 0.0400 seconds

disable 再 drop 这张表,可以清除你刚刚的操作

hbase(main):012:0> disable 'test' 0 row(s) in 1.0930 seconds hbase(main):013:0> drop 'test' 0 row(s) in 0.0770 seconds

关闭shell

hbase(main):014:0> exit

1.2.4. 停止 HBase

运行停止脚本来停止HBase.

$ ./bin/stop-hbase.sh stopping hbase...............

1.2.5. 下一步该做什么

以上步骤仅仅适用于实验和测试。接下来你可以看 Section 2., “配置” ,我们会介绍不同的HBase运行模式,运行分布式HBase中需要的软件 和如何配置。

2. 配置

本章是慢速开始配置指导。

HBase有如下需要,请仔细阅读本章节以确保所有的需要都被满足。如果需求没有能满足,就有可能遇到莫名其妙的错误甚至丢失数据。

HBase使用和Hadoop一样配置系统。要配置部署,编辑conf/hbase-env.sh文件中的环境变量——该配置文件主要启动脚本用于获取已启动的集群——然后增加配置到XML文件,如同覆盖HBase缺省配置,告诉HBase用什么文件系统, 全部ZooKeeper位置 [1] 。

在分布模式下运行时,在编辑HBase配置文件之后,确认将conf目录复制到集群中的每个节点。HBase不会自动同步。使用rsync.

[1] 小心编辑XML。确认关闭所有元素。采用 xmllint 或类似工具确认文档编辑后是良好格式化的。

2.1. 基础条件

This section lists required services and some required system configuration.

2.1.1 java

和Hadoop一样,HBase需要Oracle版本的Java6.除了那个有问题的u18版本其他的都可以用,最好用最新的。

2.1. 操作系统

2.1.2.1. ssh

必须安装ssh , sshd 也必须运行,这样Hadoop的脚本才可以远程操控其他的Hadoop和HBase进程。ssh之间必须都打通,不用密码都可以登录,详细方法可以Google一下 ("ssh passwordless login").

2.1.2.2. DNS

HBase使用本地 hostname 才获得IP地址. 正反向的DNS都是可以的.

如果你的机器有多个接口,HBase会使用hostname指向的主接口.

如果还不够,你可以设置 hbase.regionserver.dns.interface 来指定主接口。当然你的整个集群的配置文件都必须一致,每个主机都使用相同的网络接口

还有一种方法是设置 hbase.regionserver.dns.nameserver来指定nameserver,不使用系统带的.

2.1.2.3. Loopback IP

HBase expects the loopback IP address to be 127.0.0.1. Ubuntu and some other distributions, for example, will default to 127.0.1.1 and this will cause problems for you.

/etc/hosts should look something like this:

127.0.0.1 localhost 127.0.0.1 ubuntu.ubuntu-domain ubuntu

2.1.2.4. NTP

集群的时钟要保证基本的一致。稍有不一致是可以容忍的,但是很大的不一致会造成奇怪的行为。 运行 NTP 或者其他什么东西来同步你的时间.

如果你查询的时候或者是遇到奇怪的故障,可以检查一下系统时间是否正确!

2.1.2.5.  ulimit和 nproc

HBase是数据库,会在同一时间使用很多的文件句柄。大多数linux系统使用的默认值1024是不能满足的,会导致FAQ: Why do I see "java.io.IOException...(Too many open files)" in my logs?异常。还可能会发生这样的异常

2010-04-06 03:04:37,542 INFO org.apache.hadoop.hdfs.DFSClient: Exception increateBlockOutputStream java.io.EOFException 2010-04-06 03:04:37,542 INFO org.apache.hadoop.hdfs.DFSClient: Abandoning block blk_-6935524980745310745_1391901

所以你需要修改你的最大文件句柄限制。可以设置到10k. 你还需要修改 hbase 用户的 nproc,如果过低会造成 OutOfMemoryError异常。 [2] [3].

需要澄清的,这两个设置是针对操作系统的,不是HBase本身的。有一个常见的错误是HBase运行的用户,和设置最大值的用户不是一个用户。在HBase启动的时候,第一行日志会现在ulimit信息,所以你最好检查一下。 [4]

2.1.2.5.1. 在Ubuntu上设置ulimit

如果你使用的是Ubuntu,你可以这样设置:

在文件 /etc/security/limits.conf 添加一行,如:

hadoop - nofile 32768

可以把 hadoop 替换成你运行HBase和Hadoop的用户。如果你用两个用户,你就需要配两个。还有配nproc hard 和 soft limits. 如:

hadoop soft/hard nproc 32000

.

在 /etc/pam.d/common-session 加上这一行:

session required pam_limits.so

否则在 /etc/security/limits.conf上的配置不会生效.

还有注销再登录,这些配置才能生效!

2.1.2.6. Windows

HBase没有怎么在Windows下测试过。所以不推荐在Windows下运行.

如果你实在是想运行,需要安装Cygwin 并虚拟一个unix环境.详情请看 Windows 安装指导 . 或者 搜索邮件列表找找最近的关于windows的注意点

2.1.3. hadoop

请完整阅读本节:

请阅读本节到末尾. 目前我们费力于 Hadoop 各版本. 以后,我们谈及HBase必须如何做才能在特定Hadoop版本中工作 。

除非运行在实现了持久化同步(sync)的HDFS上,HBase 将丢失所有数据。 Hadoop 0.20.2, Hadoop 0.20.203.0,及 Hadoop 0.20.204.0 不具有上述特性。当前Hadoop仅在Hadoop 0.20.205.x 或更高版本--包含hadoop 1.0.0 --具有持久化sync. Sync 必须显式开启。即 dfs.support.append 同时在客户端和服务器端设为真,客户端: hbase-site.xml ,服务器端: hdfs-site.xml ( HBase需要的同步措施是一个附加代码路径的子集)

<property> <name>dfs.support.append</name> <value>true</value> </property>


修改后必须重启集群。忽略部分注释,可以在 hdfs-default.xml 找到thedfs.support.append 配置描述;描述说没有启用是因为 “... bugs in the 'append code' and is not supported in any production cluster.”. 该注释已经过时。我确信有bug, sync/append 代码已经被运行于大容量产品部署,并且很多商业产品的Hadoop缺省是打开的。 [7] [8][9].

你还可以用 Cloudera的 CDH3 或  MapR 。 Cloudera 的CDH3 是Apache hadoop 0.20.x的补丁增强,包含所有  branch-0.20-append  附加的持久化Sync. 使用最新的产品化版的 CDH3.

MapR 包含一个商业的, 重新实现的 HDFS. 具有持久化 sync及一些有趣特性,是现在 Apache Hadoop不具有的.  M3 产品免费并且无限制。

因为HBase建立在Hadoop之上,所以他用到了hadoop.jar,这个Jar在 lib 里面。这个jar是hbase自己打了branch-0.20-append 补丁的hadoop.jar. Hadoop使用的hadoop.jar和HBase使用的 必须 一致。所以你需要将 HBase lib 目录下的hadoop.jar替换成Hadoop里面的那个,防止版本冲突。比方说CDH的版本没有HDFS-724而branch-0.20-append里面有,这个HDFS-724补丁修改了RPC协议。如果不替换,就会有版本冲突,继而造成严重的出错,Hadoop会看起来挂了。

Packaging and Apache BigTop

Apache Bigtop is an umbrella for packaging and tests of the Apache Hadoop ecosystem, including Apache HBase. Bigtop performs testing at various levels (packaging, platform, runtime, upgrade, etc...), developed by a community, with a focus on the system as a whole, rather than individual projects. We recommend installing Apache HBase packages as provided by a Bigtop release rather than rolling your own piecemeal integration of various component releases.

2.1.3.1. Hadoop 安全性

HBase运行在Hadoop 0.20.x上,就可以使用其中的安全特性 -- 只要你用这两个版本0.20S 和CDH3B3,然后把hadoop.jar替换掉就可以了.

2.1.3.2. dfs.datanode.max.xcievers

2.3.4.1. Java客户端配置

Java是如何读到hbase-site.xml 的内容的

Java客户端使用的配置信息是被映射在一个HBaseConfiguration 实例中. HBaseConfiguration有一个工厂方法, HBaseConfiguration.create();,运行这个方法的时候,他会去CLASSPATH,下找hbase-site.xml,读他发现的第一个配置文件的内容。 (这个方法还会去找hbase-default.xml ; hbase.X.X.X.jar里面也会有一个an hbase-default.xml). 不使用任何hbase-site.xml文件直接通过Java代码注入配置信息也是可以的。例如,你可以用编程的方式设置ZooKeeper信息,只要这样做:

Configuration config = HBaseConfiguration.create(); config.set("hbase.zookeeper.quorum", "localhost"); // Here we are running zookeeper locally

如果有多ZooKeeper实例,你可以使用逗号列表。(就像在hbase-site.xml 文件中做得一样). 这个 Configuration 实例会被传递到 HTable, 之类的实例里面去.



2.4. 配置示例

2.4.1. 简单的分布式HBase安装

这里是一个10节点的HBase的简单示例,这里的配置都是基本的,节点名为 example0example1... 一直到 example9 . HBase Master 和 HDFS namenode 运作在同一个节点 example0上. RegionServers 运行在节点 example1-example9. 一个 3-节点 ZooKeeper 集群运行在example1example2, 和 example3,端口保持默认. ZooKeeper 的数据保存在目录 /export/zookeeper. 下面我们展示主要的配置文件-- hbase-site.xmlregionservers, 和 hbase-env.sh -- 这些文件可以在 conf目录找到.

2.4.1.1. hbase-site.xml

<?xml version="1.0"?> <?xml-stylesheet type="text/xsl" href="configuration.xsl"?> <configuration> <property> <name>hbase.zookeeper.quorum</name> <value>example1,example2,example3</value> <description>The directory shared by RegionServers. </description> </property> <property> <name>hbase.zookeeper.property.dataDir</name> <value>/export/zookeeper</value> <description>Property from ZooKeeper's config zoo.cfg. The directory where the snapshot is stored. </description> </property> <property> <name>hbase.rootdir</name> <value>hdfs://example0:9000/hbase</value> <description>The directory shared by RegionServers. </description> </property> <property> <name>hbase.cluster.distributed</name> <value>true</value> <description>The mode the cluster will be in. Possible values are false: standalone and pseudo-distributed setups with managed Zookeeper true: fully-distributed with unmanaged Zookeeper Quorum (see hbase-env.sh) </description> </property> </configuration>

2.4.1.2. regionservers

这个文件把RegionServer的节点列了下来。在这个例子里面我们让所有的节点都运行RegionServer,除了第一个节点 example1,它要运行 HBase Master 和 HDFS namenode

example1 example3 example4 example5 example6 example7 example8 example9

2.4.1.3. hbase-env.sh

下面我们用diff 命令来展示 hbase-env.sh 文件相比默认变化的部分. 我们把HBase的堆内存设置为4G而不是默认的1G.

$ git diff hbase-env.sh diff --git a/conf/hbase-env.sh b/conf/hbase-env.sh index e70ebc6..96f8c27 100644 --- a/conf/hbase-env.sh +++ b/conf/hbase-env.sh @@ -31,7 +31,7 @@ export JAVA_HOME=/usr/lib//jvm/java-6-sun/ # export HBASE_CLASSPATH= # The maximum amount of heap to use, in MB. Default is 1000. -# export HBASE_HEAPSIZE=1000 +export HBASE_HEAPSIZE=4096 # Extra Java runtime options. # Below are what we set by default. May only work with SUN JVM.

你可以使用 rsync 来同步 conf 文件夹到你的整个集群.



2.5. 重要的配置

下面我们会列举重要 的配置. 这个章节讲述必须的配置和那些值得一看的配置。(译者注:淘宝的博客也有本章节的内容,HBase性能调优,很详尽)。

2.5.1. 必须的配置

参考 Section 2.2, “操作系统” 和 Section 2.3, “Hadoop” 节.

2.5.2. 推荐配置

2.5.2.1. zookeeper.session.timeout

这个默认值是3分钟。这意味着一旦一个server宕掉了,Master至少需要3分钟才能察觉到宕机,开始恢复。你可能希望将这个超时调短,这样Master就能更快的察觉到了。在你调这个值之前,你需要确认你的JVM的GC参数,否则一个长时间的GC操作就可能导致超时。(当一个RegionServer在运行一个长时间的GC的时候,你可能想要重启并恢复它).

要想改变这个配置,可以编辑 hbase-site.xml, 将配置部署到全部集群,然后重启。

我们之所以把这个值调的很高,是因为我们不想一天到晚在论坛里回答新手的问题。“为什么我在执行一个大规模数据导入的时候Region Server死掉啦”,通常这样的问题是因为长时间的GC操作引起的,他们的JVM没有调优。我们是这样想的,如果一个人对HBase不很熟悉,不能期望他知道所有,打击他的自信心。等到他逐渐熟悉了,他就可以自己调这个参数了。

2.5.2.2.  ZooKeeper 实例个数

参考 Section 2.5, “ZooKeeper”.

2.5.2.3. hbase.regionserver.handler.count

这个设置决定了处理用户请求的线程数量。默认是10,这个值设的比较小,主要是为了预防用户用一个比较大的写缓冲,然后还有很多客户端并发,这样region servers会垮掉。有经验的做法是,当请求内容很大(上MB,如大puts, 使用缓存的scans)的时候,把这个值放低。请求内容较小的时候(gets, 小puts, ICVs, deletes),把这个值放大。

当客户端的请求内容很小的时候,把这个值设置的和最大客户端数量一样是很安全的。一个典型的例子就是一个给网站服务的集群,put操作一般不会缓冲,绝大多数的操作是get操作。

把这个值放大的危险之处在于,把所有的Put操作缓冲意味着对内存有很大的压力,甚至会导致OutOfMemory.一个运行在内存不足的机器的RegionServer会频繁的触发GC操作,渐渐就能感受到停顿。(因为所有请求内容所占用的内存不管GC执行几遍也是不能回收的)。一段时间后,集群也会受到影响,因为所有的指向这个region的请求都会变慢。这样就会拖累集群,加剧了这个问题。

你可能会对handler太多或太少有感觉,可以通过 Section 12.2.2.1, “启用 RPC级 日志” ,在单个RegionServer启动log并查看log末尾 (请求队列消耗内存)。

2.5.2.4. 大内存机器的配置

HBase有一个合理的保守的配置,这样可以运作在所有的机器上。如果你有台大内存的集群-HBase有8G或者更大的heap,接下来的配置可能会帮助你. TODO.

2.5.2.5. 压缩

应该考虑启用ColumnFamily 压缩。有好几个选项,通过降低存储文件大小以降低IO,降低消耗且大多情况下提高性能。

参考 Appendix C,  HBase压缩  获取更多信息.

2.5.2.6. 较大 Regions

更大的Region可以使你集群上的Region的总数量较少。 一般来言,更少的Region可以使你的集群运行更加流畅。(你可以自己随时手工将大Region切割,这样单个热点Region就会被分布在集群的更多节点上)。

较少的Region较好。一般每个RegionServer在20到小几百之间。 调整Region大小以适合该数字。

0.90.x 版本, 默认情况下单个Region是256MB。Region 大小的上界是 4Gb. 0.92.x 版本, 由于 HFile v2 已经将Region大小支持得大很多, (如, 20Gb).

可能需要实验,基于硬件和应用需要进行配置。

可以调整hbase-site.xml中的 hbase.hregion.max.filesize属性. RegionSize 也可以基于每个表设置:  HTableDescriptor.

2.5.2.7. 管理 Splitting

除了让HBase自动切割你的Region,你也可以手动切割。 [12] 随着数据量的增大,splite会被持续执行。如果你需要知道你现在有几个region,比如长时间的debug或者做调优,你需要手动切割。通过跟踪日志来了解region级的问题是很难的,因为他在不停的切割和重命名。data offlineing bug和未知量的region会让你没有办法。如果一个 HLog 或者 StoreFile由于一个奇怪的bug,HBase没有执行它。等到一天之后,你才发现这个问题,你可以确保现在的regions和那个时候的一样,这样你就可以restore或者replay这些数据。你还可以调优你的合并算法。如果数据是均匀的,随着数据增长,很容易导致split / compaction疯狂的运行。因为所有的region都是差不多大的。用手的切割,你就可以交错执行定时的合并和切割操作,降低IO负载。

为什么我关闭自动split呢?因为自动的splite是配置文件中的 hbase.hregion.max.filesize决定的. 你把它设置成ILong.MAX_VALUE是不推荐的做法,要是你忘记了手工切割怎么办.推荐的做法是设置成100GB,一旦到达这样的值,至少需要一个小时执行 major compactions。

那什么是最佳的在pre-splite regions的数量呢。这个决定于你的应用程序了。你可以先从低的开始,比如每个server10个pre-splite regions.然后花时间观察数据增长。有太少的region至少比出错好,你可以之后再rolling split.一个更复杂的答案是这个值是取决于你的region中的最大的storefile。随着数据的增大,这个也会跟着增大。 你可以当这个文件足够大的时候,用一个定时的操作使用Store的合并选择算法(compact selection algorithm)来仅合并这一个HStore。如果你不这样做,这个算法会启动一个 major compactions,很多region会受到影响,你的集群会疯狂的运行。需要注意的是,这样的疯狂合并操作是数据增长造成的,而不是手动分割操作决定的。

如果你 pre-split 导致 regions 很小,你可以通过配置HConstants.MAJOR_COMPACTION_PERIOD把你的major compaction参数调大

如果你的数据变得太大,可以使用org.apache.hadoop.hbase.util.RegionSplitter 脚本来执行针对全部集群的一个网络IO安全的rolling split操作。

2.5.2.8. 管理 Compactions

通常管理技术是手动管理主压缩(major compactions), 而不是让HBase 来做。 缺省HConstants.MAJOR_COMPACTION_PERIOD 是一天。主压缩可能强行进行,在你并不太希望发生的时候——特别是在一个繁忙系统。关闭自动主压缩,设置该值为0.

重点强调,主压缩对存储文件(StoreFile)清理是绝对必要的。唯一变量是发生的时间。可以通过HBase shell进行管理,或通过 HBaseAdmin.

更多信息关于压缩和压缩文件选择过程,参考 Section 9.7.5.5, “压缩”

2.5.2.9.  预测执行 (Speculative Execution)

MapReduce任务的预测执行缺省是打开的,HBase集群一般建议在系统级关闭预测执行,除非在某种特殊情况下需要打开,此时可以每任务配置。设置mapred.map.tasks.speculative.execution 和 mapred.reduce.tasks.speculative.execution 为 false.

2.5.3. 其他配置

2.5.3.1. 负载均衡

负载均衡器(LoadBalancer)是在主服务器上运行的定期操作,以重新分布集群区域。通过hbase.balancer.period 设置,缺省值300000 (5 分钟).

参考 Section 9.5.4.1, “负载均衡” 获取关于负载均衡器( LoadBalancer )的更多信息。

2.5.3.2. 禁止块缓存(Blockcache)

不要关闭块缓存 (通过hbase.block.cache.size 为 0 来设置)。当前如果关闭块缓存会很不好,因为区域服务器会花很多时间不停加载hfile指数。如果工作集如此配置块缓存没有好处,最少应保证hfile指数保存在块缓存内的大小(可以通过查询区域服务器的UI,得到大致的数值。可以看到网页的上方有块指数值统计).

2.5.3.3. Nagle's or the small package problem

If a big 40ms or so occasional delay is seen in operations against HBase, try the Nagles' setting. For example, see the user mailing list thread, Inconsistent scan performance with caching set to 1 and the issue cited therein where setting notcpdelay improved scan speeds. You might also see the graphs on the tail of HBASE-7008 Set scanner caching to a better default where our Lars Hofhansl tries various data sizes w/ Nagle's on and off measuring the effect.





[1] Be careful editing XML. Make sure you close all elements. Run your file through xmllint or similar to ensure well-formedness of your document after an edit session.

[2] The hadoop-dns-checker tool can be used to verify DNS is working correctly on the cluster. The project README file provides detailed instructions on usage.

[3] 参考 Jack Levin's major hdfs issues note up on the user list.

[4] The requirement that a database requires upping of system limits is not peculiar to HBase. 参考 for example the section Setting Shell Limits for the Oracle User inShort Guide to install Oracle 10 on Linux.

[5] A useful read setting config on you hadoop cluster is Aaron Kimballs' Configuration Parameters: What can you just ignore?

[6] <title>On Hadoop Versions</title>

[6] The Cloudera blog post An update on Apache Hadoop 1.0 by Charles Zedlweski has a nice exposition on how all the Hadoop versions relate. Its worth checking out if you are having trouble making sense of the Hadoop version morass.

[7] Until recently only the branch-0.20-append branch had a working sync but no official release was ever made from this branch. You had to build it yourself. Michael Noll wrote a detailed blog, Building an Hadoop 0.20.x version for HBase 0.90.2, on how to build an Hadoop from branch-0.20-append. Recommended.

[8] Praveen Kumar has written a complimentary article, Building Hadoop and HBase for HBase Maven application development.

[9] dfs.support.append

[10] 参考 Hadoop HDFS: Deceived by Xciever for an informative rant on xceivering.

[11] The pseudo-distributed vs fully-distributed nomenclature comes from Hadoop.

[12] 参考 Section 2.4.2.1.2, “Pseudo-distributed Extras” for notes on how to start extra Masters and RegionServers when running pseudo-distributed.

[13] 对 ZooKeeper 全部配置,参考ZooKeeper 的zoo.cfg. HBase 没有包含 zoo.cfg ,所以需要浏览合适的独立ZooKeeper下载版本的 conf 目录找到。

[14] What follows is taken from the javadoc at the head of the org.apache.hadoop.hbase.util.RegionSplitter tool added to HBase post-0.90.0 release.