一起学Hive

Hive是基于Hadoop的一个数据仓库工具.

基本概念

  1. Hive是基于Hadoop的一个数据仓库工具,
  • 通过他可以实现将结构化的数据文件映射为一张数据库表,并提供简单的sql查询功能,同时将sql语句转换为MapReduce任务进行运行。
  • 数据仓库是面向主题的, 数据一般不会去更新的, 我们只需要对数据做一些查询操作.
  • Hive是建立在Hadoop HDFS上的数据仓库基础架构.
  • Hive定义了简单的类似sqlc查询语言, 称为HQL, 即允许熟悉sql的用户来查询数据.
  • Hive的表就是hdfs中的目录.而Hive表中的数据就是hdfs中的文件.

Hive体系结构

Hive中元数据

Hive将元数据存储在数据库中(metastore),支持mysql, derby等数据库.

Hive中元数据包括表的名字, 表的列和分区及其属性, 表的属性, 表的数据所在目录等.

HQL的执行过程

解释器, 编译器, 优化器完成了HQL查询语句从词法分析 语法分析 编译 优化 以及查询计划的生成. 生成的查询计划存储在hdfs中, 并在随后有mapreduce调用执行.

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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
hive 1.2.2
wget http://mirrors.hust.edu.cn/apache/hive/stable/apache-hive-1.2.2-bin.tar.gz

tar -zxvf xxx.tar.gz解压即可.

1. 在本地mysql数据库中创建一个hive数据库, 保存hive的元数据.
2. 将mysql的jar包放到hive的lib目录下.
3. 然后在hive目录下conf目录中创建一个hive-site.xml文件
<configuration>
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://127.0.0.1:3306/hive?useSSL=false</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>daejong</value>
</property>
</configuration>
4. 然后输入hive启动, 这样它就会在mysql数据库hive中创建一些必要的元信息.
5. 在hive控制台创建一张表:
hive> create table test1(tid int, tname string);
OK
Time taken: 2.939 seconds
6. 这样再到mysql控制台查看就可以发现
TBLS表下多了一条记录
mysql> select * from TBLS;
+--------+-------------+-------+------------------+---------+-----------+-------+----------+---------------+--------------------+--------------------+
| TBL_ID | CREATE_TIME | DB_ID | LAST_ACCESS_TIME | OWNER | RETENTION | SD_ID | TBL_NAME | TBL_TYPE | VIEW_EXPANDED_TEXT | VIEW_ORIGINAL_TEXT |
+--------+-------------+-------+------------------+---------+-----------+-------+----------+---------------+--------------------+--------------------+
| 1 | 1516453023 | 1 | 0 | Daejong | 0 | 1 | test1 | MANAGED_TABLE | NULL | NULL |
+--------+-------------+-------+------------------+---------+-----------+-------+----------+---------------+--------------------+--------------------+
1 row in set (0.00 sec)

COLUMNS_V2表也存储这字段的元信息
mysql> select * from COLUMNS_V2;
+-------+---------+-------------+-----------+-------------+
| CD_ID | COMMENT | COLUMN_NAME | TYPE_NAME | INTEGER_IDX |
+-------+---------+-------------+-----------+-------------+
| 1 | NULL | tid | int | 0 |
| 1 | NULL | tname | string | 1 |
+-------+---------+-------------+-----------+-------------+
2 rows in set (0.00 sec)

至此hive的安装配置就已经成功了.

官网配置链接

Hive的管理

Hive的启动方式

