深度解析之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执行流程
- UI调用Drive的execute接口(1)
- Drive创建一个查询的Session事件并发送这个查询到Compiler,Compiler收到Session生成执行计划(2)
- Compiler从MetaStore中获取一些必要的数据(3,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)
- 提交执行计划到Excution Engine,并由Execution Engine将各个阶段提交个适当的组件执行(6,6.1,6.2 , 6.3)
- 在每个任务(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可能无法实现低延迟的快速查询。
- 点赞
- 收藏
- 关注作者
评论(0)