页面树结构

2017-11-09 ApacheCN 开源组织,第二期邀请成员活动,一起走的更远 : http://www.apachecn.org/member/209.html


MachineLearning 优酷地址 : http://i.youku.com/apachecn

转至元数据结尾
转至元数据起始

本指南介绍了如何建立一个 ( single-node standalone ) 独立的 HBase 实例,并使之运行在本地的文件系统中。这对于一个 HBase 的生产实例不是很适当的配置,但是可以让你亲自体验和了解 HBase 。本节将向你展示如何在 HBase 中使用 HBase Shell CLI 创建表,向表中插入若干行,对表执行 putscan (扫描)操作,启用或者禁用表,启动和停止 HBase

除了下载 HBase 这整个操作过程不应超过 10 分钟。

注意

HBase 0.94.x 之前, HBase 预期回环 IP 地址为 127.0.0.1Ubuntu 和其他一些发行版默认为 127.0.1.1 ,这将为您带来问题。查看一些细节:Why does HBase care about /etc/hosts?

以下 /etc/hosts 文件在 Ubuntu 上正常工作在 HBase 0.94.x 及更早版本。如果遇到麻烦,请使用此模板。

127.0.0.1 localhost
127.0.0.1 ubuntu.ubuntu-domain ubuntu

此问题已在 hbase-0.96.0 及更高版本中得到解决。

JDK版本要求

HBase 需要 JDK 被事先安装。查看 Java 了解支持的 JDK 版本的信息。

开始着手 HBase 

步骤:下载,配置和启动 HBase

1 从 Apache 下载镜像列表中选择一个下载网站下载 HBase Release。点击建议的顶部链接。这将带你到达一个 HBase Release 的镜像。点击 stable 目录,然后下载后缀为 .tar.gz 的二进制文件到本地文件系统。现在不要下载文件后缀名为 src.tar.gz 。

2 将下载的文件解压缩,然后进入到解压后的文件目录

$ tar xzvf hbase-2.0.0-SNAPSHOT-bin.tar.gz
$ cd hbase-2.0.0-SNAPSHOT/

3 您需要在启动 HBase 之前设置 JAVA_HOME 环境变量。您可以通过操作系统的常用机制设置变量,但 HBase 提供了一个中央机制 conf / hbase-env.sh 。 编辑此文件,将从 JAVA_HOME 开始的行取消注释,并将其设置为适用于您的操作系统的位置。 应将 JAVA_HOME 变量设置为包含可执行文件 bin/java 的目录。 大多数现代 Linux 操作系统提供了一种机制,例如 RHELCentOS 上的 /usr/bin/alternative,用于在可执行文件,如 Java ,之间进行透明的切换。 在这种情况下,您可以将 JAVA_HOME 设置为包含 bin/java 的符号链接的目录,通常是 /usr

JAVA_HOME=/usr

4 编辑 conf/hbase-site.xml 文件,这个是主要的 HBase 配置文件。在这个时候,你只需要为 HBaseZooKeeper 指定本地的目录作为写数据的目录。默认情况下,会在 /tmp 下创建一个新的目录。许多服务器配置为在重新启动时删除 /tmp 的内容,因此您应该将数据存储在其他位置。 以下配置将 HBase 的数据存储在名为 testuser 的用户的主目录中的 hbase 目录中。 将 <property> 标签粘贴在 <configuration> 标签下,在新的 HBase 安装中应该是空的。

Example 1 单节点的 HBasehbase-site.xml 文件示例

<configuration>
  <property>
    <name>hbase.rootdir</name>
    <value>file:///home/testuser/hbase</value>
  </property>
  <property>
    <name>hbase.zookeeper.property.dataDir</name>
    <value>/home/testuser/zookeeper</value>
  </property>
</configuration>

你不需要创建 HBase 的数据目录, HBase 本身会为你做这个。如果你创建了数据目录, HBase 会尝试做数据迁移,这明显是你不想要的。

注意

