深度解析之Hive原理

举报
tea_year 发表于 2025/05/09 16:11:12 2025/05/09
【摘要】 Hive能够把SQL语句转化为MapReduce任务来执行,从而大大降低了学习成本。尽管Hive在数据仓库的统计分析方面表现出色,但它也有其局限性。由于Hive构建在静态批处理的Hadoop之上,而Hadoop本身具有较高的延迟和作业调度开销,因此,在处理大规模数据集时,Hive可能无法实现低延迟的快速查询。

Hive能够把SQL语句转化为MapReduce任务来执行,从而大大降低了学习成本。尽管Hive在数据仓库的统计分析方面表现出色,但它也有其局限性。由于Hive构建在静态批处理的Hadoop之上,而Hadoop本身具有较高的延迟和作业调度开销,因此,在处理大规模数据集时,Hive可能无法实现低延迟的快速查询。

1、Hive简介

1.1、出现原因

Hive出现的背景,有两方面,分别是传统数仓的不足,以及HDFS的不足。

1、传统数仓的困境

  • 无法满足快速增长的海量数据存储需求。
  • 无法有效处理不同类型的数据。
  • 计算和处理能力不足。

2、HDFS+Hadoop的不便

因为传统数仓的不足,大家希望使用上分布式存储,也就是HDFS。然而使用HDFS后发现,基于数据库的数据仓库用SQL就能做查询,现在换到HDFS上面,只能用Mapreduce任务去做分析。给分析代码极大的不便,因此需要一个框架,使用SQL来做HDFS的查询。Hive正是基于类似SQL的语言完成对hdfs数据的查询分析的框架。

1.2、Hive特点

Hive具有如下特点:

  • Hive是一个构建于Hadoop顶层的数据仓库工具,可以查询和管理PB级别的分布式数据。
  • 支持大规模数据存储、分析,具有良好的可扩展性
  • 某种程度上可以看作是用户编程接口,本身不存储和处理数据。
  • 依赖分布式文件系统HDFS存储数据。
  • 依赖分布式并行计算模型MapReduce处理数据。
  • 定义了简单的类似SQL 的查询语言——HiveQL
  • 用户可以通过编写的HiveQL语句运行MapReduce任务。
  • 可以很容易把原来构建在关系数据库上的数据仓库应用程序移植到Hadoop平台上。
  • 是一个可以提供有效、合理、直观组织和使用数据的分析工具。

Hive具有的特点非常适用于数据仓库

  • 采用批处理方式处理海量数据。数据仓库存储的是静态数据,对静态数据的分析适合采用批处理方式,不需要快速响应给出结果,而且数据本身也不会频繁变化;
  • 提供适合数据仓库操作的工具。Hive本身提供了一系列对数据进行提取、转换、加载(ETL)的工具,可以存储、查询和分析存储在Hadoop中的大规模数据。这些工具能够很好地满足数据仓库各种应用场景;
  • 支持MapReduce,Tez,Spark等多种计算引擎;
  • 可以直接访问HDFS文件以及HBase;
  • 易用易编程。

1.3、Hive优缺点

优点 缺点
1、高可靠、高容错:HiveServer采用集群模式。双MetaStor。超时重试机制。
2、类SQL:类似SQL语法,内置大量函数。
3、可扩展:自定义存储格式,自定义函数。
4、多接口:Beeline,JDBC,ODBC,Python,Thrift。
1、延迟较高:默认MR为执行引擎,MR延迟较高。
2、不支持雾化视图:Hive支持普通视图,不支持雾化视图。Hive不能再视图上更新、插入、删除数据。
3、不适用OLTP:暂不支持列级别的数据添加、更新、删除操作。
4、暂不支持存储过程:当前版本不支持存储过程,只能通过UDF来实现一些逻辑处理。

Hive是Hadoop生态的一员,依托于Hadoop生态,赋予了其强大的生命力。Hive与其他Hadoop组件的关系为:

  • Hive依赖于HDFS 存储数据
  • Hive依赖于MapReduce 处理数据
  • 在某些场景下Pig可以作为Hive的替代工具
  • HBase 提供数据的实时访问

