Hive 概述及体系架构

Hive产生背景

(1)MapReduce编程的不便性

(2)传统RDBMS人员的需要

Hive 是什么

(1).由Facebook开源,最初用于解决海量结构化的日志数据统计问题 
 (2).是一个构建在Hadoop之上的数据仓库 
 (3).Hive定义了一种类似于SQL查询语言:HQL(非常类似于MySQL中的SQL语句,同时做了扩展) 
 (4).通常用于离线数据处理(采用MapReduce) 
 (5).可以认为是一个HQL=>MapReduce的语言翻译器 
 (6).底层支持多种不同的执行引擎(默认是MapReduce) 
 (7).支持不同的压缩格式、存储格式以及自定义函数 
 (8).Hive中的数据库及表就是HDFS中的目录/文件夹,数据是文件,元数据信息可以存储在任意的一个关系型数据库中(比如:MySQL、SqlServer、Oracle等,默认是Derby),数据存储在HDFS中

为什么要使用 Hive

  1. 简单,容易上手(提供了类似sql查询语言HQL)
  2. 为超大数据集设计的计算/扩展能力(MR作为计算引擎,HDFS作为存储系统)
  3. 统一的元数据管理(可与Pig、Presto、impala、SparkSQL等共享元数据)

Hive 的体系架构

hive 怎么设置引擎_hive的概述及搭建

用户接口:Client 
Cli(Command-line shell),及shell 命令行,hive1的客户端,hive server2 提供了新的命令beeline 
JDBC/ODBC,通过Java来访问hive,与传统数据库JDBC的方式类型,比如我们使用Java通过JDBC访问操作MySQL 
WebUI,浏览器中访问hive

元数据:metastore 
Hive 将元数据存储在数据库中(metastore),数据库可以为关系型数据库中的任意一种,元数据包括:表名、表所属数据库、表的拥有者、列/分区字段、表的类型、表数据所在目录。

驱动器:driver 
包含:解析器、编译器、优化器、执行器 
完成 HQL 查询语句从词法分析、语法分析、编译、优化以及查询计划(plan)的生成,生成的查询计划存储在 HDFS 中,并在随后有 MapReduce 调用执行

Hadoop 
使用hdfs进行数据存储,运行在yarn上,使用mapreduce进行计算

 

Hive 部署架构

测试环境

hive 怎么设置引擎_Hive_02

Hive 是构建在Hadoop之上的一个数据仓库,实际工作中,我们的Hadoop是肯定是集群,但Hive我们只需要装在一台服务上即可,元数据默认存放在Derby中,Derby是一个单用户,使用起来不是很方便,建议我们自己装一个mysql数据库,专门用于存放hive的元数据信息。

生产环境

hive 怎么设置引擎_Hive_03

生产环境中与测试环境不相同的之处就是mysql用的是主备,当一台mysql服务挂掉了,通过某种机制它会自动切换到另一台,其实这样做的好处就是为了容错,保证高可用,防止hive的元数据丢失

与关系型数据库的区别

hive 怎么设置引擎_hive的概述及搭建_04

hive的优缺点 
优点: 
容易上手、易用,比用MapReduce编程简单很多 
数据离线处理,比如日志分析,海量数据结构化分析 
底层基于hadoop,易于扩展

缺点: 
Hive执行延迟比较高,不适合实时查询 
Hive优势在于处理大数据集,对于小数据集没有优势

二、环境搭建

Hive中的元数据默认存放在Derby中,Derby是单用户的,使用起来不方便,我们使用MySQL来存储Hive的元数据信息,元数据包括表的名字,表的列和分区及其属性,表的属性(是否为外部表等),表的数据所在目录等。 由于Hive的元数据需要不断的更新、修改,而HDFS系统中的文件是多读少改的,这显然不能将Hive的元数据存储在HDFS中

安装mysql

直接使用yum -y install 命令安装mysql是无法安装mysql的高级版本, 需要先安装带有可用的mysql5系列社区版资源的rpm包,去mysql的官网下载即可

MySQL官网:https://dev.mysql.com/downloads/file/?id=470281 
MySQL安装教程官网:https://dev.mysql.com/doc/mysql-yum-repo-quick-guide/en/

下载完成后使用xshell上传到linux,输入如下命令安装

$ sudo rpm -Uvh mysql57-community-release-el7-11.noarch.rpm
安装完成后,查看mysql安装版本列表
$ yum repolist all | grep mysql 
安装mysql,只需要安装mysql-community-server即可,yum会自动检测安装依赖包
$ sudo yum -y install mysql-community-server
安装完成后,启动mysql
$ sudo systemctl start mysqld
mysql安装完成后会有一个初始的密码,输入如下命令查看
$ sudo grep 'temporary password' /var/log/mysqld.log
使用刚刚查看到的密码登录
$ mysql -uroot -p

修改密码

注意,该版本的MySQL对用户密码安全性有所加强,所以设置的密码必须包含至少一个数字、一个大写字母、一个小写字母和一个特殊符号的组合,密码长度至少8个字符。

ALTER USER 'root'@'localhost' IDENTIFIED BY '输入你的密码';

修改完成后,输入exit退出shell界面,使用新密码登录即可

安装hive

从官网下载hive的安装包,官网地址:http://apache.fayea.com/hive/

笔者下载版本为2.3.0,下载完成后上传到linux,输入如下命令解压

$ tar -zvxf apache-hive-2.3.0-bin.tar.gz

配置hive-site.xml文件

进入hive的conf目录下,拷贝文件hive-default.xml.template命名为hive-site.xml

$ cd /home/hadoop/hive
$ cp hive-default.xml.template hive-site.xml
创建hive的临时目录
$ mkdir tmp
hive-site.xml配置如下
<configuration>
<property>
        <name>hive.exec.local.scratchdir</name>
        <value>/home/hadoop//installpkgs/hive`/tmp/hive</value>
    </property>
    <property>
 <name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://localhost:3306/hive_metadata?createDatabaseIfNotExist=true</value>
</property>
<property>jps
<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>Ck@12345</value>
</property>
<property>
<name>hive.cli.print.current.db</name>
<value>true</value>
</property>
</configuration>

注意:在启动前需要将mysql的驱动包复制到hive安装目录的lib目录下,否则在启动时,会报如下错误

DatastoreDriverNotFoundException: The specified datastore 
driver (“com.mysql.jdbc.Driver”) was not found in the CLASSPATH schematool -dbType mysql -initSchema把之前创建的元数据都同步到mysql 里
我们安装的hive版本为2.3.0,既支持hive1,也支持hive2,hive1和2的启动是不一样的,分别如下
hive1$ hive --service metastore # 第一次启动时执行,以后会自动绑定$ hive
hive2$ hiveserver2$ beeline -u jdbc:hive2://
启动成功后登录mysql,可以看到创建了一个数据库hive_metadata(在hive-site.xml参数javax.jdo.option.ConnectionURL中配置)
Show databases;
查看数据库hive_metadata
Show hive_metadata;
输入hive(hive1)进入客户端,查看所有数据库,默认的数据库default
创建一个表测试
create table hellworld(id int,name string) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t';
把测试数据加载进来
lode data local inpath '加载的文件路径' overwrite into table 表名;
查看表的数据是否否导入进来
Select * from 表名;