上述示例中的 hbase.rootdir 指向本地文件系统中的目录。 'file:/' 前缀是我们如何表示本地文件系统。要在现有的的 HDFS 实例上设置 HBase ,请将 hbase.rootdir 设置为指向您的实例上的目录:例如 hdfs://namenode.example.org:8020/hbase 。有关此 variant ( 变体 ) 的更多信息,请参阅下面关于 HDFS 上的独立 HBase 的部分。

bin/start-hbase.sh 脚本提供了一个方便的方式开始 HBase 。发出命令,如果一切运行顺利的话,一条消息会记录到标准输出显示 HBase 成功启动。你可以使用 Jps 命令确认你有一个运行的进程称为 HMaster 。在单节点模式下, HBase 运行所有的进程在单个 JVM 中。即  HMaster , 单个 HRegionServer , 和 ZooKeeper 进程。转到 http://localhost:16010 查看 HBase Web UI

注意

Java 需要被安装并且可运行。如果你得到一个错误提示为 Java 没有被安装,但是 Java 确实在你的系统中,可能在一个不标准的位置,编辑 conf/hbase-env.sh 文件,并修改 JAVA_HOME 设定指向你的系统中包含 bin/java 的目录。

步骤:第一次使用 HBase 

1.连接 HBase 

使用 hbase shell 命令连接到你的运行着的 HBase 实例, hbase shell 位于你的 HBase 安装目录下的 bin/ 目录下。在这个例子中,当你在启动 HBase Shell 时忽略的一些使用信息和版本信息会被打印出来。 HBase Shell 使用 > 作为结尾提示符。

$ ./bin/hbase shell
hbase(main):001:0>

2.显示 HBase Shell 帮助文本

输入 help 并按下 Enter 键,在 HBase Shell 中显示一些 HBase Shell 的基本使用信息,以及一些命令的例子。注意,表名,行,列都需要封闭在引号中。

3.创建一个表

使用  create 命令创建一个新的表。你必须指明 ( table name ) 表名和 ( ColumnFamily ) 列族的名称。如下方的例子,test 是表的名字,表中只有一个列族,cf 是列族的名字。

hbase(main):001:0> create 'test', 'cf'
0 row(s) in 0.4170 seconds

=> Hbase::Table - test

4.将你的表信息列出来

使用 list 命令做到

hbase(main):002:0> list 'test'
TABLE
test
1 row(s) in 0.0180 seconds

=> ["test"]

5.向你的表中插入数据

将数据插入到表中,使用 put 命令

hbase(main):003:0> put 'test', 'row1', 'cf:a', 'value1'
0 row(s) in 0.0850 seconds

hbase(main):004:0> put 'test', 'row2', 'cf:b', 'value2'
0 row(s) in 0.0110 seconds

hbase(main):005:0> put 'test', 'row3', 'cf:c', 'value3'
0 row(s) in 0.0100 seconds

在这里,我们插入了3个值,一个值在一个时间。第一个插入是在 row1 行,在 cf:a 列,值是 value1HBase 中的列的组成是由列族作为前缀,本例中是 cf ,后面紧跟一个冒号,然后是一个列限定符作为后缀,在本例中是 a 。

6.一次性扫描出表中的所有数据

一个从 HBase 中获得数据的方法就是扫描。使用 scan 命令扫描表中的数据。您可以限制您的扫描,但是现在,所有的数据都被得到了。

hbase(main):006:0> scan 'test'
ROW                                      COLUMN+CELL
 row1                                    column=cf:a, timestamp=1421762485768, value=value1
 row2                                    column=cf:b, timestamp=1421762491785, value=value2
 row3                                    column=cf:c, timestamp=1421762496210, value=value3
3 row(s) in 0.0230 seconds

7.获得单行的数据

为了一次获得单行的数据,使用 get 命令

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

8.禁用表

如果你想要删除一张表或者修改它的一些设置,以及在其他一些情况下,你需要首先禁用表,使用 disable 命令,你可以使用 enable 命令重新启用它。

hbase(main):008:0> disable 'test'
0 row(s) in 1.1820 seconds

hbase(main):009:0> enable 'test'
0 row(s) in 0.1770 seconds