1.4 体系结构

Hive架构包括如下组件:CLI(command line interface)、JDBC/ODBC、Thrift Server、Hive WEB Interface(HWI)、Metastore和Driver(Complier、Optimizer和Executor)

  • Driver:核心组件。整个Hive的核心,该组件包括Complier、Optimizer和Executor,它的作用是将我们写的HQL语句进行解析、编译优化,生成执行计划,然后调用底层的MapReduce计算框架。
  • Metastore: 元数据服务组件。这个组件存储Hive元数据,放在关系型数据库中,支持derby、mysql。
  • ThriftServers:提供JDBC和ODBC接入的能力,它用来进行可扩展且跨语言的服务的开发,hive集成了该服务,能让不同的编程语言调用hive的接口。
  • CLI:command line interface,命令行接口
  • Hive WEB Interface(HWI):hive客户端提供了一种通过网页的方式访问hive所提供的服务。这个接口对应hive的hwi组件(hive web interface)

最上面的一层shell、Thrift/JDBC(server/jdbc)都是client,另外还包括WebUI(HUE/Zeppelin)等,Metastore(元数据):       ————  在生产环境中通常存在MySQL中

           对于database: name、location、owner等           对于table: name 、 location 、owner 、column name/type ...

实际上HQL语句经过Driver驱动,SQL Parser(SQL 分析/解析器) 生成语法树,Query Optimizer(查询优化器)进行优化,选择最优的执行计划,最后生成物理计划(Physical Plan)、经过序列化与反序列化,UDF(用户定义函数),虽Hive提供了很多内置函数,但在实际工作中可能不足以应付,那么用户就可以自定义函数,最终执行(Execution),Execution过程转换为MapReduce作业。

1.5 Hive部署架构

1.6、Hive执行流程

  1. UI调用Drive的execute接口(1)
  2. Drive创建一个查询的Session事件并发送这个查询到Compiler,Compiler收到Session生成执行计划(2)
  3. Compiler从MetaStore中获取一些必要的数据(3,4)
  4. 在整个Plan Tree中,MetaStore用于查询表达式的类型检查,以及根据查询谓语(query predicates)精简partitions 。该Plan由Compiler生成,是一个DAG(Directed acyclic graph,有向无环图)执行步骤,里面的步骤包括map/reduce job、metadata操作、HDFS上的操作,对于map/reduce job,里面包含map operator trees和一个reduce operator tree(5)
  5. 提交执行计划到Excution Engine,并由Execution Engine将各个阶段提交个适当的组件执行(6,6.1,6.2 , 6.3)
  6. 在每个任务(mapper / reducer)中,表或者中间输出相关的反序列化器从HDFS读取行,并通过相关的操作树进行传递。一旦这些输出产生,将通过序列化器生成零时的的HDFS文件(这个只发生在只有Map没有reduce的情况),生成的HDFS零时文件用于执行计划后续的Map/Reduce阶段。对于DML操作,零时文件最终移动到表的位置。该方案确保不出现脏数据读取(文件重命名是HDFS中的原子操作),对于查询,临时文件的内容由Execution Engine直接从HDFS读取,作为从Driver Fetch API的一部分(7,8,9)

总结

Hive是基于Hadoop的数据仓库工具,它通过将结构化数据文件映射为数据库表,支持简单的SQL查询。对于那些熟悉SQL的用户来说,Hive提供的类SQL查询语言HQL无疑是福音,因为它让他们能够轻松地查询数据。同时,MapReduce开发者也能通过自定义的mapper和reducer来处理复杂的分析任务。

Hive能够把SQL语句转化为MapReduce任务来执行,从而大大降低了学习成本。尽管Hive在数据仓库的统计分析方面表现出色,但它也有其局限性。由于Hive构建在静态批处理的Hadoop之上,而Hadoop本身具有较高的延迟和作业调度开销,因此,在处理大规模数据集时,Hive可能无法实现低延迟的快速查询。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。