ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

【大数据处理与分析】数据仓库Hive:06 Hive工作原理

【大数据处理与分析】数据仓库Hive:06 Hive工作原理 【作者主页】Francek Chen【专栏介绍】⌈ ⌈⌈大数据技术原理与应用⌋ ⌋⌋专栏系统介绍大数据的相关知识分为大数据基础篇、大数据存储与管理篇、大数据处理与分析篇、大数据应用篇。内容包含大数据概述、大数据处理架构Hadoop、分布式文件系统HDFS、分布式数据库HBase、NoSQL数据库、云数据库、MapReduce、Hadoop再探讨、数据仓库Hive、Spark、流计算、Flink、图计算、数据可视化以及大数据在互联网领域、生物医学领域的应用和大数据的其他应用。【GitCode】专栏资源保存在我的GitCode仓库https://gitcode.com/Morse_Chen/BigData_principle_application。文章目录一、SQL语句转换成MapReduce作业的基本原理一用MapReduce实现连接操作二用MapReduce实现分组操作二、SQL查询转换成MapReduce作业的过程小结Hive 的执行引擎可以是 MapReduce、Tez 或 Spark这里只介绍当采用 MapReduce 作为执行引擎时 Hive的工作原理。Hive 可以快速实现简单的 MapReduce 作业主要通过自身组件把 HiveQL 语句转换成 MapReduce 作业来实现。下面首先介绍在没有使用 Hive 时几个简单 SQL 语句如何转换成 MapReduce 作业来执行然后详细介绍在 Hive 中 SQL 语句即 HiveQL如何转换成 MapReduce 作业来执行。一、SQL语句转换成MapReduce作业的基本原理一用MapReduce实现连接操作假设参与连接join的两个表分别为用户User表和订单Order表User 表有两个属性即 uid 和 nameOrder 表也有两个属性即 uid 和 orderid它们的连接键为公共属性 uid。这里对两个表执行连接操作得到用户的订单号与用户名的对应关系具体的 SQL 语句命令如下selectname,orderidfromuserujoinorderoonu.uido.uid;图1描述了连接操作转换成 MapReduce 作业的具体执行过程。首先在 Map 阶段User 表以 uid 为键key以 name 和表的标记位这里 User 的标记位记为 1为值value进行 Map 操作把表中记录转化为一系列键值对的形式。同样地Order 表以 uid 为键以 orderid 和表的标记位这里表 Order 的标记位记为 2为值进行 Map 操作把表中记录转化为一系列键值对的形式。比如 User 表中记录1,Lily转化为键值对1,1,Lily其中括号中的第一个“1”是 uid 的值第二个“1”是 User 表的标记位用来标识这个键值对来自 User 表再比如 Order 表中记录1,101转化为键值对1,2,101其中“2”是 Order 表的标记位用来标识这个键值对来自 Order 表。接着在 Shuffle 阶段把 User 表和 Order 表生成的键值对按键值进行哈希然后传送给对应的 Reduce 机器执行比如键值对1,1,Lily、1,2,101和1,2,102传送到同一台 Reduce 机器上键值对2,1,Tom和2,2,103传送到另一台 Reduce 机器上。当 Reduce 机器接收这些键值对时还需要按表的标记位对这些键值对进行排序以优化连接操作。最后在 Reduce 阶段对同一台 Reduce 机器上的键值对根据“值”value中的表标记位对来自 User 和 Order 这两个表的数据进行笛卡儿积连接操作以生成最终的连接结果。比如键值对1,1,Lily与键值对1,2,101和1,2,102的连接结果分别为Lily,101和Lily,102键值对2,1,Tom和键值对2,2,103的连接结果为Tom,103。图1 连接操作转化为MapReduce作业的具体执行过程二用MapReduce实现分组操作假设 Score 表具有两个属性即 rank排名和 level级别这里存在一个分组group by操作其功能是把 Score 表的不同片段按照 rank 和 level 的组合值进行合并计算不同 rank 和 level 的组合值分别有几条记录。具体的 SQL 语句命令如下selectrank,level,count(*)asvaluefromscoregroupbyrank,level;图2描述了分组操作转换 MapReduce 作业的具体执行过程。首先在 Map 阶段对 Score 表进行 Map 操作生成一系列键值对对于每个键值对其键为“rank,level”值为“拥有该rank,value组合值的记录的条数”。比如 Score 表的第一片段中有两条记录A,1所以记录A,1转化为键值对A,1,2Score 表的第二片段中只有一条记录A,1所以记录A,1转化为键值对A,1,1。接着在 Shuffle 阶段对 Score 表生成的键值对按照“键”的值进行哈希然后根据哈希结果传送给对应的 Reduce 机器去执行比如键值对A,1,2和A,1,1传送到同一台 Reduce 机器上键值对B,2,1传送到另一台 Reduce 机器上。然后Reduce 机器对接收到的这些键值对按“键”的值进行排序。最后在 Reduce 阶段对于 Reduce 机器上的具有相同键的所有键值对的“值”进行累加生成分组的最终结果比如在同一台 Reduce 机器上的键值对A,1,2和A,1,1Reduce 后的输出结果为A,1,3B,2,1的 Reduce 后的输出结果为B,2,1。图2 分组操作转化为MapReduce作业的具体执行过程二、SQL查询转换成MapReduce作业的过程当用户向 Hive 输入一段命令或查询即 HiveQL 语句时Hive 需要与 Hadoop 交互工作来完成该操作。该命令或查询首先进入驱动模块由驱动模块中的编译器进行解析编译并由优化器对该操作进行优化计算然后交给执行器去执行。执行器通常的任务是启动一个或多个 MapReduce 作业有时也不需要启动 MapReduce 作业比如执行包含*的操作时如select * from 表就是全表扫描选择所有的属性和所有的元组不存在投影和选择操作因此不需要执行 Map 和 Reduce 操作。图3描述了用户提交一段 SQL 查询后Hive 把 SQL 语句转换成 MapReduce 作业进行执行的详细过程。图3 SQL查询转换成MapReduce作业进行执行的详细过程如图3所示在 Hive 中用户通过命令行 CLI 或其他 Hive 访问工具向 Hive 输入一段命令或查询以后 SQL 查询被 Hive 自动转换成 MapReduce 作业具体步骤如下。1由 Hive 驱动模块中的编译器—Antlr 语言识别工具对用户输入的 SQL 进行词法和语法解析将 SQL 语句转化为抽象语法树Abstract Syntax TreeAST的形式。2对该抽象语法树进行遍历进一步转化成查询块QueryBlock。因为抽象语法树的结构仍很复杂不方便直接翻译为 MapReduce 算法程序所以Hive 把抽象语法树进一步转化为查询块。查询块是一个最基本的 SQL 语法组成单元包括输入源、计算过程和输出 3 个部分。3再对查询块进行遍历生成操作树OperatorTree。其中操作树由很多逻辑操作符组成如 TableScanOperator、SelectOperator、FilterOperator、JoinOperator、GroupByOperator 和 ReduceSinkOperator 等。这些逻辑操作符可以在 Map 阶段和 Reduce 阶段完成某一特定操作。4通过 Hive 驱动模块中的逻辑优化器对操作树进行优化变换操作树的形式合并多余的操作符从而减少 MapReduce 作业数量以及 Shuffle 阶段的数据量。5对优化后的操作树进行遍历根据操作树中的逻辑操作符生成需要执行的 MapReduce 作业6启动 Hive 驱动模块中的物理优化器对生成的 MapReduce 作业进行优化生成最终的 MapReduce 作业执行计划。7最后由 Hive 驱动模块中的执行器对最终的 MapReduce 作业进行执行输出。小结当 Hive 采用 MapReduce 作为执行引擎时其核心工作是将 HiveQL 语句自动转换为 MapReduce 作业。以连接操作为例Map 阶段将两表记录转为以连接键为键、表标记位为值的键值对Shuffle 阶段按哈希分发并排序Reduce 阶段依据表标记位做笛卡儿积生成连接结果。分组操作类似Map 阶段生成“分组键→条数”键值对Reduce 阶段对相同键的值累加。在 Hive 中用户提交 SQL 后驱动模块依次经词法语法解析生成抽象语法树、转化为查询块、生成操作树、逻辑优化、生成 MapReduce 作业、物理优化最后由执行器执行输出。简单查询如全表扫描可能无需 MapReduce。欢迎点赞 | 收藏⭐ | 评论✍ | 关注
返回列表