如果你测试上面的 enable 命令,再次禁用表:

hbase(main):010:0> disable 'test'
0 row(s) in 1.1820 seconds

9.删除一张表

为了 drop ( delete ) 一张表,使用 drop 命令。

hbase(main):011:0> drop 'test'
0 row(s) in 0.1370 seconds

10.退出 HBase Shell 

为了退出 HBase Shell 并且与你的集群断开连接,使用 quit 命令。但是 HBase 仍然在后台运行着。

 

步骤:停止 HBase 

1.就像 bin/start-hbase.sh 脚本为启动所有的 HBase 进程提供方便的方法一样,bin/stop-hbase.sh 脚本用来停止所有的 HBase 进程。

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

2.在发出命令之后,它可能会花费几分钟去关闭进程。使用 jps 命令确保 HMasterHRegionServer 进程都已经关闭。

以上介绍了如何启动和停止一个独立的 Hbase 实例。在接下来的章节中,我们将简要介绍 hbase 部署的其他模式。

中间-伪分布式本地安装

通过 快速入门 的工作方式之后,你可以重新配置 HBase 去运行在伪分布式模式下。伪分布式模式意味着 HBase 仍然完全运行在一台主机上,但是每个 HBase 进程(HMasterHRegionServerZooKeeper)都是独立运行的进程。默认情况下,如果你没有按照 快速入门 中描述的那样去配置 hbase.rootdir 的属性,你的数据仍然会存储在 /tmp/ 中。在伪分布式模式的过程中中,我们会将你的数据存储在 HDFS 中,如果你的 HDFS 是可以使用的。你可以跳过 HDFS 配置而仍然将你的数据存储在本地的文件系统中。

注意

Hadoop 配置

此过程假定您在您的本地系统 和/或 远程系统已经配置好了 HadoopHDFS,并且它们都是正在运行的和可用的。它还假定您使用的是 Hadoop 2。下面这个文档 建立一个单节点集群Hadoop 文档中,是一个很好的起点。

1.停止 HBase 如果它正在运行着

如果你刚刚完成 快速开始 并且 HBase 仍然在运行着,停止它。此过程将创建一个全新的目录用于存放 HBase 的数据,所以之前你创建的所有数据都将丢失。

2.配置 HBase 

编辑配置文件 hbase-site.xml,首先添加以下的属性,它指定 HBase 以分布式模式运行,并且每个进程拥有一个 JVM 实例。

<property>
  <name>hbase.cluster.distributed</name>
  <value>true</value>
</property>

接下来,改变 hbase.rootdir  从本地的文件系统修改到你的 HDFS 实例地址,使用 hdfs:/// URI 语法,在这个例子中, HDFS 运行在本机的 8020 端口上。

<property>
  <name>hbase.rootdir</name>
  <value>hdfs://localhost:8020/hbase</value>
</property>

你不需要在 HDFS 上创建目录。 HBase 会自动为你生成的。如果你创建了目录,HBase 会尝试做数据迁移,这肯定不是你想要的结果。

3.启动 HBase

使用  bin/start-hbase.sh 命令启动 HBase。如果你的系统配置正确, jps 命令将会显示 HMasterHRegionServer 正在运行着。

4.在 HDFS 上检查 HBase 目录

如果一切顺利的话, HBase 会在 HDFS 上创建它的目录。在以上的配置中,它是存储在 HDFS/hbase/ 目录下。你可以使用 hadoop fs 命令在 Hadoopbin/ 目录下来列出这个目录。

$ ./bin/hadoop fs -ls /hbase
Found 7 items
drwxr-xr-x   - hbase users          0 2014-06-25 18:58 /hbase/.tmp
drwxr-xr-x   - hbase users          0 2014-06-25 21:49 /hbase/WALs
drwxr-xr-x   - hbase users          0 2014-06-25 18:48 /hbase/corrupt
drwxr-xr-x   - hbase users          0 2014-06-25 18:58 /hbase/data
-rw-r--r--   3 hbase users         42 2014-06-25 18:41 /hbase/hbase.id
-rw-r--r--   3 hbase users          7 2014-06-25 18:41 /hbase/hbase.version
drwxr-xr-x   - hbase users          0 2014-06-25 21:49 /hbase/oldWALs

