Spark和Drill之间的等效配置是什么?

时间:2017-09-24 08:40:20

标签: apache-spark apache-drill

我想比较Spark和Drill之间的查询性能。因此,这两个系统的配置必须相同。我必须考虑哪些参数,例如driver memoryexecutor memory用于火花,drill max direct memoryplanner memory max query memory per node用于钻取等?有人可以给我一个配置示例吗?

1 个答案:

答案 0 :(得分:0)

对于特定的重叠用例,可以在Spark和Drill之间进行密切比较。我将首先描述Spark和Drill的不同之处,重叠的用例是什么,以及最后如何调整Spark的内存设置以尽可能地匹配Drill重叠用例。

功能比较

Spark和Drill都可以用作 SQL计算引擎。我对 SQL计算引擎的定义是一个可以执行以下操作的系统:

  • 从文件,数据库或邮件队列中提取数据。
  • 执行用户提供的有关摄取数据的SQL语句。
  • 将用户的SQL语句的结果写入终端,文件,数据库表或消息队列。

Drill SQL计算引擎,而Spark可以做的不仅仅是 SQL计算引擎。 Spark可以做的额外事情如下:

  • Spark有API来通过函数式编程操作来操作数据,而不仅仅是SQL。
  • Spark可以将操作结果保存到DataSet。 DataSets可以在其他操作中有效地重用,并且可以在磁盘和内存中高效缓存。
  • Spark有一些流处理概念API。

因此,为了准确地比较Drill和Spark,您只能考虑它们的重叠功能,即执行SQL语句。

节点比较

正在运行的Spark作业由两种类型的节点组成。 执行者驱动程序执行程序就像一个工作节点,它被赋予简单的计算任务并执行它们。 驱动程序编排一个Spark作业。例如,如果您有一个用Python编写的SQL查询或Spark作业,驱动程序负责规划如何将SQL查询或python脚本的工作分发给执行程序。然后驱动程序将监控执行者正在执行的工作。 驱动程序可以在多种模式下运行:在您的笔记本电脑上,如客户端,在单独的专用节点或容器上。

钻头略有不同。 SQL查询中的两个参与者是客户端 Drillbit 客户端本质上是一个虚拟命令行终端,用于发送SQL命令和接收结果。 Drillbits 负责执行查询的计算工作。当客户端向Drill发送SQL命令时,客户端将选择一个 Drillbit 作为 Foreman Drillbit 可以作为领班没有限制,并且可以为每个查询选择不同的 Foreman Foreman 在查询期间执行两项功能:

  1. 他计划查询并协调 Drillbits 的其余部分来分工。
  2. 他还参与了查询的执行,并进行了一些数据处理。
  3. Spark的驱动程序执行者的功能与Drill的 Drillbit Foreman非常相似但不完全相同。主要区别在于驱动程序无法同时作为执行者运行,而 Foreman 也可用作 Drillbit

    构建比较Spark和Drill的集群时,我会执行以下操作:

    • 钻取:创建一个包含N个节点的群集。
    • Spark:使用N个执行程序创建一个集群,并确保驱动程序与执行程序具有相同的内存量。

    记忆模型的比较

    Spark和Drill都使用JVM。在JVM上运行的应用程序可以访问两种内存。 关于堆内存关闭堆内存。堆内存是正常的垃圾收集内存;例如,如果您执行new Object(),则将在堆上分配对象。关闭堆内存不是垃圾回收,必须明确分配和释放。当应用程序消耗大量堆内存(16 GB或更多)时,它们可以对JVM垃圾收集器征税。在这种情况下,垃圾收集会产生大量的计算开销,并且取决于GC算法,计算可以在垃圾收集完成时暂停几秒钟。相比之下,堆内存不受垃圾收集的影响,也不会产生这些性能损失。

    Spark默认将所有内容存储在堆上。它可以配置为在堆内存中存储一​​些数据,但我不清楚它何时会实际存储数据堆。

    Drill将所有数据存储在堆内存中,并且仅在堆内存上用于通用引擎本身。

    另一个额外的区别是Spark保留了一些内存来缓存DataSet,而Drill在执行查询后不会在内存中缓存数据。

    为了将Spark和Drill苹果与苹果进行比较,我们必须将Spark和Drill配置为使用相同数量的off heap和堆内存来执行SQL查询。在下面的示例中,我们将介绍如何配置Drill和spark以使用8gb的堆内存和8gb的堆内存。

    钻取内存配置示例

    在每个Drillbit上的 drill-env.sh 文件中设置以下内容

    export DRILL_HEAP="8G"  
    export DRILL_MAX_DIRECT_MEMORY="8G"
    

    配置完成后,重新启动Drillbits并尝试查询。您的查询可能内存不足,因为Drill的内存管理仍处于活动开发阶段。为了解决这个问题,您可以使用 planner.width.max_per_node planner.memory.max_query_memory_per_node 选项通过查询手动控制Drill的内存使用情况。这些选项在 drill-override.conf 中设置。请注意,您必须在所有节点上更改这些选项,然后重新启动Drillbits才能使它们生效。可以找到有关这些选项的更详细说明here

    Spark内存配置示例

    创建属性文件 myspark.conf 并将其传递给spark submit命令。 spark属性文件应包含以下配置。

    # 8gb of heap memory for executor
    spark.executor.memory            8g
    # 8gb of heap memory for driver
    spark.driver.memory              8g
    # Enable off heap memory and use 8gb of it
    spark.memory.offHeap.enabled     true
    spark.memory.offHeap.size        8000000000
    # Do not set aside memory for caching data frames
    # Haven't tested if 0.0 works. If it doesn't make this
    # as small as possible
    spark.memory.storageFraction     0.0
    

    摘要

    创建具有N个节点的Drill集群,具有N个执行程序的Spark集群并部署专用驱动程序,尝试上面提供的内存配置,并在两个集群上运行相同或类似的SQL查询。希望这会有所帮助。