贡献者:xixici
1. 介绍
快速开始 会介绍如何运行一个单机版的 Standalone 模式 HBase.
本章节介绍了在单机安装 HBase 的方法。会引导你通过hbase shell
创建一个表,插入一行,然后执行 put 和 scan 指令,开启和关闭这张表,开启和停止 HBase。只要 10 分钟就可以完成以下的操作。
除了下载 HBase 外,此过程不到 10 分钟就能完成。
HBase 要求安装 JDK。有关支持 JDK 版本的信息,请参阅Java。
-
选择一个[Apache 下载镜像](https://www.apache.org/dyn/closer.lua/hbase/)。 建议点击顶部链接,进入 HBase Releases 点击 stable 的文件夹,然后下载将以 tar.gz 结尾的二进制文件到本地。暂时不要下载以 src.tar.gz 结尾的文件。
-
解压缩,然后进入到那个要解压的目录.
$ tar xzvf hbase-3.0.0-SNAPSHOT-bin.tar.gz $ cd hbase-3.0.0-SNAPSHOT/
-
在启动 HBase 之前,您需要设置
JAVA_HOME
环境变量。您可以通过操作系统的常用设置来设置变量,HBase 也提供了一个中心机制 conf/hbase-env.sh。编辑此文件,取消注释以JAVA_HOME
开头的行,并将其设置为适合您的操作系统的路径。应将JAVA_HOME
变量设置为包含可执行文件 bin/java 的目录。如今,大多数 Linux 操作系统都提供了一种机制,例如 RHEL 或 CentOS 上的/usr/bin/alternatives,可以方便切换环境。在这种情况下,您可以将JAVA_HOME
设置为包含 bin/java 的符号链接的目录,通常为 /usr。JAVA_HOME=/usr
-
编辑 HBase 主配置文件 conf/hbase-site.xml. 此时,您需要在本地文件系统上指定 HBase 和 ZooKeeper 数据存储目录,并知晓一些风险。默认情况下,HBase 会在/tmp 下创建一个新目录,但是许多服务为在重新启动时会删除 /tmp 的内容,因此您需要将数据存储在其他位置。以下配置文件处在 hbase,名为
testuser
的用户的主目录中。首次安装 HBase 为空,可以将<property>
标记粘贴在<configuration>
内。示例 1. hbase-site.xml Standalone HBase 配置
<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> <property> <name>hbase.unsafe.stream.capability.enforce</name> <value>false</value> <description> Controls whether HBase will check for stream capabilities (hflush/hsync). Disable this if you intend to run on LocalFileSystem, denoted by a rootdir with the 'file://' scheme, but be mindful of the NOTE below. WARNING: Setting this to false blinds you to potential data loss and inconsistent system state in the event of process and/or node failures. If HBase is complaining of an inability to use hsync or hflush it's most likely not a false positive. </description> </property> </configuration>
您不需要创建 HBase 数据目录。 HBase 会自动创建。如果您想要自定义创建目录,HBase 将尝试进行迁移 。
上例中的 hbase.rootdir 指向 local filesystem 中的目录。 'file://'前缀是表示本地文件系。您应该将配置示例中的警告牢记在心。在 Standalone 模式下,HBase 利用 Apache Hadoopd 的本地文件存储。但是这种方式并不能保证 HBase 运行的持久性。这只是适用于于本地开发和测试用例,可以很好的控制集群故障的成本。它不适合生产部署,否则你会丢失数据。
为在 HDFS 上部署 HBase, 可以将 hbase.rootdir 指向如: hdfs://namenode.example.org:8020/hbase. 有关此变量的更多用法,可查看章节基于 HDFS 部署 Standalone HBase.
-
脚本 bin/start-hbase.sh 为启动 HBase 提供了方便的途径。执行命令,在标准输出的日志里可以看到 HBase 启动成功的消息。你可以使用
jps
命令来确认你有一个正在运行的进行HMaster
。在 HBase 的 Standalone 模式中,所有的服务都运行在同一 JVM 中,如 HMaster,单例的 HRegionServer 和 ZooKeeper 的守护进程。可以前往 Web UI_http://localhost:16010_ 查看 HBase.Java 必须安装且可用. 如果你收到错误提示,Java 未安装,可能 java 位于非标准位置,你可以编辑 conf/hbase-env.sh ,修改
JAVA_HOME
路径,并确保包含 bin/java.
-
连接 HBase
在 HBase 安装目录 bin/ 目录下使用
hbase shell
命令连接正在运行的 HBase 实例。 在下面这个例子中,当你启动 HBase Shell 并忽略一些用法和版本信息后,HBase Shell 是以字符>
结尾。$ ./bin/hbase shell hbase(main):001:0>
-
预览 HBase Shell 的帮助文本
输入
help
并回车, 可以看到 HBase Shell 的基本信息和一些示例命令.请注意,表名,行,列都必须用引号字符括起来。 -
创建表
使用
create
创建一个表,你必须执行一个表名和列族名。hbase(main):001:0> create 'test', 'cf' 0 row(s) in 0.4170 seconds => Hbase::Table - test
-
表信息
使用
list
查看存在表hbase(main):002:0> list 'test' TABLE test 1 row(s) in 0.0180 seconds => ["test"]
使用
describe
查看表细节及配置hbase(main):003:0> describe 'test' Table test is ENABLED test COLUMN FAMILIES DESCRIPTION {NAME => 'cf', VERSIONS => '1', EVICT_BLOCKS_ON_CLOSE => 'false', NEW_VERSION_BEHAVIOR => 'false', KEEP_DELETED_CELLS => 'FALSE', CACHE_DATA_ON_WRITE => 'false', DATA_BLOCK_ENCODING => 'NONE', TTL => 'FOREVER', MIN_VERSIONS => '0', REPLICATION_SCOPE => '0', BLOOMFILTER => 'ROW', CACHE_INDEX_ON_WRITE => 'f alse', IN_MEMORY => 'false', CACHE_BLOOMS_ON_WRITE => 'false', PREFETCH_BLOCKS_ON_OPEN => 'false', COMPRESSION => 'NONE', BLOCKCACHE => 'true', BLOCKSIZE => '65536'} 1 row(s) Took 0.9998 seconds
-
插入数据
使用
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
在这里,我们往
test
表中依次插入了三条数据。首先插入了一条 rowkey 为row1
、列为cf:a
、值为value1
的数据。HBase 中的列是包含列族前缀的,在这个例子中,冒号前的为列cf
,冒号后的为列限定符a
。 -
扫描全部数据
从 HBase 获取数据的途径之一就是
scan
。使用 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
-
获取一条数据
使用
get
命令一次获取一条数据。hbase(main):007:0> get 'test', 'row1' COLUMN CELL cf:a timestamp=1421762485768, value=value1 1 row(s) in 0.0350 seconds
-
禁用表
如果你想删除一个表或者改变表的设置,以及一些其他的场景,首先你需要使用
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
Disable the table again if you tested the
enable
command above:hbase(main):010:0> disable 'test' 0 row(s) in 1.1820 seconds
-
删除表
使用
drop
命令删除一个表。hbase(main):011:0> drop 'test' 0 row(s) in 0.1370 seconds
-
退出 HBase Shell.
使用
quit
命令退出命令行并从集群断开连接。HBase 仍然在后台运行。
-
脚本 bin/start-hbase.sh 这个脚本提供了便利的启动所有 HBase 服务,同样地, bin/stop-hbase.sh 脚本用来停止所有 HBase 服务。
$ ./bin/stop-hbase.sh stopping hbase.................... $
-
在使用这个命令后,它可能需要过几分钟才能停掉服务进程。可以使用
jps
确认 HMaster 和 HRegionServer 进程是否关闭。
上面已经向您展示了如何启动和停止 HBase 的 Standalone 实例。在下一节中,我们将简要介绍 HBase 其他部署模式。
在快速开始小节部署了 Standalone 模式的 HBase 后,您可以重新配置以伪分布式运行。伪分布模式意味着 HBase 仍然在单个主机上完全运行,但是每个 HBase 守护进程(HMaster,HRegionServer 和 ZooKeeper)作为一个单独的进程运行:在独立模式下,所有守护进程都运行在一个 jvm 进程/实例中。 默认情况下, 除非你按 快速开始更改hbase.rootdir
的配置,否则你的数据仍会存储在 /tmp/ 中。假设 HDFS 系统可用,我们将数据存储在 HDFS 上。 当然,您可以跳过 HDFS 配置,继续使用本地文件系统。
Hadoop 配置
此过程假定已在本地系统或远程系统上配置 Hadoop 和 HDFS,并且保证正在运行且可用,版本为 Hadoop 2。Hadoop 文档向导 配置单节点集群.
-
停止 HBase
假设你刚刚完成 快速开始 , Hbase 正在运行, 那么请停止他.这个过程将创建一个全新的目录,HBase 将存储它的数据,所以你之前创建的任何数据库都将丢失。
-
配置 HBase
编辑 hbase-site.xml . 首先,添加以下指示 HBase 以分布式模式运行的属性,每个守护进程有一个 JVM 实例
<property> <name>hbase.cluster.distributed</name> <value>true</value> </property>
接下来,将
hbase.rootdir
从本地文件系统更改为您的 HDFS 实例的地址,使用hdfs:////
的 URI 语法。在这个例子中,HDFS 在端口 8020\的本地主机上运行。并确保hbase.unsafe.stream.capability.enforce
删除或为 true.<property> <name>hbase.rootdir</name> <value>hdfs://localhost:8020/hbase</value> </property>
您不需要在 HDFS 中创建目录。HBase 会为你做这个。如果你要更改目录,HBase 会试图迁移。
-
启动 HBase
使用 bin/start-hbase.sh 启动 HBase. 如果您的系统配置正确,该
jps
命令应显示 HMaster 和 HRegionServer 进程正在运行。 -
检查 HDFS 中的 HBase 目录
如果一切正常,HBase 在 HDFS 中创建它的目录。在上面的配置中,它存储在 HDFS 上的 /hbase/ 中。您可以使用 hadoop 的 bin/ 目录中的
hadoop fs
命令来列出此目录。$ ./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
-
创建一个表并使用数据填充它
您可以使用 HBase Shell 创建一个表,使用数据填充它,使用与shell 练习中相同的步骤。
-
启动和停止备份 HBase 主(HMaster)服务器
在同一个硬件上运行多个 HMaster 实例在生产环境中是没有意义的,就像运行伪分布式集群对于生产没有意义一样。此步骤仅供测试和学习之用。
HMaster 服务器控制 HBase 集群。你可以启动最多 9 个备份 HMaster 服务器,这个服务器总共有 10 个 HMaster 计算主服务器。使用
local-master-backup.sh
启动备份 HMaster。对于要启动的每个备份主节点,请添加一个表示该主节点的端口偏移量的参数。每个 HMaster 使用三个端口(默认情况下为 16010,16020 和 16030)。端口偏移量 2 添加到这些端口,那么备份 HMaster 将使用端口 16012,16022 和 16032。以下命令启动服务器端口为:16012/16022/16032,16013/16023/16033 和 16015/16025/16035$ ./bin/local-master-backup.sh start 2 3 5
要在不杀死整个群集的情况下杀死备份主机,则需要查找其进程 ID(PID)。PID 存储在一个名为 /tmp/hbase-USER-X-master.pid 的文件中。该文件的唯一内容是 PID。您可以使用该
kill -9
命令来杀死该 PID。以下命令将终止具有端口偏移 1 的主服务器,但保持群集正在运行:$ cat /tmp/hbase-testuser-1-master.pid |xargs kill -9
-
启动和停止其他 RegionServers
HRegionServer 按照 HMaster 的配置管理 StoreFiles 中的数据。通常,一个 HRegionServer 在集群中的每个节点上运行。在同一个系统上运行多个 HRegionServers 对于伪分布式模式下的测试非常有用。该
local-regionservers.sh
命令允许您运行多个 RegionServer。它以类似的local-master-backup.sh
命令的方式工作,因为您提供的每个参数都代表实例的端口偏移量。每个 RegionServer 需要两个端口,默认端口是 16020 和 16030。但是,由于 HMaster 使用默认端口,所以其他 RegionServers 的基本端口不是默认端口,而 HMaster 自从 HBase 版本 1.1.0 以来也是 RegionServer。基本端口是 16200 和 16300。您可以在服务器上运行另外 99 个不是 HMaster 或备份 HMaster 的 RegionServer。以下命令将启动另外四个 RegionServers,它们在从 16202/16302(基本端口 16200/16300 加 2)开始的顺序端口上运行 HBase 从版本 1.1.0 开始, HMaster 不使用 region server 端口, 而为 RegionServers 预留了 10 个端口 (16020 to 16029 and 16030 to 16039). 为支持添加 RegionServers, 在启动local-regionservers.sh
之前,需设置 HBASE_RS_BASE_PORT 和 HBASE_RS_INFO_BASE_PORT.例如, 使用基本端口 16200 和 16300。也可以使用另外 99 个端口。 以下命令将启动另外四个 RegionServers,它们在从 16202/16302(基本端口 16200/16300 加 2)开始的顺序端口上运行。$ .bin/local-regionservers.sh start 2 3 4 5
要手动停止 RegionServer,请使用带有
stop
参数和服务器偏移量的local-regionservers.sh
命令停止。$ .bin/local-regionservers.sh stop 3
-
停止 HBase
您可以使用 bin/stop-hbase.sh 命令以与快速开始过程相同的方式停止 HBase 。
实际上,您需要一个完全分布式的配置来全面测试 HBase,并将其用于实际场景中。在分布式配置中,集群包含多个节点,每个节点运行一个或多个 HBase 守护进程。这些包括主要和备份主实例,多个 ZooKeeper 节点和多个 RegionServer 节点。
此高级快速入门将两个以上的节点添加到您的群集。架构如下:
Node Name | Master | ZooKeeper | RegionServer |
---|---|---|---|
node-a.example.com | yes | yes | no |
node-b.example.com | backup | yes | yes |
node-c.example.com | no | yes | yes |
这个快速入门假定每个节点都是虚拟机,并且它们都在同一个网络上。它基于之前的快速入门、本地和伪分布式 HBase,假设您在该过程中配置的系统是现在node-a
。继续之前,在node-a
停止 HBase 。
请确保所有节点都具有完全的通信访问权限,并且没有任何防火墙规则可以阻止。如果您看到任何错误,如
no route to host
,请检查您的防火墙设置。
过程: 配置无密码 SSH 访问
node-a
需要能够登录node-b
和node-c
(包含自己)才能启动守护进程。实现这一点的最简单的方法是在所有主机上使用相同的用户名,并配置node-a
到其他的无密码的 SSH 登录
-
在
node-a
,生成一个密钥对以运行 HBase 的用户身份登录时,使用以下命令生成 SSH 密钥对:
$ ssh-keygen -t rsa
如果命令成功,密钥对的位置将打印到标准输出。公钥的默认名称是 id_rsa.pub.
-
创建并共享密钥的目录
在
node-b
和上node-c
,以 HBase 用户身份登录,并在用户主目录中创建一个 .ssh/ 目录(如果尚不存在)。如果它已经存在,请注意它可能已经包含其他值。 -
将公钥复制到其他节点
通过使用 scp 或其他一些安全的手段,安全地将公钥从
node-a
复制到每个节点。在其他每个节点上,创建一个名为 .ssh/authorized_keys 的新文件(如果该文件尚不存在),并将 id_rsa.pub 文件的内容附加到该文件的末尾。请注意,你也需要为node-a
本身执行此项。$ cat id_rsa.pub >> ~/.ssh/authorized_keys
-
测试无密码登录
确保过程正确,可以以相同用户名从
node-a
无密码登录其他节点. -
由于
node-b
是备份主节点, 重复上述步骤,将node-a
替换为node-b
.确保不会覆盖现有的 .ssh/authorized_keys 文件, 可以使用>>
运算符而不是>
运算符将新密钥添加到文件末尾。
过程: 准备 node-a
node-a
是主节点和 ZooKeeper 进程节点,而不是 RegionServers 服务. 首先停止node-a
RegionServers 服务
-
编辑 conf/regionservers 移除包含
localhost
的列. 添加node-b
和node-c
的主机名和 IP.即使你非要在
node-a
上运行 regionserver, 你应该配置主机名. 演示中为node-a.example.com
.确保您能够将配置分发到集群的每个节点上并无任何主机名冲突。保存文件。 -
配置 HBase,将
node-b
作为备份主节点在 conf/ 目录创建 backup-masters 添加新的一行主机名为
node-b
. 演示中主机名为node-b.example.com
. -
配置 ZooKeeper
实际上,你应该仔细考虑你的 ZooKeeper 配置。您可以在zookeeper部分找到更多关于配置 ZooKeeper 的信息。这个配置将指示 HBase 在集群的每个节点上启动和管理一个 ZooKeeper 实例。在
node-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>
-
在您的配置中,您已经将
node-a
作为localhost
引用,将引用改为指向其他节点用来引用node-a
的主机名。在这些例子中,主机名是node-a.example.com
过程: 准备 node-b
和 node-c
node-b
将运行一个备份主服务器和一个 ZooKeeper 实例。
-
下载并解压 HBase
将 HBase 下载并解压到
node-b
,就像您为独立和伪分布式快速入门所操作的一样。 -
将配置文件从
node-a
复制到node-b
和node-c
的群集的每个节点都需要具有相同的配置信息。将 conf/ 目录下的内容复制到
node-b
和node-c
上的 conf/ 目录中。
过程: 启动并测试群集
-
确保 HBase 没有在任何节点上运行
如果您在之前的测试中忘记停止 HBase,您将会遇到错误。通过使用该
jps
命令检查 HBase 是否在任何节点上运行。寻HMaster
,HRegionServer
和HQuorumPeer
的进程。如果他们存在,杀掉他们 -
启动集群
在
node-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,然后是 RegionServers,最后是 backup masters。
-
验证进程是否正在运行
在集群的每个节点上,运行该
jps
命令并验证每台服务器上是否运行了正确的进程。如果用于其他用途,您可能会看到在您的服务器上运行的其他 Java 进程。node-a
jps
输出$ jps 20355 Jps 20071 HQuorumPeer 20137 HMaster
node-b
jps
输出$ jps 15930 HRegionServer 16194 Jps 15838 HQuorumPeer 16010 HMaster
node-c
jps
输出$ jps 13901 Jps 13639 HQuorumPeer 13737 HRegionServer
ZooKeeper 进程名称
进程
HQuorumPeer
是一个由 HBase 控制和启动的 ZooKeeper 实例.如果以这种方式使用 ZooKeeper,则每个群集节点仅限于一个实例,并且仅适用于测试。如果 ZooKeeper 在 HBase 之外运行,则调用该进程 QuorumPeer。更多请查看章节 zookeeper . -
Web UI.
Web UI 接口更改
在 HBase 0.98.x 以上, HBase Web UI 的端口从主节点的 60010 和 RegionServer 的 60030 变化为 16010 和 16030
如果一切设置正确,您应该能够使用 Web 浏览器连接到 Master
[http://node-a.example.com:16010/](http://node-a.example.com:16010/)
或 Secondary Master 的 UI[http://node-b.example.com:16010/](http://node-b.example.com:16010/)
。如果您可以通过localhost
而不是从另一台主机连接,请检查您的防火墙规则。您可以在端口 16030 的 IP 地址中查看每个 RegionServers 的 Web UI,也可以通过单击 Master 的 Web UI 中的链接来查看。 -
测试节点或服务消失时会发生什么
在配置了三节点集群后,集群并不会很有弹性。您仍然可以通过关闭进程并查看日志来测试主 Master 或 RegionServer 的行为。
下一章节 configuration, 提供有关不同的 HBase 运行模式、运行 HBase 的系统要求以及分布式 HBase 群集的关键配置的详细信息。