5.创建一张表,并用数据填充它

你可以使用 HBase Shell 来创建一张表,并用数据填充它,扫描并从中获得值,使用和在 Shell 练习时相同的步骤。

6.启动和停止一个备用的 HBase MasterHMaster)服务

注意

在相同的硬件上运行多个 HMaster 实例,这在生产环境上是没有意义的。运行一个伪分布式集群对生产环境同样是没有意义的。这一步的目的只是为了提供测试和学习。

HMaster 控制着 HBase 集群。你可以启动到9个 HMaster 服务器,算上基础的 HMaster 服务器,一共是10个 HMaster 服务器。使用 local-master-backup.sh 去启动一个备用的 HMaster 服务。为每个你想要启动的备用 master 添加一个参数,代表端口设置。每个 HMaster 使用三个端口(默认情况下是16010,16020,16030)。这个端口设置加到这些端口,所以,使用 2 设置,备用 HMaster 的端口号就会使用端口 16012,16022,16032 。下面的命令启动了3个备用服务,使用 16012/16022/16032,16013/16023/1603316015/16025/16035

$ ./bin/local-master-backup.sh 2 3 5

为了杀死一个备用 master ,而不是杀死整个集群,你需要找到备用 master 的进程标识 IDPID)。这个 PID 被保存在文件名字类似于 /tmp/hbase-USER-X-master.pid 的文件中。这个文件的唯一内容就是  PID 。你可以使用 kill -9 命令来杀死这个 PID 所代表的进程。下面的命令会杀死端口设置为 1 的备用 master,而使集群仍然运行:

$ cat /tmp/hbase-testuser-1-master.pid |xargs kill -9

7.启动和停止额外的 RegionServers

HRegionServer 管理 StoreFiles 中的数据就像被 HMaster 管理一样。一般来说,集群的每个节点上运行一个 HRegionServer 。运行多个 HRegionServer 在一个系统上对于测试伪分布式模式是有帮助的。 local-regionservers.sh 命令允许你运行多个 RegionServers 。它和 local-master-backup.sh 命令的运行机制是类似的在为实例设置端口参数的方式上。每个 RegionServer 需要两个端口,默认端口是  1602016030 。但是额外的 RegionServer 的基础端口并不是默认的端口,因为默认的端口已经被 HMaster 占用了。在 1.0.0 版本的时候, HMaster 同样也是一个 RegionServer 。基础的端口用 1620016300 代替。你可以在一个服务器上运行 99 个额外的 RegionServer ,而不是一个 HMaster 或者 备用 HMaster 。下面的命令启动了 4 个额外的 RegionServers ,按顺序运行在 16202/16302 端口上(基础端口 16200/16300 加上 2 )。

$ .bin/local-regionservers.sh start 2 3 4 5

手动停止一个 RegionServer ,使用 local-regionservers.sh 命令带有 stop 参数和服务器设置去停止。

$ .bin/local-regionservers.sh stop 3

8.停止 HBase 

你可以像 快速开始 中那种方式停止 HBase ,使用 bin/stop-hbase.sh 命令。

高级 - 完全分布式

在现实中,你需要一个完全分布式的配置来充分测试 HBase 并在现实世界的场景中使用它。在一个分布式的配置中,集群包含多个节点,每个节点运行一个或多个 HBase 进程。这些进程包含基本的和备用的 Master 实例,多个 ZooKeeper 节点,和多个 RegionServer 节点。

这次高级的快速开始增加了2个节点到你的集群。该架构将如下:

Table 1. 分布式集群演示架构:

Node NameMasterZooKeeperRegionServer
node-a.example.comyesyesno
node-b.example.combackupyesyes
node-c.example.comnoyesyes

这次的快速开始假定每个节点是一个虚拟机,他们都处在同一个网络中。它是建立在之前的快速开始, 中级-伪分布式本地安装之上的,假设你在此过程中配置的系统在a节点。在你接下来的继续之前将a节点上的 HBase 停止。

