Hadoop的数据仓库工具Hive安装与编程实践

Hadoop的数据仓库工具Hive安装与编程实践

重要知识点:

  1. hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供简单的sql查询功能,可以将sql语句转换为MapReduce任务进行运行。 其优点是学习成本低,可以通过类SQL语句快速实现简单的MapReduce统计,不必开发专门的MapReduce应用,十分适合数据仓库的统计分析。
  2. Hive是建立在 Hadoop 上的数据仓库基础构架。它提供了一系列的工具,可以用来进行数据提取转化加载(ETL),这是一种可以存储、查询和分析存储在 Hadoop 中的大规模数据的机制。Hive 定义了简单的类 SQL 查询语言,称为 HQL,它允许熟悉 SQL 的用户查询数据。同时,这个语言也允许熟悉 MapReduce 开发者的开发自定义的 mapper 和 reducer 来处理内建的 mapper 和 reducer 无法完成的复杂的分析工作。
  3. 适用场景:Hive 构建在基于静态批处理的Hadoop 之上,Hadoop 通常都有较高的延迟并且在作业提交和调度的时候需要大量的开销。因此,Hive 并不能够在大规模数据集上实现低延迟快速的查询,例如,Hive 在几百MB 的数据集上执行查询一般有分钟级的时间延迟。因此,Hive 并不适合那些需要低延迟的应用,例如,联机事务处理(OLTP)。Hive 查询操作过程严格遵守Hadoop MapReduce 的作业执行模型,Hive 将用户的HiveQL 语句通过解释器转换为MapReduce 作业提交到Hadoop 集群上,Hadoop 监控作业执行过程,然后返回作业执行结果给用户。Hive 并非为联机事务处理而设计,Hive 并不提供实时的查询和基于行级的数据更新操作。Hive 的最佳使用场合是大数据集的批处理作业,例如,网络日志分析。

实验内容与步骤:
一、Hive的安装与配置

  1. 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目录下:
在这里插入图片描述

  1. 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

在这里插入图片描述

  1. 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&amp;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来存储元数据。

  1. 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%”;

在这里插入图片描述

  1. 下载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目录下

在这里插入图片描述

  1. 启动并登陆mysql shell
 service mysql start #启动mysql服务
 mysql -u root -p  #登陆shell界面
  1. 新建hive数据库。
mysql> create database hive;   

#这个hive数据库与hive-site.xml中localhost:3306/hive的hive对应,用来保存hive元数据
在这里插入图片描述

  1. 配置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

在这里插入图片描述

  1. 可以在里面输入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基础的用户而言是非常容易的。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值