当前位置:   article > 正文

Hive Fetch的原理_hive fetch 原理

hive fetch 原理

前言

Hive将SQL转为MapReduce执行,但是对于简单的查询,使用MapReduce的效率太低,于是开发了fetch功能来避免MR的执行。
网上有大量的文章介绍了如何使用,却少有介绍其原理的,于是自己debug学习了一下整理成笔记分享出来。

流程

入口

由于我使用的是hive的cli进行debug,所以会先进入CliDriver,关于这个环节更详细的介绍可以参考Hive 源码解析之 Hive 基本框架和执行入口
在这里插入图片描述

读取文件

读取切片

  • InputFormatSplit
    虽然避免了MR计算,读取文件依旧是无法避免的。Hive针对fetch的任务自定义了一类InputFormatSplit
    在这里插入图片描述
    FetchInputFormatSplit在FetchOperator的getNextSplits中被创建出来,这个方法应该是读取文件返回切片构成的数组。
    在这里插入图片描述
  • RecordReader
    根据FetchInputFormatSplit获得对应的RecordReader并返回
    在这里插入图片描述
    RecordReader根据FSDataInputStream获得数据填充的buffer中
    在这里插入图片描述
    RecordReader的in中已经拿到了多行的数据,在next方法中判断是否需要继续读取,LongWriteable类型的key应该就和MR读取文件的偏移量类似
    在这里插入图片描述

读取行

通过FetchOperator的pushRow方法,拿到每一行数据。在这里插入图片描述
刚刚的数据是byteArray,在SelectOperator的process中通过eval[i].evaluate(row)将byteArray转为了Lazy类型的数据比如下图的LazyInteger/LazyString
在这里插入图片描述

保存结果

读取文件的结果存在ListSinkOperator的res中
在这里插入图片描述
遍历res打印到控制台

总结

最后用一张图来总结Hive 的fetch原理
请添加图片描述

  • 在parse阶段通过SimpleFetchOptimizer创建了三个fetch相关的对象
    1. FetchWork记录着文件路径
    2. FetchTask调用Hadoop的API读取文件
    3. ListSinkOperator记录结果(本文案例中CliDriver就是用res打印的)
  • 虽然parse阶段创建了fetch相关的对象,但真正初始化是在QueryPlan生成的时候
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/148489
推荐阅读
相关标签
  

闽ICP备14008679号