注意

确保所有的节点都有完整的访问权限,并且在集群中没有防火墙规则可以阻止他们彼此访问。如果你看到如 no route to host 的任何错误,请检查您的防火墙。


步骤:无密码 SSH 访问配置
为了启动相应的进程,a 节点需要能够登录到 b 节点和 c 节点(和自己本身节点)。要做到这一点的最简单的方法就是在所有的主机上使用相同的 username ,并且配置 a 节点无密码登录到集群的其他节点。

1.在 a 节点上,生成一个秘钥对

当作为即将运行 HBase 的用户登录时,生成一个 SSH 秘钥对,使用下面的命令:

$ ssh-keygen -t rsa

如果命令执行成功,那么秘钥对的位置将打印到标准输出,公共秘钥的默认名称是 id_rsa.pub

2.在其他节点上创建将持有共享秘钥的目录

在 节点 b 和 节点 c ,作为 HBase 的用户登录,并在用户的主目录下创建一个 .ssh/ 目录,如果它不存在的话。如果它已经存在,要注意它可能已经包含了其他的秘钥了。

3.将公共秘钥复制到其他的节点

安全地从 节点a 将公共秘钥复制到其他节点,通过使用 scp 命令或者其他的安全方式。在每个其他的节点上,创建一个名称为 .ssh/authorized_keys 的新文件,如果它不存在的话,并且将 id_rsa.pub 文件中的内容附加到它的末尾。请注意,你也需要为 a节点 本身做这个事情。

$ cat id_rsa.pub >> ~/.ssh/authorized_keys

4.测试无密码登录

如果你的以上操作步骤正确执行的话,如果你使用 SSHa 节点 登录到任意一个集群中的其他节点,并且使用相同的 username ,你都不应该被提示需要输入密码。

5.由于 b 节点 将运行一个备份 Master ,重复上面的步骤,但是将所有你看到的 a 节点 替换成为 b 节点 ,但是一定不要覆盖现有的 .ssh/authorized_keys 文件,但是追加新的秘钥到已有的文件中,使用 >> 操作符,而不是 > 操作符。


步骤:准备 a节点

a 节点 将运行你的主 masterZooKeeper 进程,但是不运行 RegionServer 。启动 a 节点 ,但是停止 a 节点上的 RegionServer

1.编辑 conf/regionservers 文件,并且删除包含 localhost 的一行,添加 b节点 和 c节点 包含 hostnameIP 地址的行。

即使你确实想在 a 节点 上运行一个 RegionServer ,你应该指定它的 hostname 用以其他使用去与之通信。在这个案例中,这将是 node-a.example.com 。这使您可以将配置分布式发送到您集群的任何一个存在 hostname 冲突的节点上。保存文件。

2.配置 HBase 使用 b节点 作为一个备用的 master 

conf/ 目录下创建名为 backup-masters 的新文件,并添加带有 b节点 的 hostname 的新的一行。在这个演示实例中,这个 hostname 是 node-b.example.com 。

3.配置 ZooKeeper 

在现实中,您应该谨慎考虑您的 ZooKeeper 配置。你可以找到更多关于 ZooKeeper 配置的知识在 zookeeper ,这个配置将指导 HBase 启动并且在集群的每个节点中管理一个 ZooKeeper 实例。

a 节点 编辑 conf/hbase-site.xml 文件,并添加以下属性:

<property>
  <name>hbase.zookeeper.quorum</name>
  <value>node-a.example.com,node-b.example.com,node-c.example.com</value>
</property>
<property>
  <name>hbase.zookeeper.property.dataDir</name>
  <value>/usr/local/zookeeper</value>
</property>

4.在你的配置中的所有 将 a节点 指定为 localhost 的地方,改变这个引用指向其他节点会用来指代 a节点 的 hostname 。在这个例子中, hostname 是 node-a.example.com 。

 

步骤:准备 b节点 和 c节点

1.确保 HBase 没有在任何一个节点上运行

