Getting Started
1. Introduction
Quickstart 将先介绍如何部署单HBase实例至单节点上。
2. Quick Start – Standalone HBase
2.1. JDK Version Requirements
运行HBase需要先安装JDK,关于所支持的JDK版本的信息,请参阅 Java 。
2.2. Get Started with HBase
过程:下载、配置、已Standalone模式启动HBase
从Apache Download Mirrors列表中选择一个下载站点, 单击顶部推荐的站点链接,将跳转到HBase Releases的镜像页面,单击名为stable的文件夹,然后将以.tar.gz结尾的二进制文件下载到本地文件系统,暂时不要立即下载以src.tar.gz结尾的文件。
将下载的文件进行解压缩,cd到安装路径下
$ 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
开头的行,并将其设置为正确的jdk安装目录,应将JAVA_HOME
变量设置为包含可执行文件bin/java
的目录。大多数现代Linux操作系统都提供了一种机制,例如RHEL或CentOS上的/usr/bin/alternatives,用于透明地在不同版本可执行文件间进行切换,在这种情况下,您可以将JAVA_HOME
设置为包含bin/java的符号链接的目录,通常为/usr。
JAVA_HOME=/usr
- 编辑conf/hbase-site.xml,这个是HBase主要的配置文件,您需要为HBase和ZooKeeper指定本地文件系统上的路径,用于写入数据,如果不配置,默认为在/tmp下创建一个新目录,许多服务器配置为在重启时删除/tmp下的内容,因此应该将数据存储在其他路径。如下配置,将HBase的数据存储在hbase目录下,该目录位于名为
testuser
的用户的home目录下,将<property>
粘贴在<configuration>
下面,新安装的HBase该节点下默认无元素。
示例 1. Example hbase-site.xml for 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
指向了本地文件系统中的路径,file://
前缀用于标识本地文件系统,您应该将配置示例中WARNING部分牢记于心。在standalone模式下,HBase利用了Apache Hadoop project本地文件系统抽象,本地文件系统无法为HBase安全运行提供持续性保证,只适用于本地开发和测试用例,这样集群故障的成本能得到很好的控制,但不适合生产部署,极有可能会导致丢失数据。
在现有的HDFS实例上安装HBase,将hbase.rootdir
设置为指向实例的路径:e.g. hdfs://namenode.example.org:8020/hbase,有关此变体的更多信息,请参阅下面有关运行Standalone HBase于HDFS的部分。
bin/start-hbase.sh脚本提供启动HBase的快捷方式,启动命令,如果一切顺利,将在标准输出中显示HBase已成功启动。可以使用jps
命令验证是否有一个名为HMaster
的进程正在运行,在standalone模式下,HBase将所有守护进程运行于一个JVM进程,包括HMaster,一个HRegionServer和ZooKeeper,通过http://localhost:16010即可访问HBase Web UI。
note: 需要安装Java并可用,如果有错误消息提示未安装Java,但系统又安装了java(可能位于非标准位置),编辑conf/hbase-env.sh文件并修改JAVA_HOME,指向包含bin/java的路径。
过程:首次使用HBase
Connect to HBase.
Connect to your running instance of HBase using the hbase shell command, located in the bin/ directory of your HBase install. In this example, some usage and version information that is printed when you start HBase Shell has been omitted. The HBase Shell prompt ends with a > character.
1、连接到HBase。
使用位于HBase安装目录bin/下的hbase shell命令连接到正在运行的HBase实例,在此示例中,省略了启动HBase Shell时打印的用法和版本信息,HBase Shell提示符以>字符结尾。
$ ./bin/hbase shell
hbase(main):001:0>
2、显示HBase Shell帮助文档.
输入help并按Enter,显示HBase Shell的一些基本用法信息,以及几个示例命令。请注意,表名,行,列都必须用引号括起来。
3、创建一张表。
使用create
命令创建新表,必须指定表名和ColumnFamily名称。
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"]
使用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
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
我们每次插入一个值,总共插入三个值,第一个insert 位于row1、列cf:a,值为value1。HBase中的列由列族前缀组成,此示例中为cf,后跟冒号,然后是列限定符后缀,本例中为a.
6、一次扫描表格中的所有数据
从HBase获取数据的一种方法是扫描,使用scan
命令扫描表中的数据,可以以limit方式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一张表.
如果要删除表或修改表配置,以及在某些其他情况下,需要先使用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
9、删除表.
使用drop命令删除表
hbase(main):010:0> disable 'test'
0 row(s) in 1.1820 seconds
hbase(main):011:0> drop 'test'
0 row(s) in 0.1370 seconds
10、退出HBase Shell.
使用quit命令退出HBase Shell并断开与群集的连接。HBase实例仍然在后台运行
过程:关闭HBase
bin/start-hbase.sh脚本快捷地启动所有HBase守护进程,对应地,bin/stop-hbase.sh脚本关闭这些进程。
$ ./bin/stop-hbase.sh
stopping hbase....................
命令执行后,进程可能需要花几分钟才能完全关闭,使用jps
确保关闭了HMaster和HRegionServer进程。
上面已经展示了如何启动和停止HBase的standalone实例。在接下来的部分,我们将简要概述其他hbase部署模式。
2.3 伪分布式本地安装
伪分布模式意味着HBase仍然在单个主机上运行,但每个HBase守护程序(HMaster,HRegionServer和ZooKeeper)作为单独的进程运行,在standalone模式下,所有守护进程都运行在一个jvm实例中。默认情况下,除非按照快速入门中的说明配置了hbase.rootdir属性,否则数据仍存储在/tmp/路径下。在本演练中,我们将数据存储在HDFS中,您可以跳过HDFS配置以继续将数据存储在本地文件系统中。
Hadoop配置
此过程假定您已在本地系统和/或远程系统上已安装配置了Hadoop和HDFS,并且它们正在运行且可用,还假设您正在使用Hadoop 2.x,Hadoop文档中Setting up a Single Node Cluster指南可以提供相关安装配置指导信息。
关闭HBase.
如果HBase在运行,请将其停止。此过程将创建一个全新的目录用于HBase存储数据,因此您之前创建的任何数据库都将丢失。配置HBase.
编辑hbase-site.xml文件,首先,添加以下属性,该属性指示HBase以分布式模式运行,每个守护进程运行于独立的JVM实例。<property> <name>hbase.cluster.distributed</name> <value>true</value> </property>
接下来,使用hdfs:////
URI语法将hbase.rootdir
路径由本地文件系统更改为HDFS实例的地址。在此示例中,HDFS在运行于localhost的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</pre>
创建一张表并用数据填充它.
可以使用HBase Shell创建表,用数据填充表,扫描并从中获取数据,参照如 shell exercises。启动和停止一个备份HBase Master(HMaster)server
在生产环境中同一硬件上运行多个HMaster实例没有意义,就像运行伪分布式集群对生产没有意义一样。此步骤仅用于测试和学习目的。
HMaster server控制整个HBase集群。可以启动最多9个HMaster备实例,加上主HMaser,总共就可以有10个HMaster实例。要启动HMaster备实例,使用 local-master-backup.sh
。对于要启动的每个HMaster备实例,添加一个表示该HMaster备实例端口偏移量的参数,每个HMaster要用到两个端口(默认16000和16010),将端口偏移量与默认端口号相加得到备实例真正端口号,所以如使用偏移量2,HMaster备实例将使用端口16002和16012.以下示例命令,分别使用端口16002/16012,16003/16013和16005/16015启动3个备实例。
$ ./bin/local-master-backup.sh start 2 3 5
要在不kill整个群集的情况下kill掉HMaster备实例,需要找到它的进程号(PID)。PID存储在名为/tmp/hbase-USER-X-master.pid的文件中。该文件的唯一内容是PID。可以使用kill -9命令终止该PID。以下命令将终止端口偏移量为1的HMaster备实例,但集群仍能运行:
$ cat /tmp/hbase-testuser-1-master.pid |xargs kill -9
- 启动和停止额外的RegionServers
HRegionServer按照HMaster的指令管理其StoreFiles中的数据。通常,集群中每个HRegionServer运行于一个独立节点。在同节点上运行多个HRegionServers,在伪分布式模式下的进行测试是非常有用。local-regionservers.sh
命令允许您运行多个RegionServers,它的工作方式与local-master-backup.sh命令很类似,脚本每个入参都代表实例的端口偏移量。每个RegionServer需要两个端口,默认端口为16020和16030.自1.1.0版本起,HMaster不再使用region server端口,这将留下10个端口(16020到16029和16030到16039)给RegionServers。要支持额外更多的RegionServers,请在运行local-regionservers.sh
脚本前将环境变量HBASE_RS_BASE_PORT
和HBASE_RS_INFO_BASE_PORT
设置为适当的值。例如设置base端口分别为16200和16300,在单服务器上,可以支持额外99个RegionServers。以下命令启动四个额外RegionServers,以16022/16032端口号(base端口16020/16030加2)开始、顺序递增的端口上运行
$ .bin/local-regionservers.sh start 2 3 4 5
要手动停止RegionServer,请运行local-regionservers.sh
命令,并传入stop
参数和要停止的服务器的偏移量
$ .bin/local-regionservers.sh stop 3
- Stop HBase.
您可以使用bin/stop-hbase.sh命令停止HBase。
2.4. 高级篇-分布式
实际上,您需要一个完全分布式的配置来测试HBase并在真实场景中使用它。 在分布式配置中,群集包含多个节点,每个节点运行一个或多个HBase守护进程。这些包括主和备Master实例,多个ZooKeeper节点和多个RegionServer节点。
此高级篇快速入门中,群集新增加了两个节点。 架构如下:
Table 1. Distributed Cluster Demo Architecture
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 |
本入门假定每个节点都是虚拟机,并且它们都在同一网络上,它建立在之前快速入门伪分布式本地安装的基础上,假设您在该过程中配置的节点现在是node-a
,在继续之前先停止node-a
上的HBase。
确保所有节点都具有完全的通信访问权限,并且没有防火墙规则阻止它们间相互通信。如果您发现任何错误,例如无主机路由,请检查您的防火墙。
过程:配置无密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用户身份登录,并在用户home目录下创建一个.ssh/目录(如果该目录尚不存在)。 如果它已存在,请注意它可能已包含其他秘钥。将公钥复制到其他节点.
通过使用scp或其他一些安全方法,将公钥从node-a
安全地复制到其他每个节点,在其他每个节点上,创建一个名为.ssh/authorized_keys的新文件(如果该文件尚不存在),并将id_rsa.pub文件的内容追加到其末尾。 请注意,您还需要为node-a
本身执行此操作。
$ cat id_rsa.pub >> ~/.ssh/authorized_keys
- 测试无密登录.
如果您正确执行了上述过程,则当您使用相同的用户名从node-a
SSH到其他任一节点时,不会提示您输入密码 - 由于
node-b
将运行Master备实例,在node-b
重复上面的过程,在node-a
的任何地方替换node-b
为即可,请确保不要覆盖现有的.ssh/authorized_keys文件,使用>>运算符而不是>运算符将新密钥追加到现有文件。