1、Hive的来源与介绍
1)Hive是由Facebook开源用于解决海量结构化日志的数据统计。
2)Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张表,并提供类SQL查询功能。
3)总结一句话,Hive的本质是:将HQL转化成MapReduce程序。
4)Hive处理的数据我们一般存储在分布式文件系统HDFS上,由于其执行底层会转换成MapReduce程序,所以需要提前开启Yarn相关的服务。
2、Hive的优缺点
1)优点
(1)提供了类SQL的语法,有SQL基础的开发人员可以快速上手,节省学习成本。
(2)避免了去编写复杂的MapReduce程序,减少了开发人员的成本。
(3)Hive由于底层是MapReduce程序,执行延迟比较高,因此Hive常用于离线数据分析,对实时性要求不高的场景比较适合。
(4)Hive的优势在于处理大数据量的数据,对于处理小数据没有优势,这也是因为Hive的执行延迟比较高。
(5)Hive支持定义一系列的UDF、UDTF等自定义函数,可以根据实际的不同业务要求来实现不同的功能(后面会详细讲这块)
2)缺点
(1)Hive不支持对数据的更新操作,比如修改某个字段的值等操作。
(2)Hive在迭代式计算这块无法做到。
(3)Hive的执行效率比较低,所以一般在开发中我们会替换成Tez或Spark执行引擎。
(4)Hive在调优这块也比较粗粒度,后续也会讲到关于Hive调优这块的知识。
3、Hive的架构原理
1)Hive的客户端:可以通过JDBC/ODBC或者JAVA API的形式来访问、WEBUI(比如框架自带的)、HUE、DBeaver等。
2)元数据(metastore)
(1)Hive的元数据默认是存储在derby数据库中,推荐使用MySQL来存储Hive的元数据信息(可以支持开启多个Hive客户端)。
(2)Hive的元数据包括:表名、表所属的数据库(默认是default)、表的拥有者、列/分区字段、表的类型(分为内部表和外部表)以及表数据所在的目录信息等。
3)使用HDFS来存储Hive的表数据,底层使用的计算引擎是MapReduce。
4)驱动器:Driver
5)解析器(SQL Parser):将SQL字符串转换成抽象语法树AST,这一步一般都用第三方工具库完成,比如antlr;对AST进行语法分析,比如表是否存在、字段是否存在、SQL语义是否有误;
6)编译器(Physical Plan):将解析器生成的AST编译成逻辑执行计划;
7)优化器(Query Optimizer):对整个HQL生成的逻辑执行计划进行优化;
8)执行器(Execution):把逻辑执行计划转换成可以运行的物理计划。对于Hive来说,就是MR/Spark。
4、Hive的安装部署
1)前提准备工作
(1)需要提前安装hadoop相关的服务并启动,比如HDFS、YARN
(2)需要提前安装好MySQL
(1)先去Hive的官网下载所需要的安装包(推荐安装Hive-2.3.4或者Hive-1.2.1版本)下载地址:https://archive.apache.org/dist/hive/
2)Hive的安装部署步骤
(1)解压hive的安装包到指定的安装目录,我这里是放在/opt/module目录下(需要提前在该目录下创建一个module目录)
tar -zxf /opt/software/apache-hive-2.3.4.tar.gz -C /opt/module/
(2)修改解压后的hive根目录的名称为hive-2.3.4(这一步可以省略),然后切换到hive安装目录下面的conf目录,接着先配置hive-env.sh文件(需要将hive-env.sh.template修改为hive-env.sh)
#JAVA_HOME
JAVA_HOME=/opt/module/jdk1.8.0_144
# Set HADOOP_HOME to point to a specific hadoop install directory
# HADOOP_HOME=${bin}/../../hadoop
HADOOP_HOME=/opt/module/hadoop-2.7.2
# Hive Configuration Directory can be controlled by:
# export HIVE_CONF_DIR=
export HIVE_CONF_DIR=/opt/module/hive-2.3.4/conf
(3)还需要拷贝mysql的驱动包到hive的lib目录下,否则会包如下错误
(4)配置hive-site.xml文件
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://giveu101:3306/metastore?createDatabaseIfNotExist=true</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>root</value>
<description>username to use against metastore database</description>
</property>
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>666666</value>
<description>password to use against metastore database</description>
</property>
<!-- hive元数据地址,默认是/user/hive/warehouse -->
<property>
<name>hive.metastore.warehouse.dir</name>
<value>/user/hive/warehouse</value>
</property>
<!-- hive查询时输出列名 -->
<property>
<name>hive.cli.print.header</name>
<value>true</value>
</property>
<!-- 显示当前数据库名 -->
<property>
<name>hive.cli.print.current.db</name>
<value>true</value>
</property>
</configuration>
(5)在hive的根目录下创建logs目录,并在conf目录下配置hive-log4j2.properties文件
(6)修改HDFS系统中关于Hive的一些目录权限
hdfs dfs -mkdir /tmp #如果有这个路径,这不需要重新创建
hdfs dfs -mkdir -p /user/hive/warehouse #创建目录
hdfs dfs -chmod g+w /tmp #修改文件权限
hdfs dfs -chmod g+w /user/hive/warehouse #修改文件权限
(7)初始化Hive在MySQL的元数据库信息
(8)开启元数据服务
nohup hive --service metastore &
(9)如果想直接使用bin目录下的hive的脚本来打开hive自带的命令行客户端,还需要在/etc/profile文件配置HIVE_HOME,然后source /etc/profile文件即可
#HIVE_HOME
export HIVE_HOME=/opt/module/hive-2.3.4
export PATH=$PATH:$HIVE_HOME/bin
(10)最后一步就是直接在命令行输入hive即可进入hive自带的命令行客户端进行测试hive是否安装部署成功,如出现图下情况即安装成功
备注:参考Hive的官方文档:https://cwiki.apache.org/confluence/display/Hive/GettingStarted