SQL-On-Hadoop与三类执行引擎整合

By timebusker on December 15, 2018

Hive存储支持:textfile、orcfile、rcfile、parquet、sequencefile 在Hadoop的整个生态系统中,Spark和MapReduce在同一个层级,即主要解决分布式计算框架的问题。

主流开源SQL on Hadoop

Apache Hive

Apache Hive 是Hadoop 生态系统中的第一个SQL 框架。Facebook 的工程师在2007年介绍了Hive,并在2008年将代码捐献给Apache 软件基金会。2010年9月,Hive 毕业成为Apache 顶级项目。Hadoop 生态系统中的每个主要参与者都发布和支持Hive,包括Cloudera、MapR、Hortonworks 和IBM。Amazon Web Services 在Elastic MapReduce(EMR)中提供了Hive 的修改版作为云服务。

早期发布的Hive 使用MapReduce 运行查询。复杂查询需要多次传递数据,这会降低性能。所以Hive 不适合交互式分析。由Hortonworks 领导的Stinger 明显的提高了Hive 的性能,尤其是通过使用Apache Tez,一个精简MapReduce 代码的应用框架。Tez 和ORCfile,一种新的存储格式,对Hive 的查询产生了明显的提速。

Cloudera 实验室带领一个并行项目重新设计Hive 的后端,使其运行在Apache Spark 上。经过长期测试后,Cloudera 在2016年初发布了Hive-on-Spark 的正式版本。

在2016年,Hive 有100多人的贡献者。该团队在2月份发布了Hive 2.0,并在6月份发布了Hive 2.1。Hive 2.0 的改进包括了对Hive-on-Spark 的多个改进,以及性能、可用性、可支持性和稳定性增强。Hive 2.1 包括了Hive LLAP(”Live Long and Process“),它结合持久化的查询服务器和优化后的内存缓存,来实现高性能。该团队声称提高了25倍。

9月,Hivemall 项目进入了Apache 孵化器,正如我在我的机器学习年度总结的第二部分中指出的。Hivemall 最初由Treasure Data 开发并捐献给Apache 软件基金会,它是一个可扩展的机器学习库,通过一系列的Hive UDF 来实现,设计用于在Hive、Pig 和Spark SQL 上运行MapReduce。该团队计划在2017年第一季度发布了第一个版本。

Apache Impala

2012年,Cloudera 推出了Impala,一个开源的MPP SQL 引擎,作为Hive 的高性能替代品。Impala 使用HDFS 和HBase,并利用了Hive 元数据。但是,它绕开了使用MapReduce 运行查询。

Cloudera 的首席战略官Mike Olson 在2013年底说到Hive 的架构是有根本缺陷的。在他看来,开发者只能用一种全新的方式来实现高性能SQL,例如Impala。2014年的1月、5月和9月,Cloudera 发布了一系列的基准测试。在这些测试中,Impala 展示了其在查询运行的逐步改进,并且显著优于基于Tez 的Hive、Spark SQL 和Presto。除了运行快速,Impala 在并发行、吞吐量和可扩展性上也表现优秀。

2015年,Cloudera 将Impala 捐献给Apache 软件基金会,进入了Apache 孵化计划。Cloudera、MapR、Oracle 和Amazon Web Services 分发Impala,Cloudera、MapR 和Oracle 提供了商业构建和安装支持。

2016年,Impala 在Apache 孵化器中取得了稳步发展。该团队清理了代码,将其迁移到Apache 基础架构,并在10月份发布了第一个Apache 版本2.7.0。新版本包括了性能提升和可扩展性改进,以及一些其他小的增强。

9月,Cloudera 发布了一项研究结果,该研究比较了Impala 和Amazon Web Services 的Redshift 列存储数据库。报告读起来很有意思,虽然主题一贯的需要注意供应商的基准测试。

Spark SQL

