基本操作
- 首先确保已经安装Java。通过
java -version
命令查看,要求版本1.7以上。 - 下载hbase: http://www.apache.org/dyn/closer.cgi/hbase/
- 将下载来的压缩包解压
配上数据储存目录,编辑文件conf/hbase-site.xml
<configuration>
<property>
<name>hbase.rootdir</name>
<value>file:///home/yourusername/hbase/data</value>
</property>
</configuration>
启动HBase。命令为:bin/start-hbase.sh
。命令执行后HBase将在后台运行。
进入操作终端。bin/hbase shell
,通过status
命令可以查看服务状态。
创建表:create 'hello_table','hello_family'
,得到的结果为0 row(s) in 1.2280 seconds
添加数据:
put 'hello_table','id-1','hello_family:name','Alice'
put 'hello_table','id-1','hello_family:age','23'
put 'hello_table','id-2','hello_family:name','Bob'
put 'hello_table','id-2','hello_family:age','24'
以上命令创建了这样的表:
id | name | age |
---|---|---|
id-1 | Alice | 23 |
id-2 | Bob | 24 |
扫描数据:scan 'hello_table'
,得到的结果如下:
ROW COLUMN+CELL
id-1 column=hello_family:age, timestamp=1496115723729, value=23
id-1 column=hello_family:name, timestamp=1496115723692, value=Alice
id-2 column=hello_family:age, timestamp=1496115723990, value=24
id-2 column=hello_family:name, timestamp=1496115723750, value=Bob
2 row(s) in 0.0170 seconds
取数据:get 'hello_table','id-1'
,得到的结果如下:
COLUMN CELL
hello_family:age timestamp=1496115723729, value=23
hello_family:name timestamp=1496115723692, value=Alice
2 row(s) in 0.0050 seconds
删除数据:delete 'hello_table','id-1','name'
,这样删掉了name
这一格,age
还在。通过scan
查看得到结果为:
ROW COLUMN+CELL
id-1 column=hello_family:age, timestamp=1496115723729, value=23
id-2 column=hello_family:age, timestamp=1496115723990, value=24
id-2 column=hello_family:name, timestamp=1496115723750, value=Bob
2 row(s) in 0.0130 seconds
删除表:
disable 'hello_table'
drop 'hello_table'
退出终端:exit
停止HBase服务:bin/stop-hbase.sh
。
硬件配置
CPU要求多核,最好每个硬盘对应有个核。
JVM内存不宜超过16G,避免GC停顿时间过长。
master节点推荐24G、region节点推荐24G以上。
网络推荐两个千兆网卡做bond。如有万兆、或者InfiniBand更好。
服务器推荐用1U的。
网络,推荐一个机架放两个交换机,然后核心交换机将机架上的交换机连起来。
软件
操作系统需要选择,通常用Linux中的CentOS和RHEL比较好。
文件系统有以下几种选择:
- ext3,推荐禁用访问时间的记录,因为HBase不需要记录访问时间,这样节省内核的管理开销
- ext4,推荐关闭延迟分配策略,延迟分配是指将写入的数据临时存放在内存里,等到flush时再落盘。关掉之后减少数据断电导致数据丢失的概率
- XFS,优点是格盘很快,缺点是大量删除文件会涉及元数据的变更,不过HBase一般是大文件存储,不会出现这个问题。
- ZFS,内置压缩,支持ZB级别的储存空间
Java,版本至少1.7以上,比最新版稍旧一些的版本,避免重大BUG。
Hadoop版本,需要支持sync功能,避免数据丢失。HBase中使用的hadoop版本需要与底层hadoop版本一致,需要将底层运行的hadoop的jar包复制到hbase中再启动。
SSH。建议使用ssh-agent,只需输入一次密码即可批量操作。
域名服务。HBase通过本地域名汇报IP地址,因此需要DNS的正向解析和反向解析都能够正常工作。
同步时间。时间需要保证同步。相差1分钟以上就会出现奇怪的行为。比如发生ClockOutOfSyncException
。
文件数量限制和进程限制。文件数量限制默认1024是不够用的,至少要10000。进程数量nproc
也需要设置。修改之后需要重新登录才能生效。
DataNode处理线程数。在hdfs-site.xml
配置文件中需要设置dfs.datanode.max.xcievers
至少设置为4096。配置完之后需要重启HDFS集群。此配置相当于最大文件句柄数。如果太小可能会出现:No live nodes contain current block. Will get new block locations from namenode and retry.
交换分区。必须关掉,否则可能卡死一个region节点。
Windows。HBase不建议在Windows环境运行。
HBase使用的文件系统
HBase常见使用HDFS文件系统。也可以支持别的文件系统,甚至自己实现一种。HBase自身没有做副本,所以底层的文件系统必须提供副本、容错、扩展的功能。事实上HBase支持所有实现了Hadoop接口的文件系统,包括HDFS、Amazon S3、Google Cloud、本地文件系统。KFS也是一种高性能文件系统。
- HDFS的URI格式为:
hdfs://<namenode>:<port>/<path>
- S3的URL格式为:
s3://<bucket-name>
或者s3n://<bucket-name>
- KFS的URI格式为:
kfs:///<path>
运行模式
分为单机模式和分布式模式。一般调试用单机模式或者伪分布式模式。生产环境用分布式模式。分布式模式需要加上如下配置:
<property>
<name>hbase.rootdir</name>
<value>hdfs://localhost:9000/hbase</value>
</property>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
完全分布式模式需要增加如下配置:
<property>
<name>hbase.cluster.distributed</name>
<value>true</value>
</property>
还需要修改conf/regionservers
,列出所有region-server
节点IP。每个文件独立一行文件。
Zookeeper安装。HBase自带Zookeeper,因此可以跟随hbase启动,共用JVM,也可以单独启动zookeeper和hbase。(笔者:推荐hbase和zookeeper分别独立启动,避免相互影响)
配置
主要的配置有以下几个:
hbase-env.sh
,用于设置环境变量。包括JVM堆设置,GC设置等。修改后重启生效。hbase-site.xml
,集群特有的配置。hbase-default.xml
,默认配置,此文件在hbase程序包中。如果配置项在hbase-default.xml
和hbase-site.xml
,会优先使用hbase-site.xml
中的配置。regionserver
,region节点的列表log4j.properties
,打印日志的选项
配置完成后需要需要将conf
文件夹中的文件都同步到所有节点上。如果配置不一致则会导致问题。
部署
可以通过脚本批量部署hbase,也可以通过Apache Whirr批量部署,也可以用Puppet、Chef批量部署。
操作集群
web ui,访问master节点的60010端口可以得到图形界面。(笔者:新版本端口改成16010了)