HBase是一种分布式、面向列的NoSQL数据库,基于HDFS存储,以表的形式存储数据,表由行和列组成,列划分到列族中。HBase不提供类SQL查询语言,要想像SQL这样查询数据,可以使用Phonix,让SQL查询转换成hbase的扫描和对应的操作,也可以使用现在说讲Hive仓库工具,让HBase作为Hive存储。
Hive是运行在Hadoop之上的数据仓库,将结构化的数据文件映射为一张数据库表,提供简单类SQL查询语言,称为HQL,并将SQL语句转换成MapReduce任务运算。有利于利用SQL语言查询、分析数据,适于处理不频繁变动的数据。Hive底层可以是HBase或者HDFS存储的文件。
两者都是基于Hadoop上不同的技术,相互结合使用,可处理企业中不同类型的业务,利用Hive处理非结构化离线分析统计,利用HBase处理在线查询。
Hive三种元数据存储方式:
1>.本地derby存储,只允许一个用户连接Hive,适用于测试环境
2>.本地/远程MySQL存储,支持多用户连接Hive,适用于生产环境
三、Hive安装与配置(以下将元数据存储到远程MySQL配置)
1.在MySQL创建Hive元数据存放库和连接用户
1
2
3
|
mysql> create database hive;
mysql> grant all on *.* to
'hive'
@
'%'
identified by
'hive'
;
mysql> flush privileges;
|
2.安装与配置Hive(在HMaster0安装)
1
2
|
# tar zxvf apache-hive-1.2.0-bin.tar.gz
# mv apache-hive-1.2.0-bin /opt
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
# vi hive-site.xml
<configuration>
<!--以下是MySQL连接信息-->
<property>
<name>javax.jdo.option.ConnectionURL<
/name
>
<value>jdbc:mysql:
//192
.168.18.210:3306
/hive
?createDatabaseIfNotExist=
true
<
/value
>
<
/property
>
<property>
<name>javax.jdo.option.ConnectionDriverName<
/name
>
<value>com.mysql.jdbc.Driver<
/value
>
<
/property
>
<property>
<name>javax.jdo.option.ConnectionUserName<
/name
>
<value>hive_user<
/value
>
<
/property
>
<property>
<name>javax.jdo.option.ConnectionPassword<
/name
>
<value>hive_pass<
/value
>
<
/property
>
<
/configuration
>
|
3.配置系统变量
1
2
3
4
5
|
# vi /etc/profile
HIVE_HOME=
/opt/apache-hive-1
.2.0-bin
PATH=$PATH:$HIVE_HOME
/bin
export
HIVE_HOME PATH
# source /etc/profile
|
4.启动Hive
1
|
# hive --service metastore & #启动远程模式,否则你只能在本地登录
|
5.检查是否正常启动
查看进程是否启动:
1
2
3
4
5
6
7
|
[root@HMaster0 ~]
# jps
2615 DFSZKFailoverController
30027 ResourceManager
29656 NameNode
25451 Jps
10270 HMaster
14975 RunJar
#会启动一个RunJar进程
|
执行hive命令会进入命令界面:
1
2
3
4
5
6
|
[root@HMaster0 ~]
# hive
Logging initialized usingconfiguration
in
file
:
/opt/apache-hive-1
.2.0-bin
/conf/hive-log4j
.properties
hive> show databases;
OK
default
Time taken: 0.986 seconds,Fetched: 1 row(s)
|
查看数据库,默认有一个default库,现在就可以用你熟悉的SQL语言了。
6.客户端连接Hive(必须有Hadoop环境)
1
2
|
# tar zxvf apache-hive-1.2.0-bin.tar.gz
# mv apache-hive-1.2.0-bin /opt
|
1
2
3
4
5
6
7
8
|
# vi hive-site.xml
<configuration>
<!--通过thrift方式连接hive-->
<property>
<name>hive.metastore.uris<
/name
>
<value>thrift:
//192
.168.18.215:9083<
/value
>
<
/property
>
<
/configuration
>
|
配置好连接信息,连接命令行:
1
|
# /opt/apache-hive-1.2.0-bin/bin/hive
|
7.Hive常用SQL命令
7.1 先创建一个测试库
1
|
hive> create database
test
;
|
7.2 创建tb1表,并指定字段分隔符为tab键(否则会插入NULL)
1
|
hive> create table tb1(
id
int,name string)row
format
delimited fields terminated by
'\t'
|
如果想再创建一个表,而且表结构和tb1一样,可以这样:
1
|
hive> create table tb3 like tb1;
|
查看下表结构:
1
2
3
4
5
|
hive> describe tb3;
OK
id
int
name string
Time taken: 0.091 seconds, Fetched: 2 row(s)
|
7.3 从本地文件中导入数据到Hive表
先创建数据文件,键值要以tab键空格:
1
2
3
4
|
# cat kv.txt
1 zhangsan
2 lisi
3 wangwu
|
再导入数据:
1
|
hive> load data
local
inpath
'/root/kv.txt'
overwrite into table tb1;
|
7.4 从HDFS中导入数据到Hive表
1
2
3
4
5
|
# hadoop fs -cat /kv.txt #查看hdfs中要导入的数据
1 zhangsan
2 lisi
3 wangwu
hive> load data inpath
'/kv.txt'
overwrite into table tb1;
|
7.5 查询是否导入成功
1
2
3
4
5
6
|
hive>
select
* from tb1;
OK
1 zhangsan
2 lisi
3 wangwu
Time taken: 0.209 seconds,Fetched: 3 row(s)
|
博客地址:http://lizhenliang.blog.51cto.com
上面是基本表的简单操作,为了提高处理性能,Hive引入了分区机制,那我们就了解分区表概念:
1>.分区表是在创建表时指定的分区空间
2>.一个表可以有一个或多个分区,意思把数据划分成块
3>.分区以字段的形式在表结构中,不存放实际数据内容
分区表优点:将表中数据根据条件分配到不同的分区中,缩小查询范围,提高检索速度和处理性能。
单分区表:
7.6 创建单分区表tb2(HDFS表目录下只有一级目录):
1
|
hive> create table tb2(idint,name string) partitioned by (dt string) row
format
delimited fieldsterminated by
'\t'
;
|
注:dt可以理解为分区名称。
7.7 从文件中把数据导入到Hive分区表,并定义分区信息
1
2
|
hive> load data
local
inpath
'/root/kv.txt'
into table tb2 partition (dt=
'2015-06-26'
);
hive> load data
local
inpath
'/root/kv.txt'
into table tb2 partition (dt=
'2015-06-27'
);
|
7.8 查看表数据
1
2
3
4
5
6
7
8
9
|
hive>
select
* from tb2;
OK
1 zhangsan 2015-06-26
2 lisi 2015-06-26
3 wangwu 2015-06-26
1 zhangsan 2015-06-27
2 lisi 2015-06-27
3 wangwu 2015-06-27
Time taken: 0.223 seconds,Fetched: 6 row(s)
|
7.9 查看HDFS仓库中表目录变化
1
2
3
4
5
|
# hadoop fs -ls -R /user/hive/warehouse/test.db/tb2
drwxr-xr-x - root supergroup 0 2015-06-26 04:12
/user/hive/warehouse/test
.db
/tb2/dt
=2015-06-26
-rwxr-xr-x 3 root supergroup 27 2015-06-26 04:12
/user/hive/warehouse/test
.db
/tb2/dt
=2015-06-26
/kv
.txt
drwxr-xr-x - root supergroup 0 2015-06-26 04:15
/user/hive/warehouse/test
.db
/tb2/dt
=2015-06-27
-rwxr-xr-x 3 root supergroup 27 2015-06-26 04:15
/user/hive/warehouse/test
.db
/tb2/dt
=2015-06-27
/kv
.txt
|
可以看到tb2表导入的数据根据日期将数据划分到不同目录下。
多分区表:
7.10 创建多分区表tb3(HDFS表目录下有一级目录,一级目录下再有子级目录)
1
|
hive> create table tb3(idint,name string) partitioned by (dt string,location string) row formatdelimited fields terminated by
'\t'
;
|
7.11 从文件中把数据导入到Hive分区表,并定义分区信息
1
2
|
hive> load data
local
inpath
'/root/kv.txt'
into table tb3 partition (dt=
'2015-06- 26'
,location=
'beijing'
);
hive> load data
local
inpath
'/root/kv.txt'
into table tb3 partition (dt=
'2015-06-27'
,location=
'shanghai'
);
|
7.12 查看表数据
1
2
3
4
5
6
7
8
9
|
hive>
select
* from tb3;
OK
1 zhangsan 2015-06-26 beijing
2 lisi 2015-06-26 beijing
3 wangwu 2015-06-26 beijing
1 zhangsan 2015-06-26 shanghai
2 lisi 2015-06-26 shanghai
3 wangwu 2015-06-26 shanghai
Time taken: 0.208 seconds,Fetched: 6 row(s)
|
7.13 查看HDFS仓库中表目录变化
1
|
<span style=
"color:rgb(0,0,0);"
>
# hadoop fs -ls -R /user/hive/warehouse/test.db/tb3<br> drwxr-xr-x - root supergroup 0 2015-06-26 04:35/user/hive/warehouse/test.db/tb3/dt=2015-06-26<br> drwxr-xr-x - root supergroup 0 2015-06-26 04:35 /user/hive/warehouse/test.db/tb3/dt=2015-06-26/location=beijing<br> -rwxr-xr-x 3 root supergroup 27 2015-06-26 04:35/user/hive/warehouse/test.db/tb3/dt=2015-06-26/location=beijing/kv.txt<br> drwxr-xr-x - root supergroup 0 2015-06-26 04:45 /user/hive/warehouse/test.db/tb3/dt=2015-06-27<br> drwxr-xr-x - root supergroup 0 2015-06-26 04:45/user/hive/warehouse/test.db/tb3/dt=2015-06-27/location=shanghai<br> -rwxr-xr-x 3 root supergroup 27 2015-06-26 04:45/user/hive/warehouse/test.db/tb3/dt=2015-06-27/location=shanghai/kv.txt<br></span>
|
可以看到表中一级dt分区目录下又分成了location分区。
7.14 查看表分区信息
1
|
hive> show partitions tb2;
|
7.15 根据分区查询数据
1
|
hive>
select
name from tb3 where dt=
'2015-06-27'
;
|
7.16 重命名分区
1
|
hive> alter table tb3 partition (dt=
'2015-06-27'
,location=
'shanghai'
) rename to partition(dt=
'20150627'
,location=
'shanghai'
);
|
7.17 删除分区
1
|
hive> alter table tb3 droppartition (dt=
'2015-06-26'
,location=
'shanghai'
);
|
7.18 模糊搜索表
1
|
hive> show tables
'tb*'
;
|
7.19 给表新添加一列
1
|
hive> alter table tb1 addcolumns (commnet string);
|
7.20 重命名表
1
|
hive> alter table tb1 rename to new_tb1;
|
7.21 删除表
1
|
hive> drop table new_tb1;
|
8.启动过程中遇到错误
报错1:
[ERROR]Terminal initialization failed; falling back to unsupported
java.lang.IncompatibleClassChangeError:Found class jline.Terminal, but interface was expected
解决方法,将hive/lib下jline包拷贝到hadoop/yarn/lib下:
1
2
|
# cp /opt/apache-hive-1.2.0-bin/lib/jline-2.12.jar /opt/hadoop-2.6.0/share/hadoop/yarn/lib/
# rm /opt/hadoop-2.6.0/share/hadoop/yarn/lib/jline-0.9.94.jar
|
报错2:
javax.jdo.JDOFatalInternalException:Error creating transactional connection factory
解决方法,在百度下载java连接MySQL包放到hive/lib下:
1
|
# cp mysql-connector-java-5.1.10-bin.jar /opt/apache-hive-1.2.0-bin/lib
|