Hive是一个使用类SQL管理分布式存储上大规模数据集的数据仓库,它提供了命令行工具和JDBC驱动程序帮助用户使用Hive。
hive基于hadoop,它的具体功能如下:
- 通过SQL轻松访问数据的工具,从而实现数据仓库任务,例如提取/转换/加载(ETL),报告和数据分析。
- 一种将结构强加于各种数据格式的机制
- 访问直接存储在Apache HDFS ™ 或其他数据存储系统(例如Apache HBase ™)中的文件
- 通过Apache Tez ™, Apache Spark ™或 MapReduce执行查询
- HPL-SQL的过程语言
- 通过Hive LLAP,Apache YARN和Apache Slider进行亚秒级查询检索。
以上内容来自Apache Hive官网,hive在1.x版本中只支持MapReduce,从2.x开始开始支持其他分布式计算引擎。
接下来,我们来学习如何安装hive和使用它来进行wordcount。
1. Hive安装
这里假设你已经安装好了hadoop,如果还没有安装hadoop,请查看之前的文章,记hadoop伪分布式安装。另外,需要安装mysql/mariadb数据库,用来存储hive的元数据,这里假设数据库在本机,用户名hive,密码root,数据库hive。
1.1 下载解压
从清华大学镜像站下载hive压缩包,将其解压到/usr/local
文件夹下。
tar -zxf apache-hive-2.3.8-bin.tar.gz
mv hive-2.3.8-bin /usr/local
1.2 环境配置
编辑/etc/profile
文件,增加以下内容:
export HIVE_HOME=/usr/local/hive
export PATH=.:$HIVE_HOME/bin::$PATH
编辑后需要重新打开终端才能生效,可以使用命令source /etc/profile
将其生效。
接下来通过查看hive版本确定是否安装成功
代码语言:javascript复制hive --version
Hive 2.3.8
Git git://chaos-mbp.lan/Users/chao/git/hive -r f1e87137034e4ecbe39a859d4ef44319800016d7
Compiled by chao on Thu Jan 7 11:36:26 PST 2021
From source with checksum 2992381e2a287352c65262bf40d3f932
这里可能会报出一个NoSuchMethodException,应该是guava包版本过低引起的,此时需要打开maven仓库下,找到最新版本,点击去,里面有一个files,下载最新包到/usr/local/hive/lib
中即可。
1.3 修改配置文件
主要是配置数据库连接信息,首先将/usr/local/hive/conf/
下的hive-default.xml.template
复制为hive-site.xml
。
接下来在配置文件最上方新增以下配置:
代码语言:javascript复制<configuration>
<!-- WARNING!!! This file is auto generated for documentation purposes ONLY! -->
<!-- WARNING!!! Any changes you make to this file will be ignored by Hive. -->
<!-- WARNING!!! You must make your changes in hive-site.xml instead. -->
<!-- Hive Execution Parameters -->
<!-- 插入一下代码 -->
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>hive</value>
</property>
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>root</value>
</property>
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://localhost:3306/hive</value>
</property>
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>
</property>
<property>
<name>hive.querylog.location</name>
<value>/tmp/hive</value>
<description>Location of Hive run time structured log file</description>
</property>
<property>
<name>hive.exec.local.scratchdir</name>
<value>/tmp/hive</value>
<description>Local scratch space for Hive jobs</description>
</property>
<property>
<name>hive.downloaded.resources.dir</name>
<value>/tmp/${hive.session.id}_resources</value>
<description>Temporary local directory for added resources in the remote file system.</description>
</property>
<!-- 到此结束代码 -->
增加完上述配置后,主要需要查找该配置文件下的同名配置,将其注释。
1.4 初始化
当在配置文件中增加了数据库相关配置,接下来就可以进行初始化操作了。
此时需要将mysql的jdbc驱动程序添加到/usr/local/hive/lib
中,打开maven仓库,找到最新的mysql-connector,点进去,里面有一个files,点击下载即可。
接下来进入到目录/usr/local/hive/bin
,进行如下操作:
schematool -dbType mysql -initSchema --verbose
正常情况下会连接你的数据库,进行初始化表等操作。
操作完成后,输入hive命令,就会进入到操作界面:
代码语言:javascript复制hive
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/usr/local/hive/lib/log4j-slf4j-impl-2.6.2.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/usr/local/hadoop/share/hadoop/common/lib/slf4j-log4j12-1.7.25.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.apache.logging.slf4j.Log4jLoggerFactory]
Logging initialized using configuration in jar:file:/usr/local/hive/lib/hive-common-2.3.8.jar!/hive-log4j2.properties Async: true
Hive-on-MR is deprecated in Hive 2 and may not be available in the future versions. Consider using a different execution engine (i.e. spark, tez) or using Hive 1.X releases.
hive>
2. Hive使用
当hive安装完成后,我们以wordcount为例,来进行简单的hive使用练习。
2.1 库操作
查看库,默认应该是default
代码语言:javascript复制show databases;
创建库
代码语言:javascript复制create database hive_test;
use database hive_test;
此时,在hdfs的指定目录中将会有一个hive_test文件夹。
2.2 表操作
查看表:
代码语言:javascript复制show tables;
创建表:
代码语言:javascript复制create table book(line string);
查看建表语句
代码语言:javascript复制show create table book;
从本机导入数据:
代码语言:javascript复制load data local inpath '/home/hadoop/to_kill_a_mockingbird.txt' overwrite into table book;
查看表数据:
代码语言:javascript复制select count(1) from book;
此时可以看到一共插入表文本行数。
将文本拆分成词,插入到新表中:
代码语言:javascript复制create table words as
select word from (select explode(split(line,' '))as word from book) w ;
这里使用了hive的一个函数explode,它的作用是将一行数据变成一列。
进行wordcount计数:
代码语言:javascript复制select word,count(1) as count from (
select trim(regexp_extract(word,"\W*([a-zA-Z]*)\W*",1)) as word from words
) word_table where word is not null and word != '' group by word order by count desc limit 100;
2.3 学习小结
在提交sql执行后,我们可以看到hive实际上将sql转变成了mapreduce任务,有时会是多个任务的串联。这就是hive的优势,它将大数据分析工作从编写编排mapreduce代码中解放出来,从而让sqlboy也可以进行数据分析。