Spark SQL 是Spark 用于结构化数据处理的组件。Apache Spark 团队 在2014年发布了Spark SQL,并吸收了一个叫Shark 的早期的Hive-on-Spark 项目。它迅速成为最广泛使用的Spark 模块。

Spark SQL 用户可以运行SQL 查询,从Hive 中读取数据,或者使用它来创建Spark Dataset和DataFrame(Dataset 是分布式的数据集合,DataFrame 是统一命名的Dataset 列)。Spark SQL 的接口向Spark 提供了数据结构和执行操作的信息,Spark 的Catalyst 优化器使用这些信息来构造一个高效的查询。

2015年,Spark 的机器学习开发人员引入了ML API,一个利用Spark DataFrame 代替低级别Spark RDD API 的包。这种方法被证明是有吸引力和富有成果的;2016年,随着2.0 的发布,Spark 团队将基于RDD 的API改为维护模式。DataFrame API现在是Spark 机器学习的主要接口。

此外,在2016年,该团队还在Spark 2.1.0的Alpha 版本中发布了结构化的流式处理。结构化的流式处理是构建在Spark SQL 上的一个流处理引擎。用户可以像对待静态源一样,用同样的方式查询流式数据源,并且可以在单个查询中组合流式和静态源。Spark SQL 持续运行查询,并且在流式数据到达的时候更新结果。结构化的流通过检查点和预写日志来提供一次性的容错保障。

Presto

Facebook 工程师在2012年发起了Presto 项目,作为Hive 的一个快速交互的取代。在2013年推出时,成功的支持了超过1000个Facebook 用户和每天超过30000个PB级数据的查询。2013年Facebook 开源了Presto。

Presto 支持多种数据源的ANSI SQL 查询,包括Hive、Cassandra、关系型数据库和专有文件系统(例如Amazon Web Service 的S3)。Presto 的查询可以联合多个数据源。用户可以通过C、Java、Node.js、PHP、Python、R和Ruby 来提交查询。

Airpal 是Airbnb 开发的一个基于web 的查询工具,让用户可以通过浏览器来提交查询到Presto。Qubole 位Presto 提供了管理服务。AWS 在EMR 上提供Presto 服务。

2015年6月,Teradata 宣布计划开发和支持该项目。根据宣布的三阶段计划,Teredata 提出将Presto 集成导Hadoop 生态系统中,能够在YARN 中进行操作,并且通过ODBC 和JDBC 增强连接性。Teredata 提供了自己的Presto 发行版,附带一份数据表。2016年6月,Teradata 宣布了Information Builders、Looker、Qlik、Tableau 和ZoomData 的鉴定结果,以及正在进行中的MicroStrategy 和Microsoft Power BI。

Presto 是一个非常活跃的项目,有一个巨大的和充满活力的贡献者社区。该团队发布的速度比Miki Sudo 吃热狗的速度还要快–我统计了下,2016年共发布了42个版本。Teradata 并没有打算总结有什么新的东西,我也不打算在42个发行说明里去筛选,所以就让我们说它更好吧。

Apache Kylin

Apache Kylin 是一个具有SQL 接口的OLAP 引擎。由eBay 开发并捐献给Apache,Kylin 在2015年毕业成为顶级项目。

Apache Phoenix

Apache Phoenix 是一个运行在HBase 上的SQL 框架,绕过了MapReduce。Salesforce 开发了该软件并在2013年捐献给了Apache。2014年5月项目毕业成为顶级项目。Hortonworks 的Hortonworks 数据平台中包含该项目。自从领先的SQL 引擎都适配HBase 之后,我不清楚为什么我们还需要Phoenix。

Hive 执行引擎

Hive on Mapreduce

Hive的出现可以让那些精通SQL技能、但是不熟悉MapReduce 、编程能力较弱与不擅长Java语言的用户能够在HDFS大规模数据集上 很方便地利用SQL语言查询、汇总、分析数据,毕竟精通SQL语言的人要比精通Java语言的多得多。Hive适合处理离线非实时数据

