一、什么是Hive
Hive是建立在Hadoop上的数据仓库基础构架。它提供了一系列的工具,可以用来进行数据提取、转化、加载,可以简称为ETL。
Hive 定义了简单的类SQL查询语言,称为HQL,它允许熟悉SQL的用户直接查询Hadoop中的数据,同 时,这个语言也允许熟悉MapReduce的开发者开发自定义的mapreduce任务来处理内建的SQL函数无法完成的复杂的分析任务。
Hive中包含的有SQL解析引擎,它会将SQL语句转译成M/R Job,然后在Hadoop中执行。
总结:通过这里的分析我们可以了解到Hive可以通过sql查询Hadoop中的数据,并且sql底层也会转化成mapreduce任务,所以hive是基于hadoop的。
二、Hive的数据存储
Hive的数据存储基于Hadoop的 HDFS。
Hive没有专门的数据存储格式。Hive默认可以直接加载文本文件(TextFile),还支持SequenceFile、RCFile等文件格式。针对普通文本数据,我们在创建表时,只需要指定数据的列分隔符与行分隔符,Hive即可解析里面的数据
三、Hive系统架构
- 用户接口:CLI、JDBC\ODBC、WebUI
- 元数据存储(Metastore)关系型数据库如derby、MySQL
- Driver:编译器、优化器、执行器
- Hadoop:用HDFS进行存储、用MapReduce进行计算
3.1、用户接口
- CLI:就是Shell命令行,表示我们可以通过Shell命令操作Hive
- JDBC\ODBC:是Hive的Java操作方式,与使用传统数据库JDBC方式类似
- WebUI:是通过Web页面进行操作
3.2、元数据
表示一个存储系统,Hive中元数据包括表的相关信息,Hive会将这些元数据存储在Metastore中,目前Metastore只支持mysql、derby
3.3、Driver
包含编译器、优化器、执行器可以完成Hive的查询语句从词法分析、语法分析、编译、优化以及查询计划的生成。生成的查询计划最终存储在HDFS中,并在随后由MapReduce调用执行
3.4、Hadoop
Hive会使用HDFS进行存储,利用MapReduce进行计算。Hive的数据存储在HDFS中,大部分的查询由MapReduce完成。
从Hive2开始,官网不建议默认使用MapReduce引擎了,而是建议使用Tez引擎或者Spark引擎。
3.5、大数据引擎的发展历史
-
第一代:MapReduce
-
第二代:Tez
-
第三代:Spark
Spark在当时属于一个划时代的产品,改变了之前基于磁盘的计算思路,而是采用内存计算,就是说Spark把数据读取过来以后,中间的计算结果是不会进磁盘的,一直到出来最终结果,才会写磁盘,这样就大大提高了计算效率
-
第四代:Flink
Flink是一个可以支持纯实时数据计算的计算引擎,在实时计算领域要优于Saprk
3.6、Metastore
Metastore是Hive元数据的集中存放地。Hive 中的元数据包括表的名字,表的列和分区及其属性,表的属性(是否为外部表等),表的数据所在 的hdfs目录等。
Metastore默认使用内嵌的derby数据库Derby数据库的缺点:在同一个目录下一次只能打开一个会话。使用derby存储方式时,Hive会在当前目录生成一个derby.log文件和一个metastore_db目录,metastore_db里面会存储具体的元数据信息。没有办法使用之前的元数据信息了。推荐使用MySQL作为外置存储引擎,可以支持多用户同时访问以及元数据共享。
四、数据库与数据仓库的区别
4.1、Hive VS MySQL
| Hive | MySQL | |
|---|---|---|
| 数据存储位置 | HDFS | 本地磁盘 |
| 数据格式 | 数据格式 | 数据格式 |
| 数据更新 | 不支持(不支持修改和删除) | 支持(支持增删改查) |
| 索引 | 有,但较弱,一般很少用 | 有,经常使用的 |
| 执行 | MapReduce | Executor |
| 执行延迟 | 延迟大 | 延迟小 |
| 可扩展性 | 高 | 低 |
| 数据规模 | 大 | 小 |
4.2、数据库与数据仓库的区别
数据库:传统的关系型数据库主要应用在基本的事务处理,例如银行交易之类的场景。数据库支持增删改查这些常见的操作
数据仓库:主要做一些复杂的分析操作,侧重决策支持,相对数据库而言,数据仓库分析的数据规模要大得多。但是数据仓库只支持查询操作,不支持修改和删除
五、安装Hive
-
解压:
tar -zxvf apache-hive-3.1.3-bin.tar.gz
-
修改配置
接着需要修改配置文件,进入hive的conf目录中,先对这两个模板文件重命名
mv hive-env.sh.template hive-env.sh
mv hive-default.xml.template hive-site.xml
-
在 hive-env.sh 文件的末尾直接增加下面三行内容
export JAVA_HOME=/root/software/jdk1.8.0_341 export HADOOP_HOME=/root/software/hadoop-3.3.4 export HIVE_HOME=/root/software/hive-3.1.3 -
修改hive-site.xml文件
<property> <name>javax.jdo.option.ConnectionURL</name> <value>jdbc:mysql://192.168.0.102:3306/hive?useSSL=false</value> </property> <property> <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>xys6154@</value> </property> <property> <name>hive.querylog.location</name> <value>/root/hive_repo/querylog</value> </property> <property> <name>hive.exec.local.scratchdir</name> <value>/root/hive_repo/scratchdir</value> </property> <property> <name>hive.downloaded.resources.dir</name> <value>/root/hive_repo/resources</value> </property> -
修改hadoop的的core-site.xml
<property> <name>hadoop.proxyuser.root.hosts</name> <value>*</value> </property> <property> <name>hadoop.proxyuser.root.groups</name> <value>*</value> </property> -
初始化Hive的Metastore
bin/schematool -dbType mysql -initSchema
提示报错
-
修改hive-site.xml文件中的第3215行内容有问题
其实就是把hive.txn.xlock.iow对应的description标签内容删掉,这样就可以了
-
初始化完成
-
查看本地的mysql库
注意点:
因为hive链接的数据库的是我本地安装的mysql。所以本地的mysql需要设置远程访问:
-
使用root登录
mysql -uroot -p
-
选择数据库
use mysql;
-
更新域属性,'%'表示允许外部访问
update user set host='%' where user ='root';
-
执行以上语句之后再执行(刷新配置)
FLUSH PRIVILEGES;
-
再执行授权语句
GRANT ALL PRIVILEGES ON . TO 'root'@'%'WITH GRANT OPTION;
还有一点:我本地安装的是5.x版本的mysql。需要把mysql-5.x.jar上传到hive的lib目录文件下。