一、Hive
Hive是一个Hadoop实用工具,为在Hadoop中使用SQL提供了一个界面。
Hive自行维护(通常在本地存储系统中)表定义数据,而将表中的记录存储为HDFS中的文件,并使用Hadoop的MR实现对记录的并行访问(导入、查询)。
准备使用Hive
尽管Hive可以不依赖Hadoop而以本地模式使用,但是结合Hadoop使用通常是Hive的典型使用方式。因此,在使用Hive前,需要有一个可用的Hadoop集群。在Hive的环境配置中通过HADOOP_HOME配置项指定该可用Hadoop集群的部署目录,Hive可以从这里获取Hadoop集群的一些配置信息,如HDFS和MR的访问地址。Hive将所有表记录存放到HDFS的一个目录下,这个目录可以通过配置项hive.metastore.warehouse.dir指定,若不指定则使用默认值。
使用Hive Shell
执行bash脚本bin/hive启动Hive Shell。Hive Shell提供了类似SQL的表创建、删除、加载、查询命令。1)列出已创建的所有表
show tables;
2)创建表
create table t1 (id int, name string); // 不使用partition字段
create table t2 (id int, name string) partitioned by (time string); // 使用partition字段
3)查看表定义
describe t1;
4)删除表
drop table t1;
删除表后,HDFS上已加载到被删除表的数据文件也被一并删除。
5)加载
加载过程仅仅是将指定的数据文件存放到表在HDFS上的对应目录内。
load data local inpath '/data/file/path' overwrite into table t1;
load data local inpath '/data/file/path' overwrite into table t2 partition (time='20130619');
其中,local指示要加载的数据文件在本地文件系统上,若不指定则表示要加载的数据文件在HDFS上;overwrite表示删除已加载的数据文件(同名或不同名都删除),若不指定则不删除(若同名文件已加载,则自动更名新加载的文件)。
6)查询
select name from t1;
select name from t1 where id=1;
select name from t1 where time='20130619'; // where从句中可以使用partition字段
以上查询结果被输出到控制台。但也可以控制输出结果到表、本地目录或HDFS目录,这时需要使用insert关键词。
insert overwrite table t2 select * from t1; // 输出到表
insert overwrite local directory '/output/dir/path' select * from t1; // 以文件的形式输出到本地目录,文件个数取决于Map过程数
insert overwrite directory '/output/dir/path' select * from t1; // 以文件的形式输出到HDFS目录,文件个数取决于Map过程数
二、HBase
HBase是一个面向列的NoSQL数据库。HBase从设计开始就包含了分布式的特点,一方面使用具备水平扩展能力的分布式文件系统(通常是HDFS)存储数据,另一方面将数据动态分配给多个服务器管理,这就使得HBase从上到下整体具备了水平扩展能力。
HBase与Hive都构建在HDFS之上,但是二者的用途不同。Hive的特点是:SQL、仅查询;HBase的特点是:NoSQL、CRUD。这种差异,使得Hive主要面向OLAP应用,而HBase主要面向OLTP应用。
准备使用HBase
1)HBase可以像其他NoSQL数据库一样,使用本地文件系统存储数据。但是HBase的典型使用方式是被配置成分布式模式,使用HDFS存储数据。另外,HBase使用ZooKeeper作为注册中心。因此,在使用HBase前,需要有一个可用的HDFS和ZooKeeper集群。注意:为了简化部署过程,在没有可用ZooKeeper的情况下,也可以让HBase启动程序在启动HBase的同时启动一个ZooKeeper集群,但不能认为这个ZooKeeper集群是HBase的一部分。2)配置项hbase.cluster.distributed指定是否启用HBase的分布式模式;配置项hbase.rootdir指定使用的HDFS的位置以及HBase的数据存放目录;配置项hbase.zookeeper.quorum指定使用的ZooKeeper集群的各个Peer的位置。
3)与Hive不同,HBase像HDFS、MR一样以侍服程序的形式运行,在使用之前需要在各个结点启动相应的侍服程序:HMaster、HRegionServer。若正确配置SSH无口令认证和regionservers文件,可以使用bash脚本方便地启动和停止HBase集群。启动:bin/start-hbase.sh。停止:bin/stop-hbase.sh。
使用HBase Shell
执行“bin/hbase shell”打开HBase Shell。通过HBase Shell可以管理表、操作表中的记录。1)列出已创建的所有表
list
2)创建表
create 't1', 'f1', 'f2', 'f3' // 创建表t1,并预定义了三个列族:f1、f2、f3
create 't1', {NAME => 'f1'}, {NAME => 'f2'}, {NAME => 'f3'} // 这条命令与上条命令等价。在{}中定义列族是更一般的形式,在{}中除了可以指定列族名称,还可指定列族的其他属性。
create 't1', {NAME => 'f1', VERSIONS => 5} // 这条命令除了指定列族名称,还指定了列族中列的版本的最大数量
create 't1', {NAME => 'f1'}, SPLITS => ['2', '4', '6'] // 使用SPLITS指导表分区的Row KEY上下限,若不指定HBase会根据文件大小自动分区
3)删除表
先禁用再删除
disable 't1'
drop 't1'
4)查看表定义
describe 't1'
5)SCAN表
scan 't1' // SCAN所有行、所有列
scan 't1', {COLUMNS => ['f1:c1', 'f1:c2']} // SCAN指定列c1、c2
scan 't1', {COLUMNS => ['f1:c1', 'f1:c2'], LIMIT => 10, STARTROW => '100'} // SCAN指定列、行范围
6)添加或更新
put 't1', 'r1', 'f1:c1', 'value of t1/r1/f1:c1' // 尽管Shell中只能以CELL为单位PUT,但是在HBase实现上是以ROW为单位PUT
put 't1', 'r1', 'f1:c1', 'value of t1/r1/f1:c1' 123456 // 指定一个时间戳作为CELL的版本号
7)查找
get 't1', 'r1' // 取所有存在的列
get 't1', 'r1', {COLUMN => ['f1:c1', 'f1:c2']} // 仅取指定列
get 't1', 'r1', {COLUMN => 'f1:c1', TIMESTAMP => 123456} // 取指定列的指定版本(TIMESTAMP)
8)删除
deleteall 't1', 'r1' // 删除整行
deleteall 't1', 'r1', 'f1:c1' // 删除指定列
deleteall 't1', 'r1', 'f1:c1', 123456 // 删除指定列的指定版本