Hive on Tez

(待续)

Hive on Saprk

(待续)

Hive + Saprk

SparkSQL和Hive On Spark都是在Spark上实现SQL的解决方案。

https://www.cnblogs.com/wcwen1990/p/7899530.html

Spark项目本身主推的SQL实现,Hive On Spark比SparkSQL稍晚,Cloudera主导启动了Hive On Spark。

Hive + Spark SQL

SparkSQL作为Spark生态的一员继续发展,不再受限于Hive,只是兼容Hive。

Hive on Spark

Hive on Spark是一个Hive的发展计划,该计划将Spark作为Hive的底层引擎之一,Hive将不再受限于一个引擎,可以采用Map-ReduceTezSpark等引擎。

Hive on Spark总体的设计思路是,尽可能重用Hive逻辑层面的功能;从生成物理计划开始,提供一整套针对Spark的实现,比如 SparkCompiler、SparkTask等, 这样Hive的查询就可以作为Spark的任务来执行了。

  • 尽可能减少对Hive原有代码的修改
  • 对于选择Spark的用户,应使其能够自动的获取Hive现有的和未来新增的功能
  • 尽可能降低维护成本,保持对Spark依赖的松耦合
以Hive的表作为RDD

Spark 以分布式可靠数据集(Resilient Distributed Dataset,RDD)作为其数据抽象,因此我们需要将Hive的表转化为RDD以便Spark处理。 本质上,Hive的表和Spark的 HadoopRDD都是HDFS上的一组文件,通过InputFormat和RecordReader读取其中的数据,因此这个转化是自然而然的。

使用Hive原语

主要是指使用Hive的操作符对数据进行处理。Spark为RDD提供了一系列的转换(Transformation),其中有些转换也是面向SQL 的,如groupByKey、join等。 但如果使用这些转换(就如Shark所做的那样),就意味着我们要重新实现一些Hive已有的功能;而且当 Hive增加新的功能时,我们需要相应地修改Hive on Spark模式。 有鉴于此,我们选择将Hive的操作符包装为Function,然后应用到RDD上。这样,我们只需要依赖较少的几种RDD的转换,而主要的计算逻辑仍由Hive提供。

物理执行计划

通过SparkCompiler将Operator Tree转换为Task Tree,其中需要提交给Spark执行的任务即为SparkTask。不同于MapReduce中Map+Reduce的两阶段执行模式, Spark采用DAG执行模式,因此一个SparkTask包含了一个表示RDD转换的DAG,我们将这个DAG包装为SparkWork。执行SparkTask时,就根据SparkWork所表示的DAG计算出最终的RDD, 然后通过RDD的foreachAsync来触发运算。使用foreachAsync是 因为我们使用了Hive原语,因此不需要RDD返回结果;此外foreachAsync异步提交任务便于我们对任务进行监控。

SparkContext生命周期

SparkContext是用户与Spark集群进行交互的接口,Hive on Spark应该为每个用户的会话创建一个SparkContext。 但是Spark目前的使用方式假设SparkContext的生命周期是Spark应用级别的,而且目前在同一个JVM中不能创建多个SparkContext。 这明显无法满足HiveServer2的应用 场景,因为多个客户端需要通过同一个HiveServer2来提供服务。鉴于此,我们需要在单独的JVM中启动SparkContext, 并通过RPC与远程的SparkContext进行通信。

任务监控与统计信息收集

Spark 提供了SparkListener接口来监听任务执行期间的各种事件,因此我们可以实现一个Listener来监控任务执行进度以及收集任务级别的统计信息 (目前任务级别的统计由SparkListener采集,任务进度则由Spark提供的专门的API来监控)。另外Hive还提供了Operator级 别的统计数据信息,比如读取的行数等。 在MapReduce模式下,这些信息通过Hadoop Counter收集。我们可以使用Spark提供的Accumulator来实现该功能。