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
- 简单,容易上手(提供了类似sql查询语言HQL)
- 为超大数据集设计的计算/扩展能力(MR作为计算引擎,HDFS作为存储系统)
- 统一的元数据管理(可与Pig、Presto、impala、SparkSQL等共享元数据)
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 是构建在Hadoop之上的一个数据仓库,实际工作中,我们的Hadoop是肯定是集群,但Hive我们只需要装在一台服务上即可,元数据默认存放在Derby中,Derby是一个单用户,使用起来不是很方便,建议我们自己装一个mysql数据库,专门用于存放hive的元数据信息。
生产环境
生产环境中与测试环境不相同的之处就是mysql用的是主备,当一台mysql服务挂掉了,通过某种机制它会自动切换到另一台,其实这样做的好处就是为了容错,保证高可用,防止hive的元数据丢失
与关系型数据库的区别
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 表名;