Hive--概述与使用
本博客主要讲解Hive的特点、Hive的数据存储、数据单元、Hive的系统架构、Hive的metastore。以及安装hive和简单使用,最后修改hive默认的metadata derby为mysql。
认识Hive
Hive
是基于Hadoop
的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供类SQL
查询功能。本质就是将SQL
转换为MapReduce
程序。与关系型数据库的SQL 略有不同,但支持了绝大多数的语句如DDL、DML 以及常见的聚合函数、连接查询、条件查询。HIVE不适合用于联机事务处理,也不提供实时查询功能。它最适合应用在基于大量不可变数据的批处理作业。
- Hive特点
- 支持索引,加快数据查询。
- 不同的存储类型,如数据库、文件、表、视图、索引
- 将元数据保存在关系数据库中,大大减少了在查询过程中执行语义检查的时间。
- 可以直接使用存储在Hadoop 文件系统中的数据。
- 内置大量用户函数UDF 来操作时间、字符串和其他的数据挖掘工具,支持用户扩展UDF 函数来完成内置函数无法实现的操作。
- 类SQL 的查询方式,将SQL 查询转换为MapReduce 的job 在Hadoop集群上执行。
- Hive的数据存储
- 存储基于Hadoop HDFS,没有专门的数据存储格式。
- 存储结构:数据库、文件、表、视图、索引。
- Hive默认可以直接加载文本文件(TextFile),SequenceFile、RCFile (facebook)。
- 在我们创建表时,指定数据的列、行分隔符,Hive就可以解析数据。(当然它有自己默认的行列分隔符’\n’,’\001’)
Hive的数据单元
databases : 数据库,和关系型数据库中一个概念;
tables : 表。和关系型数据库中的表一个概念;
partitions : 分区。将同一组数据存放到一个固定的分区中。
buckets(clusters) : 分桶。对现有数据再进行划分。Hive的系统架构
•用户接口,包括 CLI,JDBC/ODBC,WebUI
•元数据存储,通常是存储在关系数据库如 mysql, derby 中
•解释器、编译器、优化器、执行器
•Hadoop:用 HDFS 进行存储,利用 MapReduce 进行计算Hive的metastore
metastore
: 是hive元数据的集中存放地。metastore
: 默认使用内嵌的derby数据库作为存储引擎Derby
: 引擎的缺点:一次只能打开一个会话(一般使用mysql)
Hive 中的元数据包括表的名字,表的列和分区及其属性,表的属性(是否为外部表等),表的数据所在目录等HiveQL和SQL的对比
安装
- 准备:
- 提前已安装好hadoop
- Hive 下载,作者使用apache-hive-0.14.0-bin.tar.gz
- 安装
解压hive文件,进入$HIVE_HOME/conf/修改文件:
1
2cp hive-env.sh.template hive-env.sh
cp hive-default.xml.template hive-site.xml修改$HIVE_HOME/bin的hive-env.sh,增加以下三行:
1
2
3
4################ 添加环境变量 ,例如#############################
export JAVA_HOME=/usr/local/jdk1.7.0_79
export HIVE_HOME=/opt/hive
export HADOOP_HOME=/usr/local/hadoop-2.6.0修改$HIVE_HOME/conf/hive-site.xml,临时目录
1
2
3
4
5
6
7
8
9
10
11
12
13
14<property>
<name>hive.querylog.location</name>
<value>/opt/hive/tmp</value>
</property>
<property>
<name>hive.exec.local.scratchdir</name>
<value>/opt/hive/tmp</value>
</property>
<property>
<name>hive.downloaded.resources.dir</name>
<value>/opt/hive/tmp</value>
</property>
使用
- 运行hdfs
- 运行:$HIVE_HOME/bin/hive
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[root@xxo07 bin]# hive
Logging initialized using configuration in jar:file:/opt/hive/lib/hive-common-0.14.0.jar!/hive-log4j.properties
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/usr/local/hadoop-2.6.0/share/hadoop/common/lib/slf4j-log4j12-1.7.5.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/opt/hive/lib/hive-jdbc-0.14.0-standalone.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.slf4j.impl.Log4jLoggerFactory]
hive> show databases;
OK
default
Time taken: 0.667 seconds, Fetched: 1 row(s)
hive>
#######################创建表############################
hive> create table t_1(id int);
OK
Time taken: 0.736 seconds
#######################查看表信息########################
hive> desc extended t_1;
OK
id int
Detailed Table Information Table(tableName:t_1, dbName:default, owner:root, createTime:1464418129, lastAccessTime:0, retention:0, sd:StorageDescriptor(cols:[FieldSchema(name:id, type:int, comment:null)], location:hdfs://xxo07:9000/user/hive/warehouse/t_1, inputFormat:org.apache.hadoop.mapred.TextInputFormat, outputFormat:org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat, compressed:false, numBuckets:-1, serdeInfo:SerDeInfo(name:null, serializationLib:org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe, parameters:{serialization.format=1}), bucketCols:[], sortCols:[], parameters:{}, skewedInfo:SkewedInfo(skewedColNames:[], skewedColValues:[], skewedColValueLocationMaps:{}), storedAsSubDirectories:false), partitionKeys:[], parameters:{transient_lastDdlTime=1464418129}, viewOriginalText:null, viewExpandedText:null, tableType:MANAGED_TABLE)
Time taken: 0.787 seconds, Fetched: 3 row(s)
hive> quit;
修改metadata为mysql
以本地mysql为例 , 修改$HIVE_HOME/conf/hive-site.xml ,修改链接url、驱动、账号、密码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://localhost:3306/hive?createDatabaseIfNotExist=true&useUnicode=true&characterEncoding=UTF-8</value>
</property>
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>
</property>
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>root</value>
</property>
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>root</value>
</property>复制mysql驱动jar包到$HIVE_HOME/lib/目录下
可以在这下载:https://blog.csdn.net/qiangqiang816/article/details/81541090初始化数据库命令:schematool -dbType mysql -initSchema
启动。查看mysql数据库
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
39
40mysql> use hive;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> show tables;
+---------------------------+
| Tables_in_hive |
+---------------------------+
| BUCKETING_COLS |
| CDS |
| COLUMNS_V2 |
| DATABASE_PARAMS |
| DBS |
| FUNCS |
| FUNC_RU |
| GLOBAL_PRIVS |
| PARTITIONS |
| PARTITION_KEYS |
| PARTITION_KEY_VALS |
| PARTITION_PARAMS |
| PART_COL_STATS |
| ROLES |
| SDS |
| SD_PARAMS |
| SEQUENCE_TABLE |
| SERDES |
| SERDE_PARAMS |
| SKEWED_COL_NAMES |
| SKEWED_COL_VALUE_LOC_MAP |
| SKEWED_STRING_LIST |
| SKEWED_STRING_LIST_VALUES |
| SKEWED_VALUES |
| SORT_COLS |
| TABLE_PARAMS |
| TAB_COL_STATS |
| TBLS |
| VERSION |
+---------------------------+
29 rows in set (0.00 sec)
- 参考资料:
《Hive编程指南》