不 care 工具,在大数据平台中 Hive 能自动处理 SQL
本文分享自华为云社区《Hive执行原理》,作者: JavaEdge 。
MapReduce 简化了大数据编程的难度,使得大数据计算不再是高不可攀的技术圣殿,普通工程师也能使用 MapReduce 开发大数据程序。但是对于经常需要进行大数据计算的人,比如从事研究商业智能(BI)的数据分析师来说,他们通常使用 SQL 进行大数据分析和统计,MapReduce 编程还是有一定的门槛。而且如果每次统计和分析都开发相应的 MapReduce 程序,成本也确实太高了。
有没有更简单的办法,可以直接将 SQL 运行在大数据平台?
先看如何用 MapReduce 实现 SQL 数据分析。
MapReduce 实现 SQL 的原理
常见的一条 SQL 分析语句,MapReduce 如何编程实现?
统计分析语句,统计不同年龄用户访问不同网页的兴趣偏好,具体数据输入和执行结果:
左边,要分析的数据表
右边,分析结果
把左表相同的行求和,即得右表,类似 WordCount 计算。该 SQL 的 MapReduce 的计算过程,按 MapReduce 编程模型
map 函数的输入 K 和 V,主要看 V
V 就是左表中每行的数据,如<1, 25>
map 函数的输出就是以输入的 V 作为 K,V 统一设为 1
比如<<1, 25>, 1>
map 函数的输出经 shuffle 后,相同的 K 及其对应的 V 被放在一起组成一个<K, V 集合>,作为输入交给 reduce 函数处理。比如<<2, 25>, 1>被 map 函数输出两次,那么到了 reduce 这里,就变成输入<<2, 25>, <1, 1>>,这里的 K 是<2, 25>,V 集合是<1, 1>。
在 reduce 函数内部,V 集合里所有的数字被相加,然后输出。所以 reduce 的输出就是<<2, 25>, 2>
如此,一条 SQL 就被 MapReduce 计算好了。
在数据仓库中,SQL 是最常用的分析工具,既然一条 SQL 可以通过 MapReduce 程序实现,那有无工具能自动将 SQL 生成 MapReduce 代码?这样数据分析师只要输入 SQL,即可自动生成 MapReduce 可执行的代码,然后提交 Hadoop 执行。这就是 Hadoop 大数据仓库 Hive。
Hive 架构
Hive 能直接处理我们输入的 SQL(Hive SQL 语法和数据库标准 SQL 略不同),调用 MapReduce 计算框架完成数据分析操作。
通过 Hive Client(Hive 的命令行工具,JDBC 等)向 Hive 提交 SQL 命令:
若为 DDL,Hive 会通过执行引擎 Driver 将数据表的信息记录在 Metastore 元数据组件,该组件通常用一个关系数据库实现,记录表名、字段名、字段类型、关联 HDFS 文件路径等这些数据库的元信息
若为 DQL,Driver 就会将该语句提交给自己的编译器 Compiler 进行语法分析、语法解析、语法优化等一系列操作,最后生成一个 MapReduce 执行计划。然后根据执行计划生成一个 MapReduce 的作业,提交给 Hadoop MapReduce 计算框架处理。
对一个简单的 SQL 命令:
其对应的 Hive 执行计划:
Hive 内部预置了很多函数,Hive 执行计划就是根据 SQL 语句生成这些函数的 DAG(有向无环图),然后封装进 MapReduce 的 map、reduce 函数。该案例中的 map 函数调用了三个 Hive 内置函数 TableScanOperator、FilterOperator、FileOutputOperator,就完成了 map 计算,而且无需 reduce 函数。
Hive 如何实现 join 操作
除了简单的聚合(group by)、过滤(where),Hive 还能执行连接(join on)操作。
pv_users 表的数据在实际中无法直接得到,因为 pageid 数据来自用户访问日志,每个用户进行一次页面浏览,就会生成一条访问记录,保存在 page_view 表中。而 age 年龄信息则记录在用户表 user。
这两张表都有一个相同的字段 userid,据该字段可连接两张表,生成前面例子的 pv_users 表:
该 SQL 命令也能转化为 MapReduce 计算,连接过程如下:
join 的 MapReduce 计算过程和前面的 group by 稍有不同,因为 join 涉及两张表,来自两个文件(夹),所以需要在 map 输出的时候进行标记,比如来自第一张表的输出 Value 就记录为<1, X>,这里的 1 表示数据来自第一张表。这样经过 shuffle 以后,相同的 Key 被输入到同一个 reduce 函数,就可以根据表的标记对 Value 数据求笛卡尔积,用第一张表的每条记录和第二张表的每条记录连接,输出就是 join 的结果。
所以打开 Hive 源码,看 join 相关代码,会看到一个两层 for 循环,对来自两张表的记录进行连接操作。
总结
开发无需经常编写 MapReduce 程序,因为网站最主要的大数据处理就是 SQL 分析,因此 Hive 在大数据应用很重要。
随 Hive 普及,我们对在 Hadoop 上执行 SQL 的需求越强,对大数据 SQL 的应用场景也多样化起来,于是又开发了各种大数据 SQL 引擎。
Cloudera 开发了 Impala,运行在 HDFS 上的 MPP 架构的 SQL 引擎。和 MapReduce 启动 Map 和 Reduce 两种执行进程,将计算过程分成两个阶段进行计算不同,Impala 在所有 DataNode 服务器上部署相同的 Impalad 进程,多个 Impalad 进程相互协作,共同完成 SQL 计算。在一些统计场景中,Impala 可做到 ms 级计算速度。
后来 Spark 诞生,也推出自己的 SQL 引擎 Shark,即 Spark SQL,将 SQL 语句解析成 Spark 的执行计划,在 Spark 上执行。由于 Spark 比 MapReduce 快很多,Spark SQL 也相应比 Hive 快很多,并且随着 Spark 的普及,Spark SQL 也逐渐被人们接受。后来 Hive 推出了 Hive on Spark,将 Hive 的执行计划转换成 Spark 的计算模型。
我们还希望在 NoSQL 执行 SQL,毕竟 SQL 发展几十年,积累庞大用户,很多人习惯用 SQL 解决问题。于是 Saleforce 推出了 Phoenix,一个执行在 HBase 上的 SQL 引擎。
这些 SQL 引擎只支持类 SQL 语法,并不能像数据库那样支持标准 SQL,特别是数据仓库领域几乎必然会用到嵌套查询 SQL:在 where 条件里面嵌套 select 子查询,但几乎所有的大数据 SQL 引擎都不支持。然而习惯于传统数据库的使用者希望大数据也能支持标准 SQL。
回到 Hive。Hive 本身的技术架构其实并没有什么创新,数据库相关的技术和架构已经非常成熟,只要将这些技术架构应用到 MapReduce 上就得到了 Hadoop 大数据仓库 Hive。但是想到将两种技术嫁接到一起,却是极具创新性的,通过嫁接产生出的 Hive 极大降低大数据的应用门槛,也使 Hadoop 得到普及。
参考
https://learning.oreilly.com/library/view/hadoop-the-definitive/9781491901687/ch17.html#TheMetastore
版权声明: 本文为 InfoQ 作者【华为云开发者社区】的原创文章。
原文链接:【http://xie.infoq.cn/article/dab9e1de813ff82832ff93d75】。文章转载请联系作者。
评论