CLI(命令行方式)

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
40
41
42
43
44
45
1. 直接输入hive进入hive命令行模式, 也可以 hive --service cli
2. ctrl + l 清屏 或者!clear
3. show tables; 查看所有表
4. show functions; 查看内置函数
5. 命令后面使用 --注释 表示注释
6. desc test1; 查看表的结构:
OK
tid int
tname string
Time taken: 0.34 seconds, Fetched: 2 row(s)
7. 查看hdfs上的文件 dfs -ls 目录
dfs -ls -R /user/hive 保存着hive仓库所有数据.
8. 执行linux操作命令: -命令 如: -ls -pwd
9. 执行HQL语句 select ***** from ****
hive> select * from test1;
OK
22 daejong
23 dottie
Time taken: 0.16 seconds, Fetched: 2 row(s)
10. 也可以source 执行sql脚本 source /my.sql
11. 插入一条数据: insert into test1 values(23, 'dottie');
看打印信息 可以hive是将hql转化成mapreduce中的job提交到hadoop上执行.
Query ID = Daejong_20180120211903_02751ead-9870-4e23-96b2-be70b5d1eba1
Total jobs = 3
Launching Job 1 out of 3
Number of reduce tasks is set to 0 since there's no reduce operator
Job running in-process (local Hadoop)
2018-01-20 21:19:05,919 Stage-1 map = 100%, reduce = 0%
Ended Job = job_local1179435079_0002
Stage-4 is selected by condition resolver.
Stage-3 is filtered out by condition resolver.
Stage-5 is filtered out by condition resolver.
Moving data to: hdfs://0.0.0.0:9000/user/hive/warehouse/test1/.hive-staging_hive_2018-01-20_21-19-03_714_8751382881311020303-1/-ext-10000
Loading data to table default.test1
Table default.test1 stats: [numFiles=2, numRows=2, totalSize=21, rawDataSize=19]
MapReduce Jobs Launched:
Stage-Stage-1: HDFS Read: 90 HDFS Write: 180 SUCCESS
Total MapReduce CPU Time Spent: 0 msec
OK
Time taken: 2.561 seconds


12. 也可以直接在终端中中(而不需要进入hive的命令行), 输入
hive -e 'show tables'
13. 进入hive命令行时: 输入hive -S 参数表示静默模式(执行查询时, 查询过程不输出), 这样我们就可以清楚的看到输出的结果.

Web界面方式

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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
命令行中输入: hive --service hwi
提示: apache-hive-1.2.2-bin/lib/hive-hwi-*.war: No such file or directory
因为该war包不存在, 所以我们要去找该war包.

下载hive的源码包. src.tar.gz
hive 1.2.2src.tar.gz
wget http://mirrors.hust.edu.cn/apache/hive/stable/apache-hive-1.2.2-src.tar.gz
解压:
tar -zxvf apache-hive-1.2.2-src.tar.gz

进入apache-hive-1.2.2-src/hwi/web
该web目录就是web管理界面jsp的文件夹.
使用jar命令为web目录打包成war包
jar cvfM0 hive-hwi-1.2.2.war -C web/ .
然后web目录下就会多了个war包: hive-hwi-1.2.2.war
将该war包拷贝到hive的lib目录下 cp 拷贝命令


配置hive的conf下的hive-site.xml文件.
<property>
<name>hive.hwi.listen.host</name>
<value>0.0.0.0</value>
<description>This is the host address the Hive Web Interface will listen on</description>
</property>

<property>
<name>hive.hwi.listen.port</name>
<value>9999</value>
<description>This is the port the Hive Web Interface will listen on</description>
</property>

<property>
<name>hive.hwi.war.file</name>
<value>lib/hive-hwi-1.2.2.war</value>
<description>This is the WAR file with the jsp content for Hive Web Interface</description>
</property>

最后一步拷贝jdk/lib下的tools.jar 到 hive/lib
还有jasper-compiler-5.1.12.jar和 jasper-runtime-5.5.12.jar以及commons-el-1.0.jar拷贝到hive/lib下.

最后启动web ui管理工具
hive --service hwi

访问 ip:9999/hwi访问web ui

然后点击左侧create session开启一个会话, 执行查询操作(只能进行查询操作)
输入hql和查询后结果放到文件的名称.
结果如下:
22 daejong
23 dottie

也可以点击左侧的 Browse Schema查看数据库,
开始我们有一个default数据库, 里面有一张我们创建的test1表.

官网配置链接

远程服务启动方式

1
2
启动远程服务: 端口是10000
hive --service hiveserver