使用Apache Spark和Apache Drill比较SQL函数和性能

Hadoop的SQL引擎在方法和功能上有所不同。 我在这篇博客中的重点是比较和对比Apache Spark和Apache Drill的功能和性能,并讨论它们的预期用例。

在结构化数据库上运行查询和分析是一种标准操作,并且已经存在了数十年。 这通常涉及开发在数据库中实现的结构和架构。

尽管公司处理的数据每年都在增加,但增长的速度却完全不同。 根据最近的一项调查,目前有3.5ZB(Zetta字节)的结构化数据,其中半结构化和非结构化数据多出1.4倍,总计5ZB。 但是,到2020年,据预测,半结构化和非结构化数据的数量大约将比结构化数据多6倍,分别为30ZB至5ZB。 1个

弄清楚如何分析不断增长的数据量是业务和数据分析师的主要目标。 这是因为,与非结构化数据中包含的多种数据类型一起,数据的实际含义(即单词文档,视频帧等中包含的单词)可能取决于所包含事物的实际语义(上下文)。分析。 除了数据本身所依赖的语义之外,可能还需要理解该数据中包含的数据路径作为语义的一部分。 (例如,数据路径:“ C:\ Users \ kiuchi \ My Pets \ whale \ johnny.jpg”和“ http://kiuchi.local/My Pets / cat / michelle.jpg”不仅会导致它们所引用的图像;它们还可以使我们相信我的宠物中有鲸鱼和猫。从本质上讲,可以将数据路径解释为它们的嵌套列。)

此外,受互联网上信息共享的发展启发,以XML和JSON等较轻的数据交换格式包含在“半结构化数据”中的信息内容的增加,使情况变得更加复杂。 尽管这种半结构化数据由于其灵活的架构结构,不适合预先严格定义架构的数据存储区(例如关系数据库),而不是像电子邮件或办公文档这样的数据,但是可以明确地认为它是结构化的数据。 当前,如何存储和分析这种半结构化数据的问题是分析专业人员面临的主要问题之一。

在我的读者中,我怀疑没有多少人知道“ Polyglot Persistence”一词。 这个概念最初是由Scott Leberknight提出的,并在2011年 XP(极限编程)的倡导者Martin Fowler提出来 ,引起了人们的关注。 它提倡跨领域访问各种数据源上以多种格式存储的数据。 2如果能够实现,数据分析人员将能够掌握他们要分析的数据的位置和格式,从而大大降低数据转换成本。

换句话说,对于大数据分析(最近已成为流行语)而言,解决处理各种数据的问题仍然是一项持续的工作。 在这种情况下,Apache Drill和Apache Spark都是Hadoop的执行引擎。 通过比较Apache Drill和Apache Spark的功能和性能,本文将探讨它们的特性和预期的用例。

功能比较

作为数据源,Apache Drill和Apache Spark支持CSV和JSON等半结构化数据,以及通过JDBC的关系数据库。 Apache Drill还支持NoSQL数据库,例如MongoDB和HBase。

支持的数据源
阿帕奇钻 CSV,JSON,实木复合地板
蜂巢,HBase,
MongoDB,MapR- DB,Amazon S3
阿帕奇火花 CSV,JSON,实木复合地板
HiveQL(兼容),
JDBC

定义性特征之一是它们能够分析结构化数据源和半结构化数据源的混合。 这使它们与传统的SQL引擎区别开来。 此外,它们还具有访问本地文件,支持标准数据库连接协议的远程数据源以及需要JDBC以外的其他连接方法的Internet上数据源的方法。 最后,还应该提到两者都具有“插件”功能,这意味着可以添加其他数据源。 3

显然,这些设计以各种各样的数据源和跨领域数据分析为前提。 它们是在大数据环境中运行的下一代SQL引擎的良好代表,其中考虑了“ Polyglot Persistence”的混合数据源。

性能比较与讨论

现在让我比较一下这两种技术的查询性能。 在这里,我们将使用“ MovieLens”数据集,该数据集由明尼苏达大学的研究项目收集的来自电影观众的收视率数据库组成。 性能将通过运行三种类型的SQL查询(包括JOIN访问)来衡量。

以下结果是在我的PC上获得的结果(2核,6GB内存)。

使用Apache Spark和Apache Drill比较SQL函数和性能

使用Apache Spark和Apache Drill比较SQL函数和性能

使用Apache Spark和Apache Drill比较SQL函数和性能

结果的差异从何而来? 我相信它们源自Apache Spark和Apache Drill背后的思想差异。 由于Apache Drill是为了扫描和过滤数据源而开发的,因此很可能没有任何额外的处理。 进行扫描时,会将一条数据发送到流水线处理的下一步,重点是在尽可能短的时间内获得最终结果。 由于它假定查询处理将在短时间内完成,因此如果在执行期间发生故障,则重新运行该过程。 另一方面,Spark中的数据源扫描仅定位为并行处理的预备步骤。 因此,由于可重用性是我们的目标,因此像MapReduce这样的每个步骤都会进行分区和分段。 这样可以更灵活地控制程序中的数据流。 如果在长时间批处理期间发生故障,则可以使用中间数据重新开始处理,从而提高了容错能力。 这可能是造成性能差异的原因。 当然,如果有足够的机器资源可用,或者如果我们考虑整个工作流程处理时间,则这些观察到的处理时间的差异可能最终落在误差范围之内。

这里的目的不是基于上述结果来确定Apache Drill还是Apache Spark更好,Apache Drill还是Apache Spark更好。 重要的是以下事实:这两个引擎都能够对各种数据源执行查询并透明地捕获来自各种数据源的数据,而Spark能够执行比SQL查询更多的处理。 显而易见的事实是,这两个执行引擎可以实现的目标显然超出了传统关系数据库的范围。

翻译自: https://www.javacodegeeks.com/2015/11/comparing-sql-functions-and-performance-with-apache-spark-and-apache-drill.html