hbase简介
HBase是什么?
HBase是建立在Hadoop文件系统之上的分布式面向列的数据库。
HBase是一个数据模型,类似于谷歌的大表设计,可以提供快速随机访问海量结构化数据。它利用了Hadoop的文件系统(HDFS)提供的容错能力。
它是Hadoop的生态系统,提供对数据的随机实时读/写访问,是Hadoop文件系统的一部分。
人们可以直接或通过HBase的存储HDFS数据。使用HBase在HDFS读取消费/随机访问数据。 HBase在Hadoop的文件系统之上,并提供了读写访问。
HBase 和 HDFS
HDFS | HBase |
---|---|
HDFS是适于存储大容量文件的分布式文件系统。 | HBase是建立在HDFS之上的数据库。 |
HDFS不支持快速单独记录查找。 | HBase提供在较大的表快速查找 |
它提供了高延迟批量处理;没有批处理概念。 | 它提供了数十亿条记录低延迟访问单个行记录(随机存取)。 |
它提供的数据只能顺序访问。 | HBase内部使用哈希表和提供随机接入,并且其存储索引,可将在HDFS文件中的数据进行快速查找。 |
HBase的存储机制
HBase是一个面向列的数据库,在表中它由行排序。表模式定义只能列族,也就是键值对。一个表有多个列族以及每一个列族可以有任意数量的列。后续列的值连续地存储在磁盘上。表中的每个单元格值都具有时间戳。总之,在一个HBase:
- 表是行的集合。
- 行是列族的集合。
- 列族是列的集合。
- 列是键值对的集合。
下面给出的表中是HBase模式的一个例子。
面向列和面向行
面向列的数据库是存储数据表作为数据列的部分,而不是作为行数据。总之它们拥有列族。
行式数据库 | 列式数据库
- | -
它适用于联机事务处理(OLTP)。 | 它适用于在线分析处理(OLAP)。
这样的数据库被设计为小数目的行和列。 | 面向列的数据库设计的巨大表。
下图显示了列族在面向列的数据库:
HBase 和 RDBMS
HBase | RDBMS |
---|---|
HBase无模式,它不具有固定列模式的概念;仅定义列族。 | RDBMS有它的模式,描述表的整体结构的约束。 |
它专门创建为宽表。 HBase是横向扩展。 | 这些都是细而专为小表。很难形成规模。 |
没有任何事务存在于HBase。 | RDBMS是事务性的。 |
它反规范化的数据。 | 它具有规范化的数据。 |
它用于半结构以及结构化数据是非常好的。 | 用于结构化数据非常好。 |
HBase的特点
- HBase线性可扩展。
- 它具有自动故障支持。
- 它提供了一致的读取和写入。
- 它集成了Hadoop,作为源和目的地。
- 客户端方便的Java API。
- 它提供了跨集群数据复制。
在哪里可以使用HBase?
- Apache HBase曾经是随机,实时的读/写访问大数据。
- 它承载在集群普通硬件的顶端是非常大的表。
- Apache HBase是此前谷歌Bigtable模拟非关系型数据库。 Bigtable对谷歌文件系统操作,同样类似Apache HBase工作在Hadoop HDFS的顶部。
HBase的应用
- 它是用来当有需要写重的应用程序。
- HBase使用于当我们需要提供快速随机访问的数据。
- 很多公司,如Facebook,Twitter,雅虎,和Adobe内部都在使用HBase。
HBase架构
在HBase中,表被分割成区域,并由区域服务器提供服务。区域被列族垂直分为“Stores”。Stores被保存在HDFS文件。下面显示的是HBase的结构。
注意:术语“store”是用于区域来解释存储结构。
HBase有三个主要组成部分:客户端库,主服务器和区域服务器。区域服务器可以按要求添加或删除。
主服务器
主服务器是:
- 分配区域给区域服务器并在Apache ZooKeeper的帮助下完成这个任务。
- 处理跨区域的服务器区域的负载均衡。它卸载繁忙的服务器和转移区域较少占用的服务器。
- 通过判定负载均衡以维护集群的状态。
- 负责模式变化和其他元数据操作,如创建表和列。
区域
区域只不过是表被拆分,并分布在区域服务器。
区域服务器
区域服务器拥有区域如下:
- 与客户端进行通信并处理数据相关的操作。
- 句柄读写的所有地区的请求。
- 由以下的区域大小的阈值决定的区域的大小。
需要深入探讨区域服务器:包含区域和存储,如下图所示:
存储包含内存存储和HFiles。memstore就像一个高速缓存。在这里开始进入了HBase存储。数据被传送并保存在Hfiles作为块并且memstore刷新。
Zookeeper
- Zookeeper管理是一个开源项目,提供服务,如维护配置信息,命名,提供分布式同步等
- Zookeeper代表不同区域的服务器短暂节点。主服务器使用这些节点来发现可用的服务器。
- 除了可用性,该节点也用于追踪服务器故障或网络分区。
- 客户端通过与zookeeper区域服务器进行通信。
- 在模拟和独立模式,HBase由zookeeper来管理。
HBase安装
本章将介绍如何安装HBase和初始配置。
安装前设置
安装Hadoop在Linux环境下之前,需要建立和使用Linux SSH(安全Shell)。按照下面设立Linux环境提供的步骤。
创建一个用户
首先,建议从Unix创建一个单独的Hadoop用户,文件系统隔离Hadoop文件系统。按照下面给出创建用户的步骤。
- 开启root使用命令 “su”.
- 使用root帐户命令创建用户 “useradd username”.
- 现在,可以使用命令打开一个现有的用户帐户 “su username”
打开Linux终端,输入以下命令来创建一个用户1
2
3
4
5
6$ su
password:
# useradd hadoop
# passwd hadoop
New passwd:
Retype new passwd
SSH设置和密钥生成
SSH设置需要在集群上执行不同的操作,如启动,停止和分布式守护shell操作。进行身份验证不同的Hadoop用户,需要一种用于Hadoop的用户提供的公钥/私钥对,并用不同的用户共享。
以下的命令被用于生成使用SSH密钥值对。复制公钥从id_rsa.pub为authorized_keys,并提供所有者,读写权限到authorized_keys文件。
1 | $ ssh-keygen -t rsa |
验证ssh
1 | ssh localhost |
安装java
略
下载Hadoop
安装Java之后,接下来就是安装Hadoop。首先使用“Hadoop version” 命令验证 Hadoop 是否存在,如下所示。1
hadoop version
如果一切正常,它会得到下面的输出。1
2
3
4
5
6Hadoop 2.6.0
Compiled by jenkins on 2014-11-13T21:10Z
Compiled with protoc 2.5.0
From source with checksum 18e43357c8f927c0695f1e9522859d6a
This command was run using
/home/hadoop/hadoop/share/hadoop/common/hadoop-common-2.6.0.jar
如果系统上是无法找到 Hadoop,那么证明还未安装,现在下载Hadoop在您的系统上。按照下面给出的命令。从Apache软件基金会下载并使用下面的命令提取 Hadoop-2.6.0。1
2
3
4
5
6
7
8$ su
password:
# cd /usr/local
# wget http://mirrors.advancedhosters.com/apache/hadoop/common/hadoop-
2.6.0/hadoop-2.6.0-src.tar.gz
# tar xzf hadoop-2.6.0-src.tar.gz
# mv hadoop-2.6.0/* hadoop/
# exit
安装 Hadoop
可在任何需要的方式安装Hadoop。在这里将展示 HBase 模拟分布式模式功能,因此模拟分布式模式的Hadoop安装。
按下面的步骤来安装 Hadoop 2.4.1.
第1步 - 设置Hadoop
可以通过附加下面的命令在 〜/ .bashrc文件中以设置 Hadoop 环境变量。1
2
3
4
5
6
7
8export HADOOP_HOME=/usr/local/hadoop
export HADOOP_MAPRED_HOME=$HADOOP_HOME
export HADOOP_COMMON_HOME=$HADOOP_HOME
export HADOOP_HDFS_HOME=$HADOOP_HOME
export YARN_HOME=$HADOOP_HOME
export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
export PATH=$PATH:$HADOOP_HOME/sbin:$HADOOP_HOME/bin
export HADOOP_INSTALL=$HADOOP_HOME
现在,应用所有更改到当前正在运行的系统。1
$ source ~/.bashrc
第2步 - Hadoop配置
找到位于 “$HADOOP_HOME/etc/hadoop” 目录下所有的Hadoop配置文件。根据需要Hadoop将配置文件中的内容作修改。1
$ cd $HADOOP_HOME/etc/hadoop
为了使用Java开发Hadoop程序,必须用java在系统中的位置来替换 hadoop-env.sh文件中的 java环境变量JAVA_HOME的值。1
export JAVA_HOME=/usr/local/jdk1.7.0_71
编辑core-site.xml文件来配置Hadoop。
core-site.xml文件中包含,如:用于Hadoop实例的端口号,分配给文件系统,存储器限制用于存储数据存储器和读/写缓冲器的大小的信息。
打开core-site.xml,并在configuration和configuration标签之间添加以下属性。1
2
3
4
5
6<configuration>
<property>
<name>fs.default.name</name>
<value>hdfs://localhost:9000</value>
</property>
</configuration>
hdfs-site.xml
hdfs-site.xml文件中包含,如:复制数据的值,NameNode的路径,本地文件系统,要存储Hadoop基础架构的Datanode路径的信息。
假设有以下数据。1
2
3
4
5
6
7dfs.replication (data replication value) = 1
(In the below given path /hadoop/ is the user name.
hadoopinfra/hdfs/namenode is the directory created by hdfs file system.)
namenode path = //home/hadoop/hadoopinfra/hdfs/namenode
(hadoopinfra/hdfs/datanode is the directory created by hdfs file
system.)
datanode path = //home/hadoop/hadoopinfra/hdfs/datanode
打开这个文件,并在configuration和configuration标记之间添加以下属性。1
2
3
4
5
6
7
8
9
10
11
12
13
14<configuration$gt;
<property$gt;
<name$gt;dfs.replication</name $gt;
<value$gt;1</value$gt;
</property$gt;
<property$gt;
<name$gt;dfs.name.dir</name$gt;
<value$gt;file:///home/hadoop/hadoopinfra/hdfs/namenode</value$gt;
</property$gt;
<property$gt;
<name$gt;dfs.data.dir</name$gt;
<value$gt;file:///home/hadoop/hadoopinfra/hdfs/datanode</value$gt;
</property$gt;
</configuration$gt;
注:上面的文件,所有的属性值是用户定义的,可以根据自己的Hadoop的基础架构进行更改。
yarn-site.xml
此文件用于配置成yarn在Hadoop中。打开yarn-site.xml文件,并在configuration标签之前添加以下属性到这个文件中。1
2
3
4
5
6<configuration$gt;
<property$gt;
<name$gt;yarn.nodemanager.aux-services</name$gt;
<value$gt;mapreduce_shuffle</value$gt;
</property$gt;
</configuration$gt;
mapred-site.xml
此文件用于指定MapReduce框架以使用。默认情况下Hadoop包含yarn-site.xml模板。首先,它需要从mapred-site.xml复制模板到mapred-site.xml文件,使用下面的命令来。1
$ cp mapred-site.xml.template mapred-site.xml
打开 mapred-site.xml 文件,并在configuration和configuration标签之间添加以下属性。1
2
3
4
5
6<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
验证Hadoop安装
下面的步骤是用来验证Hadoop的安装。
第1步 - 名称节点设置
设置名称节点使用“hdfs namenode -format”命令如下1
2$ cd ~
$ hdfs namenode -format
预期的结果如下。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
1710/24/14 21:30:55 INFO namenode.NameNode: STARTUP_MSG:
/************************************************************
STARTUP_MSG: Starting NameNode
STARTUP_MSG: host = localhost/192.168.1.11
STARTUP_MSG: args = [-format]
STARTUP_MSG: version = 2.4.1
...
...
10/24/14 21:30:56 INFO common.Storage: Storage directory
/home/hadoop/hadoopinfra/hdfs/namenode has been successfully formatted.
10/24/14 21:30:56 INFO namenode.NNStorageRetentionManager: Going to
retain 1 images with txid >= 0
10/24/14 21:30:56 INFO util.ExitUtil: Exiting with status 0
10/24/14 21:30:56 INFO namenode.NameNode: SHUTDOWN_MSG:
/************************************************************
SHUTDOWN_MSG: Shutting down NameNode at localhost/192.168.1.11
************************************************************
第2步 - 验证Hadoop DFS
下面的命令用来启动DFS。执行这个命令将启动Hadoop文件系统。1
$ start-dfs.sh
预期的结果如下。1
2
3
4
5
6
710/24/14 21:37:56
Starting namenodes on [localhost]
localhost: starting namenode, logging to /home/hadoop/hadoop-
2.4.1/logs/hadoop-hadoop-namenode-localhost.out
localhost: starting datanode, logging to /home/hadoop/hadoop-
2.4.1/logs/hadoop-hadoop-datanode-localhost.out
Starting secondary namenodes [0.0.0.0]
第3步 - 验证Yarn脚本
下面的命令用来启动yarn脚本。执行此命令将启动yarn守护进程。1
$ start-yarn.sh
预期的结果如下。1
2
3
4
5starting yarn daemons
starting resourcemanager, logging to /home/hadoop/hadoop-
2.4.1/logs/yarn-hadoop-resourcemanager-localhost.out
localhost: starting nodemanager, logging to /home/hadoop/hadoop-
2.4.1/logs/yarn-hadoop-nodemanager-localhost.out
第4步 - 访问Hadoop上的浏览器
访问Hadoop的默认端口号为50070。使用以下网址,以获取Hadoop服务在浏览器中。1
http://localhost:50070
第5步 - 验证集群中的所有应用程序
访问群集的所有应用程序的默认端口号为8088。使用以下URL访问该服务。1
http://localhost:8088/
HBase安装
单机模式,模拟分布式模式,以及全分布式模式:可以在任何的三种模式来安装HBase。
在单机模式下安装HBase
使用 “wget” 命令下载HBase,下载网址为:http://www.interiordsgn.com/apache/hbase/stable/ ,选择最新的稳定版本,并使用 tar “zxvf” 命令将其解压缩。请参见下面的命令。1
2
3
4$cd usr/local/
$wget http://www.interior-dsgn.com/apache/hbase/stable/hbase-0.98.8-
hadoop2-bin.tar.gz
$tar -zxvf hbase-0.98.8-hadoop2-bin.tar.gz
切换到超级用户模式,将HBase文件复制到/usr/local,如下图所示。1
2
3$su
$password: enter your password here
mv hbase-0.99.1/* Hbase/
在单机模式下配置HBase
在继续HBase之前,需要编辑下列文件和配置HBase。
hbase-env.sh
为HBase设置Java目录,并从conf文件夹打开hbase-env.sh文件。编辑JAVA_HOME环境变量,改变路径到当前JAVA_HOME变量,如下图所示。1
2cd /usr/local/Hbase/conf
gedit hbase-env.sh
这将打开HBase的env.sh文件。现在使用当前值替换现有JAVA_HOME值,如下图所示。1
export JAVA_HOME=/usr/lib/jvm/java-1.7.0
hbase-site.xml
这是HBase的主配置文件。通过在 /usr/local/HBase 打开HBase主文件夹,设置数据目录到合适的位置。在 conf 文件夹里面有几个文件,现在打开hbase-site.xml文件,如下图所示。1
2
3#cd /usr/local/HBase/
#cd conf
# gedit hbase-site.xml
在hbase-site.xml文件里面,找到 configuration 标签。并在其中,设置属性键名为“hbase.rootdir”,如下图所示的HBase目录。1
2
3
4
5
6
7
8
9
10
11
12
13<configuration>
//Here you have to set the path where you want HBase to store its files.
<property>
<name>hbase.rootdir</name>
<value>file:/home/hadoop/HBase/HFiles</value>
</property>
//Here you have to set the path where you want HBase to store its built
in zookeeper files.
<property>
<name>hbase.zookeeper.property.dataDir</name>
<value>/home/hadoop/zookeeper</value>
</property>
</configuration>
到此 HBase 的安装配置已成功完成。可以通过使用 HBase 的 bin 文件夹中提供 start-hbase.sh 脚本启动 HBase。为此,打开HBase 主文件夹,然后运行 HBase 启动脚本,如下图所示。1
2$cd /usr/local/HBase/bin
$./start-hbase.sh
如果一切顺利,当运行HBase启动脚本,它会提示一条消息:HBase has started1
starting master, logging to /usr/local/HBase/bin/../logs/hbase-tpmaster-localhost.localdomain.out
在模拟分布式模式安装HBase
现在,来看看如何安装HBase在模拟分布式模式。
CONFIGURING HBASE
继续进行HBase之前,在本地系统或远程系统上配置Hadoop HDFS并确保它们正在运行。如果它正在运行则先停止HBase。
hbase-site.xml
编辑hbase-site.xml文件中添加以下属性。1
2
3
4<property>
<name>hbase.cluster.distributed</name>
<value>true</value>
</property>
它会提到在HBase的哪种模式运行。 从本地文件系统相同的文件改变hbase.rootdir,HDFS实例地址使用hdfs://// URI 语法。在本地主机的端口8030上运行HDFS。1
2
3
4<property>
<name>>hbase.rootdir</name>
<value>hdfs://localhost:8030/hbase</value>
</property>
启动HBase
经过配置结束后,浏览到HBase的主文件夹,并使用以下命令启动HBase。1
2$cd /usr/local/HBase
$bin/start-hbase.sh
注:在启动 HBase 之前,请确保 Hadoop 运行。
检查在HDFS的HBase目录
HBase创建其目录在HDFS中。要查看创建的目录,浏览到Hadoop bin并键入以下命令1
$ ./bin/hadoop fs -ls /hbase
如果一切顺利的话,它会给下面的输出。1
2
3
4
5
6
7
8Found 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
启动和停止主服务器
使用“local-master-backup.sh”就可以启动多达10台服务器。打开HBase的master主文件夹,并执行以下命令来启动它。1
$ ./bin/local-master-backup.sh 2 4
要中止备份主服务,需要它的进程ID,它被存储在一个文件名为“/tmp/hbase-USER-X-master.pid”中,可以使用下面的命令中止备份主服务。1
$ cat /tmp/hbase-user-1-master.pid |xargs kill -9
启动和停止区域服务器
可以使用下面的命令来运行在单一系统中的多个区域的服务器。1
$ .bin/local-regionservers.sh start 2 3
要停止区域服务器,可以使用下面的命令。1
$ .bin/local-regionservers.sh stop 3
启动HBaseShell
下面给出的是启动HBase shell的步骤。打开终端,并登录为超级用户。
启动Hadoop文件系统
通过Hadoop主目录下的sbin目录文件夹浏览并启动Hadoop文件系统,如下所示。
1 | $cd $HADOOP_HOME/sbin |
启动HBase
通过HBase根目录下的bin文件夹浏览并启动HBase。1
2$cd /usr/local/HBase
$./bin/start-hbase.sh
启动HBase主服务器
这在相同目录。启动它,如下图所示:1
2$./bin/local-master-backup.sh start 2 (number signifies specific
server.)
启动区域服务
启动区域服务器,如下所示。
1 | $./bin/./local-regionservers.sh start 3 |
启动HBase Shell
可以使用以下命令启动HBase shell1
2$cd bin
$./hbase shell
这会给出HBase shell 的提示符,如下图所示。1
2
3
4
5
6
7
82014-12-09 14:24:27,526 INFO [main] Configuration.deprecation:
hadoop.native.lib is deprecated. Instead, use io.native.lib.available
HBase Shell; enter 'help<RETURN>' for list of supported commands.
Type "exit<RETURN>" to leave the HBase Shell
Version 0.98.8-hadoop2, r6cfc8d064754251365e070a10a82eb169956d5fe, Fri
Nov 14 18:26:29 PST 2014
hbase(main):001:0>
HBase的Web界面
要访问 HBase 的 Web界面,在浏览器中键入以下URL1
http://localhost:60010
以下界面列出了当前正在运行的区域服务器,备份主服务以及HBase表。
HBase Shell
HBase包含可以与HBase进行通信的Shell。 HBase使用Hadoop文件系统来存储数据。它拥有一个主服务器和区域服务器。数据存储将在区域(表)的形式。这些区域被分割并存储在区域服务器。
主服务器管理这些区域服务器,所有这些任务发生在HDFS。下面给出的是一些由HBase Shell支持的命令。
通用命令
- status: 提供HBase的状态,例如,服务器的数量。
- version: 提供正在使用HBase版本。
- table_help: 表引用命令提供帮助。
- whoami: 提供有关用户的信息。
数据定义语言
这些是关于HBase在表中操作的命令。
create: 创建一个表。
list: 列出HBase的所有表。
disable: 禁用表。
is_disabled: 验证表是否被禁用。
enable: 启用一个表。
is_enabled: 验证表是否已启用。
describe: 提供了一个表的描述。
alter: 改变一个表。
exists: 验证表是否存在。
drop: 从HBase中删除表。
drop_all: 丢弃在命令中给出匹配“regex”的表。
Java Admin API: 在此之前所有的上述命令,Java提供了一个通过API编程来管理实现DDL功能。在这个org.apache.hadoop.hbase.client包中有HBaseAdmin和HTableDescriptor 这两个重要的类提供DDL功能。
数据操纵语言
put: 把指定列在指定的行中单元格的值在一个特定的表。
get: 取行或单元格的内容。
delete: 删除表中的单元格值。
deleteall: 删除给定行的所有单元格。
scan: 扫描并返回表数据。
count: 计数并返回表中的行的数目。
truncate: 禁用,删除和重新创建一个指定的表。
Java client API: 在此之前所有上述命令,Java提供了一个客户端API来实现DML功能,CRUD(创建检索更新删除)操作更多的是通过编程,在org.apache.hadoop.hbase.client包下。 在此包HTable 的 Put和Get是重要的类。
启动 HBase Shell
要访问HBase shell,必须导航进入到HBase的主文件夹。1
2cd /usr/localhost/
cd Hbase
可以使用“hbase shell”命令来启动HBase的交互shell,如下图所示。1
./bin/hbase shell
如果已成功在系统中安装HBase,那么它会给出 HBase shell 提示符,如下图所示。1
2
3
4
5
6HBase Shell; enter 'help<RETURN>' for list of supported commands.
Type "exit<RETURN>" to leave the HBase Shell
Version 0.94.23, rf42302b28aceaab773b15f234aa8718fff7eea3c, Wed Aug 27
00:54:09 UTC 2014
hbase(main):001:0>
要退出交互shell命令,在任何时候键入 exit 或使用1
hbase(main):001:0> list
当输入这个命令,它给出下面的输出。1
2hbase(main):001:0> list
TABLE
HBase常用命令
status
命令返回包括在系统上运行的服务器的细节和系统的状态。它的语法如下:1
hbase(main):009:0> status
如果执行这个命令,它会返回下面的输出1
2hbase(main):009:0> status
3 servers, 0 dead, 1.3333 average load
version
该命令返回HBase系统使用的版本。它的语法如下:1
hbase(main):010:0> version
如果执行这个命令,它会返回下面的输出。1
2
3hbase(main):009:0> version
0.98.8-hadoop2, r6cfc8d064754251365e070a10a82eb169956d5fe, Fri Nov 14
18:26:29 PST 2014
table_help
此命令将引导如何使用表引用的命令。下面给出的是使用这个命令的语法。1
hbase(main):02:0> table_help
当使用此命令时,它显示帮助主题表相关的命令。下面给出是此命令的部分输出。1
2
3
4
5
6
7
8
9
10hbase(main):002:0> table_help
Help for table-reference commands.
You can either create a table via 'create' and then manipulate the table
via commands like 'put', 'get', etc.
See the standard help information for how to use each of these commands.
However, as of 0.96, you can also get a reference to a table, on which
you can invoke commands.
For instance, you can get create a table and keep around a reference to
it via:
hbase> t = create 't', 'cf'…...
whoami
该命令返回HBase用户详细信息。如果执行这个命令,返回当前HBase用户,如下图所示1
2
3hbase(main):008:0> whoami
hadoop (auth:SIMPLE)
groups: hadoop
HBase创建表
可以使用命令创建一个表,在这里必须指定表名和列族名。在HBase shell中创建表的语法如下所示。1
create '<table name>','<column family>'
示例
下面给出的是一个表名为emp的样本模式。它有两个列族:“personal data”和“professional data”。
Row key | personal data | professional data
- | - | -
| |
| |
在HBase shell创建该表如下所示。1
hbase(main):002:0> create 'emp', 'personal data', 'professional data'
它会给下面的输出。1
2
3
40 row(s) in 1.1300 seconds
=> Hbase::Table - emp
验证创建
可以验证是否已经创建,使用 list 命令如下所示。在这里,可以看到创建的emp表。1
2
3
4
5
6
7hbase(main):002:0> list
TABLE
emp
2 row(s) in 0.0340 seconds
HBase列出表
list 是用来列出HBase中所有表的命令。1
hbase(main):001:0 > list
当输入这个命令,并在HBase提示符下执行,它会显示HBase中的所有表的列表,如下图所示。1
2
3hbase(main):001:0> list
TABLE
emp
在这里,可以看到一个名为表emp。
HBase禁用表
要删除表或改变其设置,首先需要使用 disable 命令关闭表。使用 enable 命令,可以重新启用它。下面给出的语法是用来禁用一个表:1
disable 'emp'
下面给出的是一个例子,说明如何禁用表。1
2hbase(main):025:0> disable 'emp'
0 row(s) in 1.2760 seconds
验证
禁用表之后,仍然可以通过 list 和exists命令查看到。无法扫描到它存在,它会给下面的错误。1
2
3
4
5hbase(main):028:0> scan 'emp'
ROW COLUMN+CELL
ERROR: emp is disabled.
s_disabled
这个命令是用来查看表是否被禁用。它的语法如下。1
hbase> is_disabled 'table name'
下面的例子验证表名为emp是否被禁用。如果禁用,它会返回true,如果没有,它会返回false。1
2
3
4
5hbase(main):031:0> is_disabled 'emp'
true
0 row(s) in 0.0440 seconds
disable_all
此命令用于禁用所有匹配给定正则表达式的表。disable_all命令的语法如下。1
hbase> disable_all 'r.*'
假设有5个表在HBase,即raja, rajani, rajendra, rajesh 和 raju。下面的代码将禁用所有以 raj 开始的表。1
2
3
4
5
6
7
8
9
10
11
12hbase(main):002:0> disable_all 'raj.*'
raja
rajani
rajendra
rajesh
raju
Disable the above 5 tables (y/n)?
y
5 tables successfully disabled
HBase启用表
启用表的语法:1
enable 'emp'
给出下面是一个例子,使一个表启用。1
2hbase(main):005:0> enable 'emp'
0 row(s) in 0.4580 seconds
验证
启用表之后,扫描。如果能看到的模式,那么证明表已成功启用。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29hbase(main):006:0> scan 'emp'
ROW COLUMN+CELL
1 column=personal data:city, timestamp=1417516501, value=hyderabad
1 column=personal data:name, timestamp=1417525058, value=ramu
1 column=professional data:designation, timestamp=1417532601, value=manager
1 column=professional data:salary, timestamp=1417524244109, value=50000
2 column=personal data:city, timestamp=1417524574905, value=chennai
2 column=personal data:name, timestamp=1417524556125, value=ravi
2 column=professional data:designation, timestamp=14175292204, value=sr:engg
2 column=professional data:salary, timestamp=1417524604221, value=30000
3 column=personal data:city, timestamp=1417524681780, value=delhi
3 column=personal data:name, timestamp=1417524672067, value=rajesh
3 column=professional data:designation, timestamp=14175246987, value=jr:engg
3 column=professional data:salary, timestamp=1417524702514, value=25000
3 row(s) in 0.0400 seconds
is_enabled
此命令用于查找表是否被启用。它的语法如下:1
hbase> is_enabled 'table name'
下面的代码验证表emp是否启用。如果启用,它将返回true,如果没有,它会返回false。1
2
3
4hbase(main):031:0> is_enabled 'emp'
true
0 row(s) in 0.0440 seconds
HBase表描述和修改
描述
该命令返回表的说明。它的语法如下:1
hbase> describe 'table name'
下面给出的是对emp表的 describe 命令的输出。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39hbase(main):006:0> describe 'emp'
DESCRIPTION
ENABLED
'emp', {NAME => 'READONLY', DATA_BLOCK_ENCODING => 'NONE', BLOOMFILTER
=> 'ROW', REPLICATION_SCOPE => '0', COMPRESSION => 'NONE', VERSIONS =>
'1', TTL true
=> 'FOREVER', MIN_VERSIONS => '0', KEEP_DELETED_CELLS => 'false',
BLOCKSIZE => '65536', IN_MEMORY => 'false', BLOCKCACHE => 'true'}, {NAME
=> 'personal
data', DATA_BLOCK_ENCODING => 'NONE', BLOOMFILTER => 'ROW',
REPLICATION_SCOPE => '0', VERSIONS => '5', COMPRESSION => 'NONE',
MIN_VERSIONS => '0', TTL
=> 'FOREVER', KEEP_DELETED_CELLS => 'false', BLOCKSIZE => '65536',
IN_MEMORY => 'false', BLOCKCACHE => 'true'}, {NAME => 'professional
data', DATA_BLO
CK_ENCODING => 'NONE', BLOOMFILTER => 'ROW', REPLICATION_SCOPE => '0',
VERSIONS => '1', COMPRESSION => 'NONE', MIN_VERSIONS => '0', TTL =>
'FOREVER', K
EEP_DELETED_CELLS => 'false', BLOCKSIZE => '65536', IN_MEMORY =>
'false', BLOCKCACHE => 'true'}, {NAME => 'table_att_unset',
DATA_BLOCK_ENCODING => 'NO
NE', BLOOMFILTER => 'ROW', REPLICATION_SCOPE => '0', COMPRESSION =>
'NONE', VERSIONS => '1', TTL => 'FOREVER', MIN_VERSIONS => '0',
KEEP_DELETED_CELLS
=> 'false', BLOCKSIZE => '6
修改
alter用于更改现有表的命令。使用此命令可以更改列族的单元,设定最大数量和删除表范围运算符,并从表中删除列家族。
更改列族单元格的最大数目
下面给出的语法来改变列家族单元的最大数目。1
hbase> alter 't1', NAME => 'f1', VERSIONS => 5
在下面的例子中,单元的最大数目设置为5。1
2
3
4
5
6hbase(main):003:0> alter 'emp', NAME => 'personal data', VERSIONS => 5
Updating all regions with the new schema...
0/1 regions updated.
1/1 regions updated.
Done.
0 row(s) in 2.3050 seconds
表范围运算符
使用alter,可以设置和删除表范围,运算符,如MAX_FILESIZE,READONLY,MEMSTORE_FLUSHSIZE,DEFERRED_LOG_FLUSH等。
设置只读
下面给出的是语法,是用以设置表为只读。1
hbase>alter 't1', READONLY(option)
在下面的例子中,我们已经设置表emp为只读。1
2
3
4
5
6hbase(main):006:0> alter 'emp', READONLY
Updating all regions with the new schema...
0/1 regions updated.
1/1 regions updated.
Done.
0 row(s) in 2.2140 seconds
删除表范围运算符
也可以删除表范围运算。下面给出的是语法,从emp表中删除“MAX_FILESIZE”。1
hbase> alter 't1', METHOD => 'table_att_unset', NAME => 'MAX_FILESIZE'
删除列族
使用alter,也可以删除列族。下面给出的是使用alter删除列族的语法。1
hbase> alter ‘ table name ’, ‘delete’ => ‘ column family ’
下面给出的是一个例子,从“emp”表中删除列族。
假设在HBase中有一个employee表。它包含以下数据:1
2
3
4
5
6
7
8
9
10
11
12
13hbase(main):006:0> scan 'employee'
ROW COLUMN+CELL
row1 column=personal:city, timestamp=1418193767, value=hyderabad
row1 column=personal:name, timestamp=1418193806767, value=raju
row1 column=professional:designation, timestamp=1418193767, value=manager
row1 column=professional:salary, timestamp=1418193806767, value=50000
1 row(s) in 0.0160 seconds
现在使用alter命令删除指定的 professional 列族。1
2
3
4
5
6hbase(main):007:0> alter 'employee','delete'=>'professional'
Updating all regions with the new schema...
0/1 regions updated.
1/1 regions updated.
Done.
0 row(s) in 2.2380 seconds
现在验证该表中变更后的数据。观察列族“professional”也没有了,因为前面已经被删除了。1
2
3
4
5
6
7hbase(main):003:0> scan 'employee'
ROW COLUMN+CELL
row1 column=personal:city, timestamp=14181936767, value=hyderabad
row1 column=personal:name, timestamp=1418193806767, value=raju
1 row(s) in 0.0830 seconds
HBase Exists
可以使用exists命令验证表的存在。下面的示例演示了如何使用这个命令。1
2
3
4
5
6
7
8
9
10
11hbase(main):024:0> exists 'emp'
Table emp does exist
0 row(s) in 0.0750 seconds
==================================================================
hbase(main):015:0> exists 'student'
Table student does not exist
0 row(s) in 0.0480 seconds
HBase删除表
用drop命令可以删除表。在删除一个表之前必须先将其禁用。1
2
3
4
5
6hbase(main):018:0> disable 'emp'
0 row(s) in 1.4580 seconds
hbase(main):019:0> drop 'emp'
0 row(s) in 0.3060 seconds
使用exists 命令验证表是否被删除。1
2
3
4hbase(main):020:0> exists 'emp'
Table emp does not exist
0 row(s) in 0.0730 seconds
drop_all
这个命令是用来在给出删除匹配“regex”表。它的语法如下:1
hbase> drop_all 't.*'
注意:要删除表,则必须先将其禁用。
示例
假设有一些表的名称为raja, rajani, rajendra, rajesh, 和 raju。1
2
3
4
5
6
7
8hbase(main):017:0> list
TABLE
raja
rajani
rajendra
rajesh
raju
9 row(s) in 0.0270 seconds
所有这些表以字母raj开始。首先使用disable_all命令禁用所有这些表如下所示。1
2
3
4
5
6
7
8
9hbase(main):002:0> disable_all 'raj.*'
raja
rajani
rajendra
rajesh
raju
Disable the above 5 tables (y/n)?
y
5 tables successfully disabled
现在,可以使用 drop_all 命令删除它们,如下所示。1
2
3
4
5
6
7
8
9
10
11hbase(main):018:0> drop_all 'raj.*'
raja
rajani
rajendra
rajesh
raju
Drop the above 5 tables (y/n)?
y
5 tables successfully dropped
HBase关闭
exit
可以通过键入exit命令退出shell。1
hbase(main):021:0> exit
停止HBase
要停止HBase,浏览进入到HBase主文件夹,然后键入以下命令。1
./bin/stop-hbase.sh
HBase创建数据
本章将介绍如何在HBase表中创建的数据。要在HBase表中创建的数据,可以下面的命令和方法:
- put 命令,
- add() - Put类的方法
- put() - HTable 类的方法.
作为一个例子,我们将在HBase中创建下表。
使用put命令,可以插入行到一个表。它的语法如下:1
put ’<table name>’,’row1’,’<colfamily:colname>’,’<value>’
插入第一行
将第一行的值插入到emp表如下所示。1
2
3
4
5
6
7
8
9hbase(main):005:0> put 'emp','1','personal data:name','raju'
0 row(s) in 0.6600 seconds
hbase(main):006:0> put 'emp','1','personal data:city','hyderabad'
0 row(s) in 0.0410 seconds
hbase(main):007:0> put 'emp','1','professional
data:designation','manager'
0 row(s) in 0.0240 seconds
hbase(main):007:0> put 'emp','1','professional data:salary','50000'
0 row(s) in 0.0240 seconds
以相同的方式使用put命令插入剩余的行。如果插入完成整个表格,会得到下面的输出。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33hbase(main):022:0> scan 'emp'
ROW COLUMN+CELL
1 column=personal data:city, timestamp=1417524216501, value=hyderabad
1 column=personal data:name, timestamp=1417524185058, value=ramu
1 column=professional data:designation, timestamp=1417524232601,
value=manager
1 column=professional data:salary, timestamp=1417524244109, value=50000
2 column=personal data:city, timestamp=1417524574905, value=chennai
2 column=personal data:name, timestamp=1417524556125, value=ravi
2 column=professional data:designation, timestamp=1417524592204,
value=sr:engg
2 column=professional data:salary, timestamp=1417524604221, value=30000
3 column=personal data:city, timestamp=1417524681780, value=delhi
3 column=personal data:name, timestamp=1417524672067, value=rajesh
3 column=professional data:designation, timestamp=1417524693187,
value=jr:engg
3 column=professional data:salary, timestamp=1417524702514,
value=25000
HBase更新数据
可以使用put命令更新现有的单元格值。按照下面的语法,并注明新值,如下图所示。1
put ‘table name’,’row ’,'Column family:column name',’new value’
新给定值替换现有的值,并更新该行。
示例
假设HBase中有一个表emp拥有下列数据
1 | hbase(main):003:0> scan 'emp' |
以下命令将更新名为“Raju’员工的城市值为’Delhi’。1
2hbase(main):002:0> put 'emp','row1','personal:city','Delhi'
0 row(s) in 0.0400 seconds
更新后的表如下所示,观察这个城市Raju的值已更改为“Delhi”。1
2
3
4
5
6
7hbase(main):003:0> scan 'emp'
ROW COLUMN+CELL
row1 column=personal:name, timestamp=1418035791555, value=raju
row1 column=personal:city, timestamp=1418274645907, value=Delhi
row1 column=professional:designation, timestamp=141857555,value=manager
row1 column=professional:salary, timestamp=1418039555, value=50000
1 row(s) in 0.0100 seconds
HBase读取数据
get命令和HTable类的get()方法用于从HBase表中读取数据。使用 get 命令,可以同时获取一行数据。它的语法如下:1
get ’<table name>’,’row1’
下面的例子说明如何使用get命令。扫描emp表的第一行。1
2
3
4
5
6
7
8
9
10
11
12
13hbase(main):012:0> get 'emp', '1'
COLUMN CELL
personal : city timestamp=1417521848375, value=hyderabad
personal : name timestamp=1417521785385, value=ramu
professional: designation timestamp=1417521885277, value=manager
professional: salary timestamp=1417521903862, value=50000
4 row(s) in 0.0270 seconds
读取指定列
下面给出的是语法,使用get方法读取指定列。
1 | hbase>get 'table name', ‘rowid’, {COLUMN => ‘column family:column name ’} |
下面给出的示例,是用于读取HBase表中的特定列。1
2
3
4
5
6
7hbase(main):015:0> get 'emp', 'row1', {COLUMN=>'personal:name'}
COLUMN CELL
personal:name timestamp=1418035791555, value=raju
1 row(s) in 0.0080 seconds
HBase删除数据
从表删除特定单元格
使用 delete 命令,可以在一个表中删除特定单元格。 delete 命令的语法如下:1
delete ‘<table name>’, ‘<row>’, ‘<column name >’, ‘<time stamp>’
下面是一个删除特定单元格和例子。在这里,我们删除salary1
2
3hbase(main):006:0> delete 'emp', '1', 'personal data:city',
1417521848375
0 row(s) in 0.0060 seconds
删除表的所有单元格
使用“deleteall”命令,可以删除一行中所有单元格。下面给出是 deleteall 命令的语法。1
deleteall ‘<table name>’, ‘<row>’
这里是使用“deleteall”命令删去 emp 表 row1 的所有单元的一个例子。1
2hbase(main):007:0> deleteall 'emp','1'
0 row(s) in 0.0240 seconds
使用scan命令验证表。表被删除后的快照如下。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19hbase(main):022:0> scan 'emp'
ROW COLUMN+CELL
2 column=personal data:city, timestamp=1417524574905, value=chennai
2 column=personal data:name, timestamp=1417524556125, value=ravi
2 column=professional data:designation, timestamp=1417524204, value=sr:engg
2 column=professional data:salary, timestamp=1417524604221, value=30000
3 column=personal data:city, timestamp=1417524681780, value=delhi
3 column=personal data:name, timestamp=1417524672067, value=rajesh
3 column=professional data:designation, timestamp=1417523187, value=jr:engg
3 column=professional data:salary, timestamp=1417524702514, value=25000
HBase扫描 - HBase教程™
scan 命令用于查看HTable数据。使用 scan 命令可以得到表中的数据。它的语法如下:1
scan ‘<table name>’
下面的示例演示了如何使用scan命令从表中读取数据。在这里读取的是emp表。1
2
3
4
5
6
7
8
9
10
11
12
13hbase(main):010:0> scan 'emp'
ROW COLUMN+CELL
1 column=personal data:city, timestamp=1417521848375, value=hyderabad
1 column=personal data:name, timestamp=1417521785385, value=ramu
1 column=professional data:designation, timestamp=1417585277,value=manager
1 column=professional data:salary, timestamp=1417521903862, value=50000
1 row(s) in 0.0370 seconds
HBase计数和截断
count
可以使用count命令计算表的行数量。它的语法如下:1
count ‘<table name>’
删除第一行后,表emp就只有两行。验证它,如下图所示。1
2
3hbase(main):023:0> count 'emp'
2 row(s) in 0.090 seconds
=> 2
truncate
此命令将禁止删除并重新创建一个表。truncate 的语法如下:1
hbase> truncate 'table name'
下面给出是 truncate 命令的例子。在这里,我们已经截断了emp表。1
2
3
4
5hbase(main):011:0> truncate 'emp'
Truncating 'one' table (it may take a while):
- Disabling table...
- Truncating table...
0 row(s) in 1.5950 seconds
截断表之后,使用scan 命令来验证。会得到表的行数为零。1
2
3hbase(main):017:0> scan ‘emp’
ROW COLUMN+CELL
0 row(s) in 0.3110 seconds
HBase安全
我们可以授予和撤销HBase用户的权限。也有出于安全目的,三个命令:grant, revoke 和 user_permission.。
grant
grant命令授予特定的权限,如读,写,执行和管理表给定一个特定的用户。 grant命令的语法如下:1
hbase> grant <user> <permissions> [<table> [<column family> [<column; qualifier>]]
我们可以从RWXCA组,其中给予零个或多个特权给用户
R - 代表读取权限
W - 代表写权限
X - 代表执行权限
C - 代表创建权限
A - 代表管理权限
下面给出是为用户“Tutorialspoint’授予所有权限的例子。1
hbase(main):018:0> grant 'Tutorialspoint', 'RWXCA'
revoke
revoke命令用于撤销用户访问表的权限。它的语法如下:1
hbase> revoke <user>
下面的代码撤消名为“Tutorialspoint”用户的所有权限。1
hbase(main):006:0> revoke 'Tutorialspoint'
user_permission
此命令用于列出特定表的所有权限。 user_permission的语法如下:1
hbase>user_permission ‘tablename’
下面的代码列出了“emp”表的所有用户权限。1
hbase(main):013:0> user_permission 'emp'