本文所有描述内容假设已经安装了 Java Runtime Environment (JRE)。 Hadoop 和 HBase 要求至少为 Java 7 版本,并且建议使用 Oracle Java。
本文所有描述内容为 HBase 原生安装(native),即使用 HBase 发布软件包安装。如果要了解通过工具安装和管理 HBase,参考另两篇文章:
Ambari 2.6.1 构建 Hadoop 集群 ---- CentOS 7
Ambari 操作指南 (Ambari Operations)
1 快速启动指南 (Quick-Start Guide)
-----------------------------------------------------------------------------------------------------------------------------------------
从 Apache HBase 发布版本页面下载最新的 HBase 版本(http://hbase.apache.org/downloads.html), 将其解压到合适的目录,如 /usr/local 或 /opt
cd /user/local
tar -zxvf hbase-x.y.z.tar.gz
设置数据路径
-------------------------------------------------------------------------------------------------------------------------------------
在启动 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:///<PATH>/hbase</value>
</property>
<property>
<name>hbase.zookeeper.property.dataDir</name>
<value>file:///<PATH>/zookeeper</value>
</property>
</configuration>
单机模式(Standalone Mode)启动:
$ cd /usr/local/hbase-1.0.0
$ bin/start-hbase.sh
starting master, logging to \
/usr/local/hbase-1.0.0/bin/../logs/hbase-<username>-masterlocalhost.out
$ bin/hbase shell
HBase Shell; enter 'help<RETURN>' for list of supported commands.
Type "exit<RETURN>" to leave the HBase Shell
Version 1.0.0, r6c98bff7b719efdb16f71606f3b7d8229445eb81, Sat Feb
14 19:49:22 PST 2015
hbase(main):001:0> status
1 servers, 0 dead, 2.0000 average load
hbase(main):002:0> create 'testtable', 'colfam1'
0 row(s) in 0.2930 seconds
=> Hbase::Table - testtable
hbase(main):003:0> list
TABLE
testtable
1 row(s) in 0.1920 seconds
=> ["testtable"]
hbase(main):004:0> put 'testtable', 'myrow-1', 'colfam1:q1',
'value-1'
0 row(s) in 0.1020 seconds
hbase(main):005:0> put 'testtable', 'myrow-2', 'colfam1:q2',
'value-2'
0 row(s) in 0.0410 seconds
hbase(main):006:0> put 'testtable', 'myrow-2', 'colfam1:q3',
'value-3'
0 row(s) in 0.0380 seconds
hbase(main):007:0> scan 'testtable'
ROW COLUMN+CELL
myrow-1 column=colfam1:q1, timestamp=1425041048735,
value=value-1
myrow-2 column=colfam1:q2, timestamp=1425041060781,
value=value-2
myrow-2 column=colfam1:q3, timestamp=1425041069442,
value=value-3
2 row(s) in 0.2730 seconds
hbase(main):008:0> get 'testtable', 'myrow-1'
COLUMN CELL
colfam1:q1 timestamp=1425041048735, value=value-1
1 row(s) in 0.2220 seconds
hbase(main):009:0> delete 'testtable', 'myrow-2', 'colfam1:q2'
0 row(s) in 0.0390 seconds
hbase(main):010:0> scan 'testtable'
ROW COLUMN+CELL
myrow-1 column=colfam1:q1, timestamp=1425041048735,
value=value-1
myrow-2 column=colfam1:q3, timestamp=1425041069442,
value=value-3
2 row(s) in 0.0620 seconds
hbase(main):011:0> disable 'testtable'
0 row(s) in 1.4880 seconds
hbase(main):012:0> drop 'testtable'
0 row(s) in 0.5780 seconds
hbase(main):013:0> exit
$ bin/stop-hbase.sh
stopping hbase.....
2 必备条件 (Requirements)
-----------------------------------------------------------------------------------------------------------------------------------------
2.1 硬件 (Hardware)
-----------------------------------------------------------------------------------------------------------------------------------------
运行于商用(commodity)硬件集群。
■ 服务器 (Servers)
-----------------------------------------------------------------------------------------------------------------------------------------
● CPU : 就 CPU 而言, master 机器与 slave 机器的规格应该是一样的
-------------------------------------------------------------------------------------------------------------------------------------
+-----------------------+---------------------------------------+
| 节点类型 | 推荐 |
+-----------------------+---------------------------------------+
| master | 双 4~8+ 核 CPU, 2.0 GHz ~ 2.6 GHz |
+-----------------------+---------------------------------------+
| slave | 双 4~10+ 核 CPU, 2.0 GHz ~ 2.6 GHz |
+-----------------------+---------------------------------------+
● 内存 (Memory)
-------------------------------------------------------------------------------------------------------------------------------------
真正的问题时:给单个进程分配过多的内存会产生问题吗?理论上不会,但实践证明,使用 Java 时,不应该为一个进程设置过多的内存。内存在 Java
术语中称为堆(heap), 会在使用过程中产生许多碎片,在最坏的情况下,整个堆需要重写一次,但重写堆不能在后台进行。 Java 运行时环境会暂停所有
进程内的逻辑并进行清理,这可能导致不少问题。设置的堆越大,这个过程花的时间就越长。进程并不需要大量的内存,合适的内存大小可以避免上述问
题,但是 region 服务器和缓存在理论上没有上限。因此为了避免上述问题的出现,需要根据用户访问模式找到一个平衡点。
一般认为给 region 服务器设置超过 16 GB 的堆是危险的(2011 年 Java 6 条件下)。这种情况有时候依赖于 JRE, 有的 JRE 实现可以在垃圾回收时不
阻塞进程内的工作线程。
配置不仅仅高度依赖集群的大小和数据写入量,还依赖于用户的访问模式,比如是只有交互式访问,还是交互式和批量处理混合使用(如 MapReduce)
推荐配置:
master 机器要运行 NameNode, SecondeNameNode, JobTracker 和 HBase Master, 推荐 24 GB 内存
slave 机器要运行 DataNode, TaskTracker 和 HBase RegionServer, 推荐 24 GB 内存及以上配置。
● 磁盘 (Disks)
-------------------------------------------------------------------------------------------------------------------------------------
数据存储在 slave 机器上,因此 slave 服务器需要大量的存储空间。用户需要根据主要是面向读/写,还是面向数据加工,来平衡可用的 CPU 内核数量
与磁盘数量的使用。通常情况下,用户应该保证每个磁盘至少一个核,所以在 8 核的服务器上增加 6 块磁盘是最优的,加入更多磁盘可能并不会带来显
著的性能提升。
使用 6~12 个配有 1 TB 或 2 TB 磁盘的高密度服务器比较好,既可以得到较高的存储容量,又拥有足够的 CPU 核心的 JBOD 模式,以获得较高的磁盘
带宽。
+-----------------------+-------------------------------------------+
| 节点类型 | 推荐配置: |
+-----------------------+-------------------------------------------+
| master | 4 × 1 TB SATA, RAID 1+0 (也可以 2 TB) |
+-----------------------+-------------------------------------------+
| slave | 6 × 1 TB SATA, JBOD |
+-----------------------+-------------------------------------------+
● 机架 (Chassis)
-------------------------------------------------------------------------------------------------------------------------------------
实际上,服务器机架(chassis) 不是至关重要的因素。从硬件密度来看,机架单元(简称 U) 越少越好。通常 1U 和 2U 的服务器部署在 19 英寸的机架
+-----------------------+-------------------------------------------+
| 节点类型 | 推荐配置: |
+-----------------------+-------------------------------------------+
| master | 万兆以太网,双 PSU, 1U 或 2U |
+-----------------------+-------------------------------------------+
| slave | 万兆以太网,单 PSU, 1U 或 2U |
+-----------------------+-------------------------------------------+
■ 网络 (Networking)
-----------------------------------------------------------------------------------------------------------------------------------------
千兆或以上双端口以太网卡,需要保证交换机联网的规模足够大。通常交换机有 24 或 48 个端口,实践中需要设置多个交换机交错使用,然后汇总到更大的
核心汇聚交换机(Core Aggregation Switch, CaS), 最终得到一个两层(two-tier)架构,由 ToR(Top-of-Rack, ToR) 交换机分配, CaS 汇聚。
2 软件 (Software)
-----------------------------------------------------------------------------------------------------------------------------------------
■ 操作系统 (Operating system)
-----------------------------------------------------------------------------------------------------------------------------------------
HBase 偏好使用 Linux 系统工作,事实上, Hadoop 与 HBase 本来就是基于 Linux 系统或者 Unix 系统开发的,还可以在其它类 Unix 系统上运行。
Unix 与类 Unix 系统的区别是开源免费与闭源收费,这两个系统都能用。通常不建议在 windows 上安装 HBase。以下是支持 HBase 集群的操作系统列表:
● CentOS
-------------------------------------------------------------------------------------------------------------------------------------
CentOS 是一个社区支持的免费操作系统,基于红帽企业版 Linux 操作系统(Red Hat Enterprise Linux, RHEL)改造而来。 CentOS 利用红帽为其自身
企业提供的源代码包,创建了相应的 CentOS 的各个部件,从而镜像了 RHEL 功能、特性并按等级发布包。类似于 RHEL, 它提供 RPM 格式软件包。
由于 CentOS 也侧重于企业应用,所以版本更新不会太快。它的目标是应用于大型基础设施,因此不必考虑短期的小增量包更新。
● Fedora
-------------------------------------------------------------------------------------------------------------------------------------
Fedora 也是一个社区支持的,红帽公司赞助的免费开源操作系统。但与 RHEL 和 CentOS 相比,Fedora 是一个全新的技术平台,致力于推进新的思想
和特性。因此,与面向企业的产品相比,Fedora 的发布周期更短,平均每 13 个月就会更新一次版本。事实上,它是针对工作站设计的,经常会利用
Fedora 的一些新特性。
● Debian
-------------------------------------------------------------------------------------------------------------------------------------
Debian 是另一个基于 Linux 内核的操作系统,拥有免费开源的软件升级包。可用于桌面系统和服务器系统,但 Debian 社区的更新策略相对保守,所有
软件包都需要经过充分的测试,且被视为稳定后,才会发布 Debian 的新版本。
● Ubuntu
-------------------------------------------------------------------------------------------------------------------------------------
Ubuntu 是一个基于 Debian 的 Linux 分支系统。Ubuntu 的发布周期长短结合,桌面版采用 3 年的长周期(long-term support, LTS) 更新策略,服务
器版采用 5 年的长周期更新策略。Ubuntu 的安装包虽然是 DEB 格式的,但却是基于 Debian 的不稳定分支。事实上,由于 Ubuntu 的关键模块更新过
于频繁,所以 Ubuntu 很难被用作服务器操作系统。
● Solaris
-------------------------------------------------------------------------------------------------------------------------------------
Solaris 是由 Oracle 公司提供的有限可用平台。它的前身是 Unix V4 版本,因此它与其它操作系统有很大不同。Solaris 中部分源码是开源的,其余
是闭源的。Solaris 是一个商业化产品,需要经过购买才能使用。
● Red Hat Enterprise Linux
-------------------------------------------------------------------------------------------------------------------------------------
简称 RHEL, Red Hat Linux 发行版的目的在于支持商业和企业级用户,分为服务器和桌面版,官方还提供了产品培训和产品认证计划许可证。
RHEL 的安装包称为 RPM(Red Hat Rackage Manager, 红帽软件包管理器),由 .rpm 格式的文件和自身的包管理器组成。
As for a recommendation, many production systems running HBase are on top of CentOS, or RHEL.
推荐大部分运行 HBase 的生产系统使用 CentOS 或 RHEL.
■ 磁盘文件系统 (Filesystem)
-----------------------------------------------------------------------------------------------------------------------------------------
磁盘文件系统也有多种选择,比较常见的文件系统有 ext3, ext4, 以及 XFS, 用户也可以使用其它文件系统。
提示:这里所提到的文件系统是 HDFS 数据节点依赖的本地文件系统,而 HBase 是直接与 HDFS 打交道的。
● ext3
-------------------------------------------------------------------------------------------------------------------------------------
Linux 操作系统中使用最普遍的文件系统是 ext3. 它已经被证明是稳定可靠的文件系统,这意味着生产机器中采用 ext3 为本地文件系统是一个相对安
全的选择。自从 2001 年 ext3 成为 Linux 一部分以来, ext3 一直稳步提升,并且多年来一直是 Linux 系统的默认文件系统。
在使用 ext3 时需要切记几点优化。首先用户在挂载文件系统时应该设置 noatime 属性来禁止记录文件访问时间戳以减少内核的管理开销。 HBase 不需
要记录每个文件的访问时间,并且禁用这个选项可以大幅度提高磁盘的读取性能。挂载选项通常配置在 /etc/fstab 文件中:
/dev/sdd1 /data ext3 defaults,noatime 0 0
使用该选项,隐含应用了 nodiratime 选项,因此不需要再显式应用这个选项了。
另一个优化是为了更好地利用 ext3 提供的磁盘空间。默认情况下,磁盘每个块都为关键系统进程保留一个固定的空间,以保证在磁盘存储已满的情况下不
影响关键进程的使用。这个功能对关键磁盘比较有用,比如操作系统依赖的磁盘,但对于数据磁盘来说几乎无用,并且对一个大型集群中的可用存储空间
造成极大的影响。在 ext3 中可以使用 Linux 提供的命令行工具 tune2fs 减少保留块的数量以获取更多的磁盘空间。默认情况下每块磁盘的保留块数量是
5%, 但可以安全地减少到 1% (甚至 0% ):
tune2fs -m 1 <device-name>
-m 1 设置保留块数量为 1%, -m 0 设置保留块数量为 0
Yahoo! 曾公开表示 ext3 是它们的大型 Hadoop 集群的首先文件系统。
ext3 的最大缺点是服务器启动过程需要消耗很多时间。 ext3 的格式化磁盘操作会花费数分钟时间。
● ext4
-------------------------------------------------------------------------------------------------------------------------------------
ext3 的下一代是 ext4, ext3 与 ext4 最初基于相同的代码,但 ext4 随后被移到独立的项目。2008 年以后 ext4 正式成为官方 Linux 内核的一部分。
Google 已经宣布把其存储基础设施从 ext2 升级到 ext4, 这可以人为是一个及其有震撼力的消息,并表明了 ext 系列文件系统(ext3, ext4 等)可以
在位升级(upgradable in place).
在性能方面, ext4 打败 ext3 并接近了高性能文件系统 XFS, 同时还拥有很多高级特性,例如,能够允许单文件达到 16 TB 大小,并支持 EB 的存储
空间。
ext4 中一个更重要的特性是延迟分配(delayed allocation), 建议用户在 Hadoop 和 HBase 中将其关闭。采用延迟分配策略的数据会保留在内存中,并
会在内存中保留若干数据块,直到数据最终被刷写到磁盘。这个特性会帮助快中的文件保持连续,并在某一时刻整体写入到磁盘的连续块中。这个特性减
少了磁盘碎片并提高了文件读取性能。但另一方面,它增加了在服务器崩溃时数据丢失的概率。
● XFS
-------------------------------------------------------------------------------------------------------------------------------------
XFS 几乎和 ext3 同一时间应用于 Linux. 迄今为止大多数 Linux 已支持 XFS.
XFS 与 ext4 功能类似,例如,都有 extents(分组存储块,减少每个文件需要保持的块数)以及延迟分配。
XFS 一个很大的优势是,它引导服务器时格式化非常快,这样可以有效地减少使用磁盘组建新服务器的时间。
另一方面, XFS 也有缺点。 XFS 的设计中有一个众所周知的缺点,它的一些操作涉及到了对元数据的影响,例如删除大量文件的操作。不管开发人员
已经开始着手解决这个问题。 HBase 需要操作的文件一般少而大,因此用户在 XFS 上不会受到太多的限制。
● ZFS
-------------------------------------------------------------------------------------------------------------------------------------
ZFS 是由 Sun 公司研发并在 2005 年推出的文件系统。 ZFS 是 zettabyte filesystem 的缩写,因其拥有可以存储 256 zettabytes 的能力。
ZFS 主要被 Solaris 操作系统支持,不过 ZFS 拥有非常适合 HBase 应用场景的高级功能。它支持内置的压缩,可以替换 HBase 中以插件形式提供的
压缩功能。
建议选择比较新的文件系统,如果 ext4 或 XFS.
■ Java
-----------------------------------------------------------------------------------------------------------------------------------------
Oracle Java 7 及以上版本
■ Hadoop
-----------------------------------------------------------------------------------------------------------------------------------------
Hadoop version support matrix
+---------------+---------------+---------------+---------------+---------------+---------------+
| | HBase-0.92.x | HBase-0.94.x | HBase-0.96.x | HBase-0.98.x | HBase-1.0.x |
+---------------+---------------+---------------+---------------+---------------+---------------+
| Hadoop-2.4.x | × | ? | √ | √ | √ |
+---------------+---------------+---------------+---------------+---------------+---------------+
| Hadoop-2.5.x | × | ? | √ | √ | √ |
+---------------+---------------+---------------+---------------+---------------+---------------+
由于 HBase 依赖于 Hadoop, 它要求 Hadoop 的 Jar 必须部署在 HBase 的 lib 目录下。
■ ZooKeeper
-----------------------------------------------------------------------------------------------------------------------------------------
ZooKeeper version 3.4.x is required as of HBase 1.0.0
■ SSH
-----------------------------------------------------------------------------------------------------------------------------------------
用户需要通过脚本来管理 Hadoop 和 HBase 进程必须要安装 ssh 并运行 sshd.
HBase 提供的 shell 脚本需要通过 SSH 将命令发送到集群中的每个服务器中并执行,因此强烈建议不要使用简单的密码验证,而应该使用公共秘钥认证。
■ 域名服务 (Domain Name Service)
-----------------------------------------------------------------------------------------------------------------------------------------
HBase 使用本地主机名汇报 IP 地址。正向与反向 DNS 均可以工作。可以通过以下命令验证正向 DNS 的正确性:
$ ping -c 1 $(hostname)
要确保服务器使用了公共 IP 地址,而不是环路地址 127.0.0.1, 出现这种情况的典型原因是 /etc/hosts 文件配置不正确,其中包含了计算机域名到环路
地址的映射。
■ 同步时间 (Synchronized time)
-----------------------------------------------------------------------------------------------------------------------------------------
集群中节点的时间必须一致,稍微有一点时间偏差是可以容忍的,但偏差较多会产生奇怪的行为,仅仅一分钟的偏差就可能使集群产生莫名其妙的行为。所以
用户要在集群中运行 NTP 或同等功能的应用来同步集群时间。
■ 文件句柄和进程限制 (File handles and process limits)
-----------------------------------------------------------------------------------------------------------------------------------------
HBase 是数据库,它会同时使用很多文件。在 Unix 或其它类 Unix 系统中,默认的 ulimit -n 值为 1024, 但这个值不够。任何大量的加载操作会导致
显而易见的 I/O 异常。
需要修改文件描述符的数量上限,将上限设置为超过 10,000 的数值。
还需要编辑 /etc/sysctl.conf 调整 fs.file-max 值
编辑配置文件 /etc/security/limits.conf 中提升 nproc 值以调整允许的进程数量。
■ 文件句柄和进程限制 (Datanode handlers)
-----------------------------------------------------------------------------------------------------------------------------------------
一个 Hadoop HDFS data node 有一个同一时间处理文件数量的上限。上限属性为: dfs.datanode.max.transfer.threads, 载入任何数据之前确保该属性至少
配置为如下值 (conf/hdfssite.xml 文件):
<property>
<name>dfs.datanode.max.transfer.threads</name>
<value>10240</value>
</property>
■ 交换区 (Swappiness)
-----------------------------------------------------------------------------------------------------------------------------------------
交换区—— 在工作站上或许是好事 —— 但是在服务器上已经逐渐被禁止。因为一旦服务器开始使用交换区,整体的性能会显著降低。
编辑配置文件 /etc/sysctl.conf 加入如下命令对 Linux 和类 Unix 系统服务器交换区的相关参数进行调整:
vm.swappiness=5
设置该值为 5 或 0,以降低交换区的使用。
由于 Linux kernel version 2.6.32, 交换区的值的行为发生了变化,建议使用 1 或更高的值,而不是 0。
有些激进的管理员完全关闭了交换区 (Linux 的 swappoff)
3 HBase 使用的文件系统 (Filesystems for HBase)
-----------------------------------------------------------------------------------------------------------------------------------------
HBase 最常使用的文件系统是 HDFS, 但不仅仅是 HDFS,因为 HBase 使用的文件系统是一个可插拔的架构,用户可以使用其它任何支持 Hadoop 接口的文件
系统代替 HDFS。事实上,用户可以实现自己的文件系统。
HDFS 是生产中使用最广泛的且经过检验的文件系统。几乎所有的生产集群都使用 HDFS 作为底层存储,它被证明是稳定可靠的系统,然而,不使用 HDFS 可
能会产生不可控的风险和一些后续问题。
HDFS 如此受欢迎的主要原因是,它的机制包含了冗余、容错性和可扩展性。无论选择哪个文件系统都应该提供类似的保障,因为 HBase 需要假定文件系统中
的数据存储时可靠的,并且因为 HBase 本身没有办法复制数据并维护自身存储文件的副本,因此比较低层次的文件系统必须提供次功能。
通过设置 URI 模式(pattern), 可以选择不同的文件系统实现,URI scheme (第一个冒号 : 之前的部分) 标识了使用的驱动器(driver).
3.1 本地模式 (Local)
-----------------------------------------------------------------------------------------------------------------------------------------
本地文件系统实际上完全绕开了 Hadoop, 即不使用 HDFS 或任何其它集群。 HBase 使用 FileSystem 类连接到文件系统实现, Hadoop 客户端加载并使用
Hadoop 提供的 ChecksumFileSystem 类来直接操作本地磁盘路径来存储所有数据。
这种方法的特点是, HBase 直接使用本地文件系统,而不需要关注使用的是一个远程的分布式文件系统还是一个托管集群。HBase 单机模式(standalone mode)
会直接使用上述特性。用户设置以下参数就可以直接使用本地文件系统了:
file:///<path>
3.2 HDFS
-----------------------------------------------------------------------------------------------------------------------------------------
Hadoop 分布式文件系统(Hadoop Distributed File System, HDFS) 是默认的文件系统,它部署在一个完全分布式的集群中。 HBase 选择 HDFS 作为文件系
统,是因为 HDFS 具有所有必须的功能。如前所述的与 MapReduce 的耦合,能够充分利用其并行流式处理能力。并且拥有较好的扩展性、系统可靠性和自动
冗余功能,是理想可靠的文件存储系统。 HBase 增加了随机存取层,是 HDFS 缺失的部分,是对 Hadoop 的理想补充。另外利用 MapReduce 的并行处理能力
可以执行批量导入数据的功能,最大限度利用磁盘带宽。
使用如下 URI 访问 HDFS:
hdfs://<namenode>:<port>/<path>
3.3 S3
-----------------------------------------------------------------------------------------------------------------------------------------
Amazon’s Simple Storage Service (S3) 是一个存储系统,主要与运行在 Amazon 的弹性计算云(Elastic Compute Cloud, EC2)上的动态服务器联合使用。
S3 可以不依赖 EC2 直接使用,S3 输入和导出数据消耗的带宽成本是非常高的。 EC2 和 S3 之间的数据迁移是免费的,因此这是个可行的方案。
S3 文件系统实现了 Hadoop 支持的三种不同模式:原生模式(raw or native mode), 块模式 (block-based mode), 以及较新的 AWS SDK based mode.
原生模式使用 s3n: URI scheme, 并直接将数据写入到 S3, 与本地文件系统类似。
s3: scheme 是基于块的模式,可用来克服 S3 最大文件为 5 GB 的限制。
s3a: scheme 是 AWS SDK based 模式。
可以使用如下 URI 选择 S3 文件系统:
s3://<bucket-name>
s3n://<bucket-name>
s3a://<bucket-name>
3.3 其它文件系统 (Other Filesystems)
-----------------------------------------------------------------------------------------------------------------------------------------
Quantcast File System (QFS)
Azure filesystem
Swift filesystem
A list of HDFS filesystem implementations
+-----------------------+---------------+-------------------------------------------------------------------+
| File System | URI Scheme | Description |
+-----------------------+---------------+-------------------------------------------------------------------+
| HDFS | hdfs: | The original Hadoop Distributed Filesystem |
+-----------------------+---------------+-------------------------------------------------------------------+
| S3 Native | s3n: | Stores in S3 in a readable format for other S3 users |
+-----------------------+---------------+-------------------------------------------------------------------+
| S3 Block | s3: | Data is stored in proprietary binary blocks in S3, using JetS3t |
+-----------------------+---------------+-------------------------------------------------------------------+
| S3 Block (New) | s3a: | Improved proprietary binary block storage, using the AWS API |
+-----------------------+---------------+-------------------------------------------------------------------+
| Quantcast FS | qfs: | External project providing a HDFS replacement |
+-----------------------+---------------+-------------------------------------------------------------------+
| Azure Blob Storage | wasb: | Uses the Azure blob storage API to store binary blocks |
+-----------------------+---------------+-------------------------------------------------------------------+
| OpenStack Swift | swift: | Provides storage access for OpenStack’s Swift blob storage |
+-----------------------+---------------+-------------------------------------------------------------------+
4 安装选项 (Installation Choices)
-----------------------------------------------------------------------------------------------------------------------------------------
4.1 Apache 二进制发布包 (Apache Binary Release)
-----------------------------------------------------------------------------------------------------------------------------------------
$ cd /usr/local
$ wget http://archive.apache.org/dist/hbase/hbase-1.0.0/
hbase-1.0.0-bin.tar.gz
$ tar -zxvf hbase-1.0.0-bin.tar.gz
$ cd hbase-1.0.0
$ ls -l
根目录下如下目录:
bin : 二进制文件,此目录包含了 HBase 提供的所有脚本,可以完成启动和停止,运行独立的守护进程或启动额外的 master 节点等功能
conf : 配置文件目录中包含了定义 HBase 配置的文件
docs : 包含了 HBase 工程网页的副本,以及工具、API 和项目自身的文档信息
hbase-webapps : 提供了 Java 实现的 web 接口
lib : Java 类库
logs : HBase 进程通常以守护进程的形式运行,在生命周期内它会将一些状态、异常等信息打印到日志文件中
4.2 编译源代码 (Building from Source)
-----------------------------------------------------------------------------------------------------------------------------------------
HBase 依赖于 Maven 编译工程,因此用户需要安装 Maven 以及完整的 JDK.
$ cd /usr/username
$ wget http://archive.apache.org/dist/hbase/hbase-1.0.0/
hbase-1.0.0-src.tar.gz
$ tar -zxvf hbase-1.0.0-src.tar.gz
cd hbase-1.0.0
$ mvn package
skip the test phase:
$ mvn -DskipTests package
$ mvn -DskipTests package assembly:single
文档:
$ mvn site
5 运行模式 (Run Modes)
-----------------------------------------------------------------------------------------------------------------------------------------
HBase 有两种运行模式:单机模式和分布式模式
要启动分布式模式只需要编辑 conf 目录中的配置文件即可。
无论启动什么模式,都必须编辑 conf/hbase-env.sh 文件来告诉 HBase 使用的 Java 的位置,只需要设置 JAVA_HOME 即可,让该参数指向 Java 的安装
目录。在这个文件中,还能够设置 HBase 环境变量,如堆大小和其它一些 JVM 参数,以及日志文件的输出目录等。
5.1 单机模式 (Standalone Mode)
-----------------------------------------------------------------------------------------------------------------------------------------
这是默认模式,具体描述见 1 节。在单机模式下, HBase 不使用 HDFS —— 仅使用本地文件系统 —— ZooKeeper 程序与 HBase 程序运行在同一个 JVM
进程中, ZooKeeper 绑定到客户端的常用端口上,以便客户端可以与 HBase 进行通信。
5.2 分布式模式 (Distributed Mode)
-----------------------------------------------------------------------------------------------------------------------------------------
分布式可以进一步细分为伪分布式模式(pseudo distributed) —— 所有守护进程都运行在单个节点上,以及完全分布式模式(fully distributed) —— 进程
运行在物理服务器集群中。
分布式模式依赖于 Hadoop 分布式文件系统实例(Hadoop Distributed File System, HDFS).
■ 伪分布式模式 (Pseudo-distributed mode)
-------------------------------------------------------------------------------------------------------------------------------------
伪分布式模式是在一台主机上运行所有进程的模式。此配置仅仅协助 HBase 用于测试和原形(prototyping)。不要在生产环境中使用此配置,也不要用
此配置做 HBase 的性能比较。
如果确认 HDFS 已经启动,编辑 conf/hbasesite.xml 配置文件。在这个文件中可以添加自定义的本地参数,并覆盖 HBase 的默认配置。设置属性:
hbase.rootdir 指向 HDFS 实例:
<configuration>
...
<property>
<name>hbase.rootdir</name>
<value>hdfs://localhost:9000/hbase</value>
</property>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
...
</configuration>
说明:HBase 使用 HDFS 的 /hbase 目录作为根目录, HDFS 的服务端是本机端口 9000,并且数据只保留 1 个副本(建议伪分布式模式这样做)。服务器
绑定到 localhost 上,意味着远程客户端无法连接。如果用户要从远程位置连接,需要做相应修改。
■ 完全分布式模式 (Fully distributed mode)
-------------------------------------------------------------------------------------------------------------------------------------
如果要在多台主机集群上运行完全分布式操作,在 hbase-site.xml 配置文件中,需要进行以下配置:hbase.cluster.distributed 属性并设置为 true
hbase.rootdir 属性指向 HDFS namenode 及 HBase 数据在 HDFS 中的位置:
<configuration>
...
<property>
<name>hbase.rootdir</name>
<value>hdfs://namenode.foo.com:9000/hbase</value>
</property>
<property>
<name>hbase.cluster.distributed</name>
<value>true</value>
</property>
...
</configuration>
说明: namenode 运行的主机名为 namenode.foo.com, 服务端口 9000, HBase 在 HDFS 上使用的根目录为 /hbase
配置 region servers:
---------------------------------------------------------------------------------------------------------------------------------
此外,完全分布式模式需要修改 conf/regionservers 文件。该文件列出了所有运行 HRegionServer 守护进程的主机,每个主机占一行(类似于
Hadoop 的 slave 文件)。HBase 集群启动和关闭时会按照该文件中列出的主机逐一执行。默认情况下该文件只包含 localhost 项,为单机模式和
伪分布式指向其自身。
配置 ZooKeeper:
---------------------------------------------------------------------------------------------------------------------------------
分布式 HBase 也依赖于一个运行的 ZooKeeper 集群。所有的节点和客户端都必须能够正常访问 ZooKeeper。HBase 默认管理一个单节点的
ZooKeeper 集群,通过启动和关闭脚本就可以把 ZooKeeper 当做 HBase 的一部分来启动和关闭进程。也可以不依赖 HBase 管理 ZooKeeper 集群,
只需要为 HBase 指出需要使用的集群即可。在 conf/hbase-env.sh 文件中设置 HBASE_MANAGES_ZK 变量为 true, 可以将 ZooKeeper 作为 HBase
的一部分管理启动(这个参数默认为 true).
当 HBase 管理 ZooKeeper 集合体时,可以直接在 conf/hbase-site.xml 中指定 ZooKeeper 的配置选项。在 hbase-site.xml 中设置 ZooKeeper
配置选项,要在 ZooKeeper 选项名上加上前缀 hbase.zookeeper.property. 例如,设置 ZooKeeper 的 clientPort 要设置属性:
hbase.zookeeper.property.clientPort
必须至少通过 hbase.zookeeper.quorum 属性设置集合体服务器。该属性默认值为一个成员 localhost 的集合体,不适应于完全分布式 HBase(只
绑定到本机,远程客户端无法连接)
有三个前缀用于指定 ZooKeeper 相关的属性:
zookeeper. : Specifies client settings for the ZooKeeper client used by the HBase client library
hbase.zookeeper : Used for values pertaining to the HBase client communicating to the ZooKeeper servers.
hbase.zookeeper.properties. : These are only used when HBase is also managing the ZooKeeper ensemble, specifying ZooKeeper
server parameters.
例如,要通过 HBase 在节点 rs{1,2,3,4,5}.foo.com 上管理 ZooKeeper, 并绑定端口 2222(默认为 2181), 必须确保 conf/hbase-env.sh 中
注释掉 HBASE_MANAGES_ZK , 或者设置其值为 true, 然后编辑 conf/hbasesite.xml 文件并设置 hbase.zookeeper.property.clientPort 和
hbase.zookeeper.quorum. 也应该设置 hbase.zookeeper.property.dataDir 为某个值而不是其默认值,因为默认值是在 /tmp 下保留 ZooKeeper
持久化数据,在系统重启后会清除。下面的例子中,设置 ZooKeeper 持久化到 /var/zookeeper
<configuration>
...
<property>
<name>hbase.zookeeper.property.clientPort</name>
<value>2222</value>
</property>
<property>
<name>hbase.zookeeper.quorum</name>
<value>rs1.foo.com,rs2.foo.com,rs3.foo.com,rs4.foo.com,rs5.foo.com</value>
</property>
<property>
<name>hbase.zookeeper.property.dataDir</name>
<value>/var/zookeeper</value>
</property>
...
</configuration>
使用已存在的 ZooKeeper 集群:
---------------------------------------------------------------------------------------------------------------------------------
HBase 采用已存在的 ZooKeeper 集群,因此不能依赖 HBase 来管理 ZooKeeper, 用户需要在 conf/hbase-env.sh 中将 HBASE_MANAGES_ZK 属性
设置为 false.
...
# Tell HBase whether it should manage it's own instance of Zookeeper or not.
export HBASE_MANAGES_ZK=false
下一步需要在 hbase-site.xml 中设置 ZooKeeper 集合体的连接地址和客户端端口号。HBase 管理 ZooKeeper 时, HBase 会将 ZooKeeper 服务器的
启动和停止作为其自身常规启动/停止脚本的一部分。如果要独立于 HBase 的启动/停止过程,自己运行 ZooKeeper, 运行如下命令:
${HBASE_HOME}/bin/hbase-daemons.sh {start,stop} zookeeper
采用这种方式可以让 ZooKeeper 与 HBase 脱离关系,只有在 HBASE_MANAGES_ZK 设置为 false 后, ZooKeeper 才不会因 HBase 的关闭而关闭。
6 配置 (Configuration)
-----------------------------------------------------------------------------------------------------------------------------------------
HBase 的配置类似于 Hadoop 的配置,配置文件放在 conf 目录下。这些文件都是简单的文本文件,要么是 xml 格式的排列为一系列的 property, 要么是
纯的文本文件。
HBase 1.0.0 中可用的配置文件如下:
● hbase-env.cmd and hbase-env.sh
-------------------------------------------------------------------------------------------------------------------------------------
设置 HBase 的工作环境,设定一些环境变量,如 JAVA_HOME. 分别对应 Windows 和 Linux 系统
● hbase-site.xml
-------------------------------------------------------------------------------------------------------------------------------------
HBase 主配置文件,这个文件中设定的配置选项会覆盖 HBase 的默认配置值。
● backup-masters
-------------------------------------------------------------------------------------------------------------------------------------
这个文件对于新安装的 HBase 是没有的。是个文本文件,其中列出所有作为 master 的备份主机启动的主机。
● regionservers
-------------------------------------------------------------------------------------------------------------------------------------
列出运行为 region server 实例的所有节点。
● hadoop-metrics2-hbase.properties
-------------------------------------------------------------------------------------------------------------------------------------
设定 metrics framework 集成到每个 HBase 进程中的设置信息。
● hbase-policy.xml
-------------------------------------------------------------------------------------------------------------------------------------
在安全模式下,这个文件定义客户端访问服务器的认证规则
● log4j.properties
-------------------------------------------------------------------------------------------------------------------------------------
配置 Log4J 库,使 HBase 进程如何记录日志信息。
6.1 hbase-site.xml and hbase-default.xml
-----------------------------------------------------------------------------------------------------------------------------------------
hbase-default.xml 文件位于 HBase 解压目录 lib/hbase-common-x.x.x.jar 文件内,抽取该文件查看所有可配置属性列表及其描述信息。
服务器总是首先读取 hbase-default.xml 文件,然后如果 hbase-site.xml 文件存在,就用 hbase-site.xml 文件的内容与之合并。hbase-site.xml 文件中
的属性值总是优先于从 hbase-default.xml 中载入的默认值。
6.2 hbase-env.sh and hbase-env.cmd
-----------------------------------------------------------------------------------------------------------------------------------------
在这两个文件中设置 HBase 环境变量,分别对应 Windows 和 Linux 系统。例如,HBase 守护进程的 JVM 启动选项: Java 堆大小和垃圾回收器配置信息。
也可以配置 HBase, 如日志目录,SSH 选项,进程 PID 文件位置等等。
6.3 regionserver
-----------------------------------------------------------------------------------------------------------------------------------------
该文件列出所有已知 region server 主机名称。这是一个纯文本文件,每个主机占一行。HBase 维护脚本会依次迭代访问每一行来启动所有 region server
进程。
6.4 log4j.properties
-----------------------------------------------------------------------------------------------------------------------------------------
修改这个文件中的参数可以改变 HBase 日志文件滚动频率和 HBase 日志级别。也可以通过 HBase web UI 修改相关配置。
6.5 配置示例 (Example Configuration)
-----------------------------------------------------------------------------------------------------------------------------------------
下面示例是一个 10 个节点的集群。节点名称分别为 master.foo.com, host1.foo.com 到 host9.foo.com, HBase Master 和 HDFS name node 都运行在
master.foo.com 节点上。 HBase region server 运行在 host1.foo.com 到 host9.foo.com 节点上。三节点的 ZooKeeper 集合体(ensemble) 运行在
zk1.foo.com, zk2.foo.com, and zk3.foo.com 三个节点上,采用默认端口号。 ZooKeeper 数据持久化目录为 /var/zookeeper
● hbase-site.xml
-------------------------------------------------------------------------------------------------------------------------------------
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>hbase.zookeeper.quorum</name>
<value>zk1.foo.com,zk2.foo.com,zk3.foo.com</value>
</property>
<property>
<name>hbase.zookeeper.property.dataDir</name>
<value>/var/zookeeper</value>
</property>
<property>
<name>hbase.rootdir</name>
<value>hdfs://master.foo.com:9000/hbase</value>
</property>
<property>
<name>hbase.cluster.distributed</name>
<value>true</value>
</property>
</configuration>
● regionservers
-------------------------------------------------------------------------------------------------------------------------------------
host1.foo.com
host2.foo.com
host3.foo.com
host4.foo.com
host5.foo.com
host6.foo.com
host7.foo.com
host8.foo.com
host9.foo.com
● hbase-env.sh
-------------------------------------------------------------------------------------------------------------------------------------
# export HBASE_HEAPSIZE=1000
export HBASE_HEAPSIZE=4096
...
6.6 配置客户端 (Client Configuration)
-----------------------------------------------------------------------------------------------------------------------------------------
HBase Master 能够在物理机器上移动(备份 master 机器),客户端启动时通过 ZooKeeper 来获取关键信息,因此客户端必须在 hbase-site.xml 中配置
ZooKeeper quorum 信息,同时要将 hbase-site.xml 文件配置到 Java 进程的 $CLASSPATH 路径中。
如果通过 IDE 运行 HBase 客户端,必须保证 conf 目录包含到类路径中(class path). 这样才能保证客户端代码找到配置文件。
HBase 的 Java 客户端需要在 $CLASSPATH 中指定要依赖的 JAR 文件:
$ bin/hbase mapredcp | tr ":" "\n" | sed "s/\/usr\/local\/
hbase-1.0.0\/lib\///"
zookeeper-3.4.6.jar
hbase-common-1.0.0.jar
hbase-protocol-1.0.0.jar
htrace-core-3.1.0-incubating.jar
protobuf-java-2.5.0.jar
hbase-client-1.0.0.jar
hbase-hadoop-compat-1.0.0.jar
netty-all-4.0.23.Final.jar
hbase-server-1.0.0.jar
guava-12.0.1.jar
这些 JAR 文件以特定发布版本号为后缀。理想情况下,使用 HBase 提供的 JAR, 而不要随意使用其它版本,因为即使轻微的版本变化都可能导致客户端远程
访问 HBase 集群出现问题。
客户端 hbase-site.xml 配置如下:
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>hbase.zookeeper.quorum</name>
<value>zk1.foo.com,zk2.foo.com,zk3.foo.com</value>
</property>
</configuration>
7 部署 (Deployment)
-----------------------------------------------------------------------------------------------------------------------------------------
配置好 HBase 之后,下一步就是将它部署到集群上。有很多种方法可以实现部署,由于 Hadoop 和 HBase 都是用 Java 语言写的,因此只有很少的必须的
要求需要注意。最简单的就是在服务器间复制所有文件,因为这样可以使服务器共享相同的配置文件。
7.1 基于脚本 (Script-Based)
-----------------------------------------------------------------------------------------------------------------------------------------
基于脚本方法比较适合小型甚至中等规模的集群。
脚本利用 regionservers 配置文件作为集群服务器列表。
下面脚本实现从 master 节点复制 HBase 发布目录到其它 slave 节点的功能
# Example Script to copy the HBase files across a cluster
# Rsync's HBase files across all slaves. Must run on master. Assumes
# all files are located in /usr/local
if [ "$#" != "2" ]; then
echo "usage: $(basename $0) <dir-name> <ln-name>"
echo " example: $(basename $0) hbase-0.1 hbase"
exit 1
fi
SRC_PATH="/usr/local/$1/conf/regionservers"
for srv in $(cat $SRC_PATH); do
echo "Sending command to $srv...";
rsync -vaz --exclude='logs/*' /usr/local/$1 $srv:/usr/local/
ssh $srv "rm -fR /usr/local/$2 ; ln -s /usr/local/$1 /usr/local/$2"
done
echo "done."
下面脚本用于从 master 节点向其它所有节点复制 HBase 配置文件。在 master 服务器上编辑好配置文件之后,通过这个脚本可以将配置文件同步到所有 region
服务器。
# Example Script to copy configurations across a cluster
#!/bin/bash
# Rsync's HBase config files across all region servers. Must run on master.
for srv in $(cat /usr/local/hbase/conf/regionservers); do
echo "Sending command to $srv...";
rsync -vaz --delete --exclude='logs/*' /usr/local/hadoop/ $srv:/usr/local/hadoop/
rsync -vaz --delete --exclude='logs/*' /usr/local/hbase/ $srv:/usr/local/hbase/
done
echo "done."
7.2 Apache Whirr (http://whirr.apache.org/)
-----------------------------------------------------------------------------------------------------------------------------------------
Apache Whirr: 是一套运行于云服务的类库(包括Hadoop),可提供高度的互补性。Whirr 支持Amazon EC2 和 Rackspace的服务。
支持各种公有云和私有云的 API, 并提供一个拥有一定范围服务的集群。
7.3 Puppet and Chef
-----------------------------------------------------------------------------------------------------------------------------------------
类似于 Whirr, 还有其他专用部署框架。Puppet 出自 Puppet 实验室 http://www.puppetlabs.com/, Chef 出自:http://www.opscode.com/chef/
两者相似的地方是,所有配置文件都保存在中央配置服务器中,客户端软件运行在每个服务器上,服务器与中央服务器通信以接收更新并应用到本地服务器上。
类似于 Whirr, 这两者都有 recipes 概念,本质上会转化成脚本或命令在节点上执行。
Whirr 仅用于引导,Puppet 和 Chef 支持对运行中的集群进行修改。master 进程监控配置仓库,如果有更新,就会触发远程动作。这可以协助用户重新配置
集群或升级新版本,回滚重启等操作。
8 操作集群 (Operating a Cluster)
-----------------------------------------------------------------------------------------------------------------------------------------
现在已设置了服务器,配置了操作系统和文件系统,并且编辑好了配置文件,已准备好第一次启动 HBase 集群。
8.1 运行并确认自己的安装 (Running and Confirming Your Installation)
-----------------------------------------------------------------------------------------------------------------------------------------
首先确认启动 HDFS. 通过 $HADOOP_HOME 目录中的 bin/start-dfs.sh 启动 Hadoop HDFS. 通过测试 put 和 get 文件到 Hadoop 文件系统以确认正确启动。
HBase 通常不依赖 YARN daemons, 只有在实际需要运行 MapReduce 作业的时候才启动 YARN。
如果自己管理 ZooKeeper, 启动 ZooKeeper 并确认其运行,否则 HBase 会启动失败。
运行完全分布式模式 HBase, 从 $HBASE_HOME 目录内运行命令:
$ bin/start-hbase.sh
这样就有了一个运行的 HBase 实例。 HBase 日志文件可以在 $HBASE_HOME/logs 子目录下找到。
8.2 Web UI 介绍 (Web-based UI Introduction)
-----------------------------------------------------------------------------------------------------------------------------------------
HBase 也启动一个基于 Web 的用户接口(UI) 列出一些关键属性。默认情况下,HBase master web UI 使用的主机端口为:16010, HBase region servers
web UI 使用的主机端口为:16030
例如,如果 master 运行在 master.foo.com 主机上,使用浏览器访问 http://master.foo.com:16010 显示 HBase master web UI 内容。
页面中可以访问 HBase 集群的各种状态信息。信息分成若干块,顶部展示了可用的 region server 信息,以及可选的 backup-masters. 后面是 User Tables,
System Tables, 以及 Snapshots.
下面部分展示当前运行的任务(如果有的话)。最后页面的底部展示集群的安装信息。
8.3 Shell 介绍 (Shell Introduction)
-----------------------------------------------------------------------------------------------------------------------------------------
HBase Shell 是使用 (J)Ruby 的 IRB 实现的命令行脚本,加入了一些 HBase 相关的命令。可以在 IRB 中做的任何事,都可以在 HBase Shell 中完成。
通过如下命令启动 shell:
$ bin/hbase shell
HBase Shell; enter 'help<RETURN>' for list of supported commands.
Type "exit<RETURN>" to leave the HBase Shell
Version 1.0.0, r6c98bff7b719efdb16f71606f3b7d8229445eb81, Sat Feb
14 19:49:22 PST 2015
hbase(main):001:0>
输入 help 查看 shell 命令列表及选项。浏览 help 文本了解 HBase Shell 中的变量和命令参数,特别注意,表名称,行,列必须使用引号扩起来。
由于是 JRuby-based 的 shell, 可以混合使用 Ruby 和 HBase command, 如:
hbase(main):001:0> create 'testtable', 'colfam1'
hbase(main):002:0> for i in 'a'..'z' do for j in 'a'..'z' do \
put 'testtable', "row-#{i}#{j}", "colfam1:#{j}", "#{j}" end end
第一个命令使用默认值创建一个新表 testtable, 带有一个列族 colfam1. 第二个命令使用 Ruby 循环在新表中创建行,创建的行键开始于 row-aa, row-ab
直到 row-zz.
8.4 停止 HBase 集群 (Stopping the Cluster)
-----------------------------------------------------------------------------------------------------------------------------------------
停止 HBase 集群,输入如下命令:
$ bin/stop-hbase.sh
stopping hbase...............
一旦启动了这个脚本,会看到一条消息说明集群正在停止,后面跟周期性打印的 . 字符指示停止的进度。
在分布式模式下,在关闭 Hadoop 集群之前一定要确认 HBase 已经正常关闭完成。