Apache Hive简介

2022-04-11 00:00:00 查询 数据 分区 提供 计算

项目背景

早在2007年,FaceBook为了对海量日志数据进行分析而开发了Hive,2008年开源给了Apache软件基金会,2010年Hive毕业成为Apache 项目。

Facebook设计开发Hive的初衷就是让那些熟悉SQL编程方式的人也可以更好的利用hadoop,hive可以让数据分析人员只关注于具体业务模型,而不需要深入了解MapReduce的编程细节,但是这并不意味着使用hive不需要了解和学习MapReduce编程模型和hadoop,复杂的业务需求和模型总是存在的,对于Hive分析人员来说,深入了解Hadoop和Hive的原理和Mapreduce模型,对于优化查询总有益处。

Hive本质是将 HiveQL 查询转换成在 Apache Hadoop 上运行的 MapReduce 作业,查询并计算存储在Apache Hadoop分布式文件系统HDFS当中的数据,减少编写MapReduce的复杂度。

需要注意的是,Hive并不是数据库,只是一个计算存储引擎。

Hive能力

Hive主要提供了以下特性

  • 通过Hive SQL语言可以非常容易完成数据建模,例如数据提取/转换/加载(ETL),以及数据分析。
  • 提供一种机制,可以为不同的数据格式提供结构化能力。
  • 提供多种数据访问方式,可以轻松访问保存在不同介质上的文件。
  • 提供可配置的查询引擎,可基于MapReduce,或者其他计算引擎。

优点:

  • 学习成本低:提供了类SQL查询语言HQL,使得熟悉SQL语言的开发人员无需关心细节,可以快速上手。
  • 海量数据分析:底层是基于海量计算MapReduce实现。
  • 可扩展性:为超大数据集设计了计算/扩展能力(MR作为计算引擎,HDFS作为存储系统),Hive可以自由的扩展集群的规模,一般情况下不需要重启服务。
  • 延展性:Hive支持用户自定义函数,用户可以根据自己的需求来实现自己的函数。
  • 良好的容错性:某个数据节点出现问题HQL仍可完成执行。
  • 统计管理:提供了统一的元数据管理

缺点:

  • Hive 对特定行数据的更新、删除支持不好,须开启ACID原子配置,并且无法通过子查询来操作。
  • Hive 查询延时很严重,由于 MapReduce Job 的启动过程消耗很长时间,因此不能用在交互式查询系统中。
  • Hive调优比较困难,涉及MapReduce、HDFS等组件。

Hive架构

功能组件

  • 数据存储HDFS

Hive的数据是存储在HDFS上的。Hive中的库和表可以看作是对HDFS上数据做的一个映射。Hive通常运行在一个Hadoop集群上的。

  • 计算引擎MapReduce

默认情况下,Hive任务终是转换成MapReduce程序放到YARN上以一系列Job的方式去执行。也可以替换为其他计算引擎,如Apache Tez、Apache Spark。

  • 元数据管理Hive Metastore

Hive的元数据,比如库表名、文件存储路径等信息,由Metastore组件负责管理。Hive的元数据存储在关系数据库里,如mysql。元数据对于hive十分重要,作为Apache Hive的核心组件,每个HQL任务都需要先查询metastore服务获取元数据,才能生成MapReduce任务。

  • 服务端 HiveServer2

HiveServer2是一个独立的服务,提供JDBC/ODBC接口,负责将用户提交的Hive SQL转换为MapReduce任务,然后提交到Hadoop集群上执行,并且获取MR任务结果,读取HDFS数据。支持多并发及身份验证。

HiveServer2是基于Jetty服务器实现的高性能服务。

  • 客户端 Beeline

实现JDBC协议的Hive客户端,负责对用户提交的Hive SQL进行语法检测,然后再提交到HiveServer2执行,后获取结果进行展示。

数据单元

按粒度排序,Hive 的数据组织单位分为以下几种:

  • 数据库(Database):用来避免表、视图、分区、列等命名冲突的命名空间,还可用于加强用户或用户组的安全性
  • 表(Table):具有相同模式(Schema)的同质数据单元。
  • 分区(Partition):每个表都有一个或多个分区键来确定数据的存储方式,一个分区对应到HDFS的一个目录,一个目录下可以保存多个数据文件。Hive通过分区的形式,将海量数据划分成多个分区。在数据进行分析时一般只会查询部分分区,避免全表扫描,提高查询效率。
  • 桶(Bucket):也称为集群(Cluster),每个分区中的数据可以根据表中某个列的哈希值将其划分为不同的桶。例如,page_views 表可以基于 userid 进行桶的划分,这样每个分区的数据会根据userid的哈希值分成不同文件,这样在读取数据时可以根据userid的哈希值只读取对应的文件,提高读取效率。

来自:https://mp.weixin.qq.com/s/5b8TOMUp9aaDqE19mNYZfQ

相关文章