如果您忘了从以前测试中停止 HBase ,你将会遇到错误。使用 jps 命令来检查是否 HBase 在集群中的其中一个节点上运行。查找进程 HMaster , HRegionServer 和 HQuorumPeer 。如果这些进程存活着,那么就杀死他们。

2.启动集群

a 节点,发出 start-hbase.sh 命令,你的输出将类似于下面这样。

$ bin/start-hbase.sh
node-c.example.com: starting zookeeper, logging to /home/hbuser/hbase-0.98.3-hadoop2/bin/../logs/hbase-hbuser-zookeeper-node-c.example.com.out
node-a.example.com: starting zookeeper, logging to /home/hbuser/hbase-0.98.3-hadoop2/bin/../logs/hbase-hbuser-zookeeper-node-a.example.com.out
node-b.example.com: starting zookeeper, logging to /home/hbuser/hbase-0.98.3-hadoop2/bin/../logs/hbase-hbuser-zookeeper-node-b.example.com.out
starting master, logging to /home/hbuser/hbase-0.98.3-hadoop2/bin/../logs/hbase-hbuser-master-node-a.example.com.out
node-c.example.com: starting regionserver, logging to /home/hbuser/hbase-0.98.3-hadoop2/bin/../logs/hbase-hbuser-regionserver-node-c.example.com.out
node-b.example.com: starting regionserver, logging to /home/hbuser/hbase-0.98.3-hadoop2/bin/../logs/hbase-hbuser-regionserver-node-b.example.com.out
node-b.example.com: starting master, logging to /home/hbuser/hbase-0.98.3-hadoop2/bin/../logs/hbase-hbuser-master-nodeb.example.com.out

ZooKeeper 首先启动,紧接着是 master ,然后是 RegionServer ,最后是 备用 master

3.验证进程正在运行

在集群的每个节点,运行 jps 命令并验证在每个服务器上正在运行着正确的进程。您可能会看到额外的 Java 进程在你的服务器上运行,如果它们被用作其他的目的。

Example 3. a节点 jps 输出

$ jps
20355 Jps
20071 HQuorumPeer
20137 HMaster

Example 4. b节点 jps 输出

$ jps
15930 HRegionServer
16194 Jps
15838 HQuorumPeer
16010 HMaster

Example 5. c节点 jps 输出

$ jps
13901 Jps
13639 HQuorumPeer
13737 HRegionServer

注意

ZooKeeper 进程名称

这个 HQuorumPeer 进程是被 HBase 控制和启动的一个 ZooKeeper 实例。如果你用这种方式使用 ZooKeeperZooKeeper 会被限制每个集群节点只能有一个实例,并且只适用于测试。如果 ZooKeeperHBase 之外运行,这个进程就叫做 QuorumPeer 。欲了解更多关于 ZooKeeper 的配置,包括使用一个 HBase 外部的 ZooKeeper 实例,查看 zookeeper

4.在 Web UI 中浏览

注意

Web UI 端口改变了

Web UI 端口改变了

在比 HBase 0.98.x 版本更新的版本中, HBase Web UIHTTP 端口从之前的 Master 端口为 60010 和每个 RegionServer 端口为 60030 改为了 Master 端口为 16010RegionServer 端口为 16030

如果一切设置正确,你应该可以连接到 Master Web UI 上 http://node-a.example.com:16010 或者备用 master http://node-b.example.com:16010 ,使用浏览器。如果你可以通过 localhost 连接,但是不能通过从其他的主机连接,请检查你的防火墙规则。你可以在 Web UI 上查看每个 RegionServer 在端口 16030 上,通过他们的 IP 地址或者是通过点击他们在 Master 上的链接来访问他们。

5.测试当节点或者服务消失时会发生什么

有了像您配置的三个节点的集群,事情不会是非常有弹性的。不过,你可以测试当主 Master 或者一个 RegionServer 消失后会发生什么,通过杀掉这些进程并且查看 log 日志。

下一步该做什么

下一章节,配置,提供了更多有关建立分布式 HBase 集群的 HBase 不同的运行模式, HBase 运行的系统需求,和关键配置区域的信息。