Hadoop的数据仓库工具Hive安装与编程实践
重要知识点:
- hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供简单的sql查询功能,可以将sql语句转换为MapReduce任务进行运行。 其优点是学习成本低,可以通过类SQL语句快速实现简单的MapReduce统计,不必开发专门的MapReduce应用,十分适合数据仓库的统计分析。
- Hive是建立在 Hadoop 上的数据仓库基础构架。它提供了一系列的工具,可以用来进行数据提取转化加载(ETL),这是一种可以存储、查询和分析存储在 Hadoop 中的大规模数据的机制。Hive 定义了简单的类 SQL 查询语言,称为 HQL,它允许熟悉 SQL 的用户查询数据。同时,这个语言也允许熟悉 MapReduce 开发者的开发自定义的 mapper 和 reducer 来处理内建的 mapper 和 reducer 无法完成的复杂的分析工作。
- 适用场景:Hive 构建在基于静态批处理的Hadoop 之上,Hadoop 通常都有较高的延迟并且在作业提交和调度的时候需要大量的开销。因此,Hive 并不能够在大规模数据集上实现低延迟快速的查询,例如,Hive 在几百MB 的数据集上执行查询一般有分钟级的时间延迟。因此,Hive 并不适合那些需要低延迟的应用,例如,联机事务处理(OLTP)。Hive 查询操作过程严格遵守Hadoop MapReduce 的作业执行模型,Hive 将用户的HiveQL 语句通过解释器转换为MapReduce 作业提交到Hadoop 集群上,Hadoop 监控作业执行过程,然后返回作业执行结果给用户。Hive 并非为联机事务处理而设计,Hive 并不提供实时的查询和基于行级的数据更新操作。Hive 的最佳使用场合是大数据集的批处理作业,例如,网络日志分析。
实验内容与步骤:
一、Hive的安装与配置
- Hive的下载
网址:http://www.apache.org/dyn/closer.cgi/hive/
建议下载稳定版本 apache-hive-2.3.7-bin.tar.gz
稳定版下载地址:http://mirror.bit.edu.cn/apache/hive/stable-2/
点击下载
下载完成后,会自动下载到Downloads目录下:
- Hive安装
1)解压安装包apache-hive-2.3.7-bin.tar.gz至路径 /opt/,命令如下:
sudo tar -zxvf ./apache-hive-2.3.7-bin.tar.gz -C /opt # 解压到/opt中
2)查看是否解压成功:修改文件夹名为hive,并修改文件夹权限
cd /opt
sudo mv apache-hive-2.3.7-bin hive # 将文件夹名改为hive
sudo chown -R hadoop:hadoop hive # 修改文件权限
注意,上面的hadoop:hadoop是当前系统的用户组和用户名。
3)配置环境变量
将hive下的bin目录添加到path中,这样,启动hive就无需到/opt/hive/bin目录下,大大的方便了hive的使用。编辑/etc/profile文件
sudo vim /etc/profile
如果没有引入过PATH请在/etc/profile文件尾行添加如下内容:
export PATH=$PATH:/opt/hive/bin
如果已经引入过PATH请在export PATH这行追加/opt/hive/bin,也可以先设置HIVE_HOME,在配置PATH。这里的“:”是分隔符。如下图:
编辑完成后,再执行source命令使上述配置在当前终端立即生效,命令如下:
source /etc/profile
- Hive配置
修改/opt/hive/conf下的hive-default.xml
执行如下命令:
cd /opt/hive/conf
mv hive-default.xml.template hive-default.xml
上面命令是将hive-default.xml.template重命名为hive-default.xml;
然后,使用vim编辑器新建一个配置文件hive-site.xml,命令如下:
cd /opt/hive/conf
vim hive-site.xml
在hive-site.xml中添加如下配置信息:
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://localhost:3306/hive?createDatabaseIfNotExist=true&useSSL=false</value>
<description>JDBC connect string for a JDBC metastore</description>
</property>
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>
<description>Driver class name for a JDBC metastore</description>
</property>
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>hive</value>
<description>username to use against metastore database</description>
</property>
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>hive</value>
<description>password to use against metastore database</description>
</property>
</configuration>
然后,按键盘上的“ESC”键退出vim编辑状态,再输入:wq,保存并退出vim编辑器。
二、安装并配置mysql
这里我们采用MySQL数据库保存Hive的元数据,而不是采用Hive自带的derby来存储元数据。
- Ubuntu下mysql的安装:
使用以下命令即可进行mysql安装,注意安装前先更新一下软件源以获得最新版本:
sudo apt-get update #更新软件源
sudo apt-get install mysql-server #安装mysql
上述命令会安装以下包:
apparmor
mysql-client-5.7
mysql-common
mysql-server
mysql-server-5.7
mysql-server-core-5.7
因此无需再安装mysql-client等。安装过程会提示设置mysql root用户的密码,设置完成后等待自动安装即可。默认安装完成就启动了mysql。
启动和关闭mysql服务器:
service mysql start
service mysql stop
进入mysql shell界面:
sudo mysql -u root -p
解决利用sqoop导入MySQL中文乱码的问题(可以插入中文,但不能用sqoop导入中文)
导致导入时中文乱码的原因是character_set_database、character_set_server默认设置是latin1,如下图。
可以单个设置修改编码方式set character_set_server=utf8;但是重启会失效。
如果无法解决,建议重新卸载安装,再试。
Ubuntu18.04完全卸载Mysql 5.7:
sudo apt purge mysql-*
sudo rm -rf /etc/mysql/ /var/lib/mysql
sudo apt autoremove
sudo apt autoclean
(4)登陆MySQL,并查看MySQL目前设置的编码。show variables like “char%”;
- 下载mysql jdbc 包,下载地址:
https://dev.mysql.com/downloads/connector/j/
Shell命令:
tar -zxvf mysql-connector-java-5.1.46.tar.gz #解压
cp mysql-connector-java-5.1.46/mysql-connector-java-5.1.46-bin.jar /opt/hive/lib
#将mysql-connector-java-5.1.46-bin.jar拷贝到/opt/hive/lib目录下
- 启动并登陆mysql shell
service mysql start #启动mysql服务
mysql -u root -p #登陆shell界面
- 新建hive数据库。
mysql> create database hive;
#这个hive数据库与hive-site.xml中localhost:3306/hive的hive对应,用来保存hive元数据
- 配置mysql允许hive接入:
mysql> grant all on *.* to hive@localhost identified by 'hive';
#将所有数据库的所有表的所有权限赋给hive用户,后面的hive是配置hive-site.xml中配置的连接密码
注意:如果找不到hive用户可以修改为自己数据库的用户名和密码。
或者在mysql中手动更新为hive用户和hive密码。
操作命令如下:
mysql> flush privileges; #刷新mysql系统权限关系表
配置允许远程登录:
如果远程连接出错,可以参考:https://ask.csdn.net/questions/758059
6. 启动hive
启动hive之前,请先启动hadoop集群。
start-all.sh #启动hadoop
hive #启动hive
启动进入Hive的交互式执行环境以后,会出现如下命令提示符:
发现报jar包冲突,进入hive的lib包下,删除log4j-slf4j-impl-2.6.2.jar即可。
cd /opt/hive/lib
sudo rm -rf log4j-slf4j-impl-2.6.2.jar
在启动Hive时,有可能会出现Hive metastore database is not initialized的错误,这里给出解决方案。
解决Hive启动,Hive metastore database is not initialized的错误。出错原因:以前曾经安装了Hive或MySQL,重新安装Hive和MySQL以后,导致版本、配置不一致。解决方法是,使用schematool工具。Hive现在包含一个用于 Hive Metastore 架构操控的脱机工具,名为 schematool.此工具可用于初始化当前 Hive 版本的 Metastore 架构。此外,其还可处理从较旧版本到新版本的架构升级。所以,解决上述错误,你可以在终端执行如下命令:
schematool -dbType mysql -initSchema
如果报如下错误:FAILED: SemanticException org.apache.hadoop.hive.ql.metadata.HiveException: java.lang.RuntimeException: Unable to instantiate org.apache.hadoop.hive.ql.metadata.SessionHiveMetaStoreClien
请执行下列命令后在启动hive:
hive --service metastore
- 可以在里面输入SQL语句,如果要退出Hive交互式执行环境,可以输入如下命令:
hive>exit;
三、Hive的常用HiveQL操作
1)Hive基本数据类型
首先,我们简单叙述一下HiveQL的基本数据类型。
Hive支持基本数据类型和复杂类型, 基本数据类型主要有数值类型(INT、FLOAT、DOUBLE ) 、布尔型和字符串, 复杂类型有三种:ARRAY、MAP 和 STRUCT。
(1)创建、修改和删除数据库:
create database if not exists hive; #创建数据库
show databases; #查看Hive中包含数据库
show databases like 'h.*'; #查看Hive中以h开头数据库
describe databases; #查看hive数据库位置等信息
use hive; #切换到hive数据库下
drop database if exists hive; #删除不含表的数据库
drop database if exists hive cascade; #删除数据库和它中的表
注意,除 dbproperties属性外,数据库的元数据信息都是不可更改的,包括数据库名和数据库所在的目录位置,没有办法删除或重置数据库属性。
(2)数据操作
主要实现的是将数据装载到表中(或是从表中导出),并进行相应查询操作,对熟悉SQL语言的用户应该不会陌生。
1)向表中装载数据
这里我们以只有两个属性的简单表为例来介绍。首先创建表stu和course,stu有两个属性id与name,course有两个属性cid与sid。
create table if not exists hive.stu(id int,name string)
row format delimited fields terminated by '\t';
create table if not exists hive.course(cid int,sid int)
row format delimited fields terminated by '\t';
向表中装载数据有两种方法:从文件中导入和通过查询语句插入。下面以从文件导入作为示例:
a.从文件中导入
假如这个表中的记录存储于文件stu.txt中,该文件的存储路径为/bigdata/hadoop-3.1.1/examples/stu.txt,内容如下。
stu.txt:
1 zhangsan
2 lisi
3 wangwu
提示:stu.txt文件中的数据间隔符要和stu表建表时采用的字段分隔符一致,本实验创建stu表时的字段分隔符是Tab健,所以这里的stu.txt文件中的数据之间要用Tab健进行分隔。
下面我们把这个文件中的数据装载到表stu中,操作如下:
load data local inpath '/bigdata/hadoop-3.1.1/examples/stu.txt' overwrite into table stu;
如果stu.txt文件存储在HDFS 上,则不需要 local 关键字。
b.通过查询语句插入
使用如下命令,创建stu1表,它和stu表属性相同,我们要把从stu表中查询得到的数据插入到stu1中:
create table stu1 as select id,name from stu;
如果报了以上错误,请运行以下命令:
set hive.exec.mode.local.auto=true;
再次运行:
create table stu1 as select id,name from stu;
上面是创建表,并直接向新表插入数据;若表已经存在,向表中插入数据需执行以下命令:
insert overwrite table stu1 select id,name from stu;
这里关键字overwrite的作用是替换掉表(或分区)中原有数据,换成into关键字,直接追加到原有内容后。
2)从表中导出数据
a.可以简单拷贝文件或文件夹
命令如下:
hadoop fs -cp source_path target_path;
b.写入临时文件
命令如下:
insert overwrite local directory '/usr/local/hadoop/tmp/stu' select id,name from stu;
查询操作
和SQL的查询完全一样,这里不再赘述。主要使用select…from…where…等语句,再结合关键字group by、having、like、rlike等操作。这里我们简单介绍一下SQL中没有的case…when…then…句式、join操作和子查询操作。
case…when…then…句式和if条件语句类似,用于处理单个列的查询结果,语句如下:
四、Hive简单编程实践
下面我们以词频统计算法为例,来介绍怎么在具体应用中使用Hive。词频统计算法又是最能体现MapReduce思想的算法之一,这里我们可以对比它在MapReduce中的实现,来说明使用Hive后的优势。
MapReduce实现词频统计的代码可以通过下载Hadoop源码后,在 $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.1.jar 包中找到(wordcount类),wordcount类由63行Java代码编写而成。下面首先简单介绍一下怎么使用MapReduce中wordcount类来统计单词出现的次数,具体步骤如下:
1)创建input目录,output目录会自动生成。其中input为输入目录,output目录为输出目录。命令如下:
cd /bigdata/hadoop-3.1.1
mkdir input
2)然后,在input文件夹中创建两个测试文件file1.txt和file2.txt,命令如下:
cd /bigdata/hadoop-3.1.1/input
echo "hello world" > file1.txt
echo "hello hadoop" > file2.txt
3)
下面我们通过HiveQL实现词频统计功能,此时只要编写下面7行代码,而且不需要进行编译生成jar来执行。HiveQL实现命令如下:
create table docs(line string);
load data inpath 'input' overwrite into table docs;
create table word_count as
select word, count(1) as count from
(select explode(split(line,' '))as word from docs) w
group by word
order by word;
如果报了以上错误,请运行以下命令:
set hive.exec.mode.local.auto=true;
再次运行:
create table word_count as
select word, count(1) as count from
(select explode(split(line,' '))as word from docs) w
group by word
order by word;
执行后,用select语句查看,结果如下:
由上可知,采用Hive实现最大的优势是,对于非程序员,不用学习编写Java MapReduce代码了,只需要用户学习使用HiveQL就可以了,而这对于有SQL基础的用户而言是非常容易的。