@
目录
Hive 官网 https://hive.apache.org/
Hive 官网Wiki文档 https://cwiki.apache.org/confluence/display/Hive/
Hive GitHub源码地址 https://github.com/apache/hive
Apache Hive数据仓库软件使用SQL对分布式存储中的大型数据集进行读写和管理,结构可以映射到已存储的数据上,也提供命令行工具和JDBC驱动连接用户到Hive。目前最新版本为3.1.3
Hive由Facebook开源用于解决海量结构化日志的数据统计,基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射成一张表,并且提供类SQL的查询功能,这套Hive SQL简称HQL。Hive仅仅是一个工具,本身不存储数据只提供一种管理方式,同时也不涉及分布式概念;Hive不是为在线事务处理(OLTP)工作负载而设计的,它最适合用于对数据仓库进行统计分析。
Hive本质就是MapReduce,将类SQL(HQL)转换成MapReduce程序,减少编写MapReduce的复杂度,MapReduce对用户来说虽然灵活,但需要用户自己实现功能接口,不像Spark高层级应用提供各种算子操作。hive支持了三种底层计算引擎包括mr、tez、spark,默认计算引擎mr,用户可以指定具体使用哪个底层计算引擎(set hive.execution.engine=mr/tez/spark),当前前提得先完成Spark整合或安装tez。
Hive提供了标准的SQL功能,通过SQL轻松访问数据的工具,从而支持数据仓库任务,如提取/转换/加载(ETL)、报告和数据分析。
一种将结构强加于各种数据格式的机制。
访问直接存储在Apache HDFS或其他数据存储系统(如Apache HBase)中的文件。
通过Apache Tez、Apache Spark或MapReduce执行查询。
使用HPL-SQL的过程语言。
通过Hive LLAP, Apache YARN和Apache Slider实现亚秒查询检索。
Hive是基于Hadoop的。
Hive本身其实没有多少功能,hive就相当于在Hadoop上⾯加了⼀个外壳,就是对hadoop进⾏了⼀次封装。
Hive的存储是基于HDFS的,hive的计算是基于MapReduce。
Hive和关系型数据库存储文件的系统不同, Hive使用的是HDFS(Hadoop的分布式文件系统),关系型数据则是服务器本地的文件系统。
Hive使用的计算模型是MapReduce,而关系型数据库则是自己设计的计算模型。
关系型数据库都是为实时查询业务设计的,而Hive则是为海量数据做挖掘而设计的,实时性差;实时性的区别导致Hive的应用场景和关系型数据库有很大区别。
Hive很容易扩展自己的存储能力和计算能力,这也是其寄托在Hadoop本身的优势,而关系型数据库在这方面要比Hive差很多。
优点
缺点
Hive数据存储没有单一的“Hive格式”。Hive内置了逗号和制表符分隔值(CSV/TSV)文本文件、Apache Parquet、Apache ORC和其他格式的连接器。用户可以为Hive扩展其他格式的连接器。
Hive支持文件格式和压缩:RCFile、Avro、ORC、Parquet、Compression、 LZO。
Hive的组件包括HCatalog和WebHCat
下图包含了Hive的主要组件及其与Hadoop的交互。Hive的主要组件有:
UI调用驱动程序的执行接口(图1中的步骤1)。
驱动程序为查询创建会话句柄,并将查询发送到编译器以生成执行计划(步骤2)。
编译器从元存储中获取必要的元数据(步骤3和4)。
该元数据用于对查询树中的表达式进行类型检查,并根据查询谓词修剪分区。编译器生成的计划(步骤5)是阶段的DAG,每个阶段都是映射/还原作业、元数据操作或HDFS操作。对于map/reduce阶段,计划包含map操作符树(在映射器上执行的操作符树)和reduce操作符树(用于需要reducer的操作)。
执行引擎将这些阶段提交给适当的组件(步骤6、6.1、6.2和6.3)。在每个任务(映射器/还原器)中,与表或中间输出关联的解串器用于从HDFS文件中读取行,这些行通过关联的运算符树传递。生成输出后,通过序列化程序将其写入临时HDFS文件(如果操作不需要reduce,则会在映射器中发生)。临时文件用于向计划的后续映射/还原阶段提供数据。对于DML操作,最终的临时文件将移动到表的位置。该方案用于确保不读取脏数据(文件重命名是HDFS中的原子操作)。
对于查询,执行引擎直接从HDFS读取临时文件的内容,作为来自驱动程序的提取调用的一部分(步骤7、8和9)。
Table(表):这些类似于关系数据库中的表。可以对表进行筛选、投影、联接和联合。另外,一个表的所有数据都存储在HDFS的一个目录中。Hive还支持外部表的概念,通过为表创建DDL提供适当的位置,可以在HDFS中预先存在的文件或目录上创建表。表中的行被组织成类似于关系型数据库的类型化列
Partition(分区):每个表可以有一个或多个分区键来决定数据的存储方式,例如一个带有日期分区列ds的表T有一些特定日期的文件存储在HDFS的< Table location>/ds=目录中。进一步加快数据检索效率。
Buckets(桶):每个分区中的数据可以根据表中某个列的哈希值依次划分为Buckets。每个桶以文件的形式存储在分区目录中。bucket可以高效地评估依赖于数据样本的查询(如使用表上的sample子句查询)。
Metastore是一个具有数据库或文件支持存储的对象存储,数据库支持的存储利用对象关系映射(ORM)实现,将其存储在关系数据库中的主要是用于元数据的查询。MetaSore 是 Hive 元数据存储的地方。Hive 数据库、表、函数等的定义都存储在 MetaStore 中。根据系统配置方式,统计信息和授权记录也可以存储在这。Hive 或者其他执行引擎在运行时可以使用这些数据来确定如何解析,授权以及有效执行用户的查询。MetaStore 分为两个部分:服务和后台数据的存储。
Metastore提供了一个可选组件Thrift接口来操作和查询配置单元元数据,Thrift提供了许多流行语言包括Java、C++、Ruby的绑定,可以通过编程的⽅式远程访问Hive;第三方工具可以使用此接口将配置单元元数据集成到其他业务元数据存储库中。
编译器对hql语句进⾏词法、语法、语义的编译(需要跟元数据关联),编译完成后会⽣成⼀个执⾏计划。hive上就是编译成mapreduce的job
将执⾏计划进⾏优化,减少不必要的列、使⽤分区、使⽤索引等,优化job。
Hive的安装方式或者说是MetaStore安装 分为三种部署模式:内嵌模式、本地模式以及远程模式。Hive自动监测是否有Hadoop的环境变量。
# 下载hive最新版本3.1.3
wget --no-check-certificate https://dlcdn.apache.org/hive/hive-3.1.3/apache-hive-3.1.3-bin.tar.gz
# 解压
tar -xvf apache-hive-3.1.3-bin.tar.gz
# 进入目录
cd apache-hive-3.1.3-bin
默认情况下,MetaStore 服务和 Hive 服务运行在同一个 JVM 中,包含一个内嵌的以本地磁盘作为存储的 Derby 数据库实例。使用内嵌的 MetaStore 是 Hive 入门最简单的方法。但是每次只有一个内嵌的 Derby 数据库可以访问某个磁盘上的数据库文件,这就意味着一次只能为每个 MetaStore 打开一个 Hive 会话。如果试着启动第二个会话,在它试图连接 MetaStore 时,会得到错误信息。因此它并不是一个实际的解决方案,并不适合在生产环境使用,常用于测试。
# 配置环境变量
vi /etc/profile
export HIVE_HOME=/home/commons/apache-hive-3.1.3-bin
export PATH=$HIVE_HOME/bin:$PATH
# 生效环境变量
source /etc/profile
# 配置hive-env环境变量
cp conf/hive-env.sh.template conf/hive-env.sh
vi conf/hive-env.sh
export HADOOP_HOME=/home/commons/hadoop
export HIVE_CONF_DIR=/home/commons/apache-hive-3.1.3-bin/conf
export HIVE_AUX_JARS_PATH=/home/commons/apache-hive-3.1.3-bin/lib
# 复制hive-default.xml
cp conf/hive-default.xml.template conf/hive-site.xml
# 替换{system:java.io.tmpdir}
vi conf/hive-site.xml
# 在vi里替换,一共替换4处地方,4 substitutions on 4 lines
:%s#${system:java.io.tmpdir}#/home/commons/apache-hive-3.1.3-bin/iotmp#g
# 在vi里替换,一共替换3处地方,3 substitutions on 3 lines
:%s#${system:user.name}#root#g
# 初始化derby元数据
schematool -initSchema -dbType derby
# 找到3215行的位置,将description整行内容删除保存
vi conf/hive-site.xml
重新执行初始化后显示完成
初始化完后会在执行初始化脚本当前路径生成metastore_db的目录,hive内嵌模式启动就是读当前路径下这个目录,这也意味着在其他目录执行hive就没法共享内嵌Derby元数据信息。
如果要支持多会话(以及多租户),需要使用一个独立的数据库。这种配置方式成为本地配置,因为 MetaStore 服务仍然和 Hive 服务运行在同一个进程中,但连接的却是另一个进程中运行的数据库,在同一台机器上或者远程机器上。对于本地模式来说客户端和服务端在同一个节点上,启动hive后自动启动元数据服务并连接。
在本地模式下不需要配置 hive.metastore.uris,默认为空表示是本地模式。如果选择 MySQL 作为 MetaStore 存储数据库,需要提前将 MySQL 的驱动包拷贝到 $HIVE_HOME/lib目录下。JDBC 连接驱动类视情况决定选择 com.mysql.cj.jdbc.Driver 还是 com.mysql.jdbc.Driver。
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://192.168.50.95:3308/hive_meta?createDatabaseIfNotExist=true</value>
</property>
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.cj.jdbc.Driver</value>
</property>
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>root</value>
</property>
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>123456</value>
</property>
然后执行初始化操作,初始化成功后查看hive_meta数据库自动创建且有相关表
show databases;后显示数据有default默认数据库了
将hive中的相关进程比如hiveserver2或者metastore这样的进程单独开启,使用客户端工具或者命令进行远程连接这样的服务。即远程模式。客户端可以在任何机器上,只要连接到这个server,就可以操作,客户端可以不需要密码。
修改hadoop的core-site.xml
<property>
<name>hadoop.proxyuser.root.hosts</name>
<value>*</value>
</property>
<property>
<name>hadoop.proxyuser.root.groups</name>
<value>*</value>
</property>
# 启动hiveserver2
hive --service hiveserver2 &
查看进程和上面执行hive可执行文件的进程都是org.apache.hadoop.util.RunJar
# 将hive目录发送其他机器上
scp -r ../apache-hive-3.1.3-bin hadoop1:/home/commons
# 修改hive-site.xml内容
vi hive-site.xml
<property>
<name>hive.server2.thrift.bind.host</name>
<value>hadoop2</value>
<description>Bind host on which to run the HiveServer2 Thrift service.</description>
</property>
# 启动beeline客户端
bin/beeline
# 连接jdbc,用户名和密码就是你启动hiveserver2机器用户名密码
!connect jdbc:hive2://hadoop2:10000
# 启动metastore
hive --service metastore &
启动后查看进程可以看到比刚才增多一个RunJar进程
修改hive-site.xml内容
vi hive-site.xml <property> <name>hive.metastore.uris</name> <value>thrift://hadoop2:9083</value> <description>Thrift URI for the remote metastore. Used by metastore client to connect to remote metastore.</description> </property>
# 执行hive就可以连接到远程9083的元数据服务bin/hive
**本人博客网站 **IT小神 www.itxiaoshen.com
手机扫一扫
移动阅读更方便
你可能感兴趣的文章