我想比较Spark和Drill之间的查询性能。因此,这两个系统的配置必须相同。我必须考虑哪些参数,例如driver memory
,executor memory
用于火花,drill max direct memory
,planner memory max query memory per node
用于钻取等?有人可以给我一个配置示例吗?
答案 0 :(得分:0)
对于特定的重叠用例,可以在Spark和Drill之间进行密切比较。我将首先描述Spark和Drill的不同之处,重叠的用例是什么,以及最后如何调整Spark的内存设置以尽可能地匹配Drill重叠用例。
Spark和Drill都可以用作 SQL计算引擎。我对 SQL计算引擎的定义是一个可以执行以下操作的系统:
Drill 仅 SQL计算引擎,而Spark可以做的不仅仅是 SQL计算引擎。 Spark可以做的额外事情如下:
因此,为了准确地比较Drill和Spark,您只能考虑它们的重叠功能,即执行SQL语句。
正在运行的Spark作业由两种类型的节点组成。 执行者和驱动程序。 执行程序就像一个工作节点,它被赋予简单的计算任务并执行它们。 驱动程序编排一个Spark作业。例如,如果您有一个用Python编写的SQL查询或Spark作业,驱动程序负责规划如何将SQL查询或python脚本的工作分发给执行程序。然后驱动程序将监控执行者正在执行的工作。 驱动程序可以在多种模式下运行:在您的笔记本电脑上,如客户端,在单独的专用节点或容器上。
钻头略有不同。 SQL查询中的两个参与者是客户端和 Drillbit 。 客户端本质上是一个虚拟命令行终端,用于发送SQL命令和接收结果。 Drillbits 负责执行查询的计算工作。当客户端向Drill发送SQL命令时,客户端将选择一个 Drillbit 作为 Foreman 。 Drillbit 可以作为领班没有限制,并且可以为每个查询选择不同的 Foreman 。 Foreman 在查询期间执行两项功能:
Spark的驱动程序和执行者的功能与Drill的 Drillbit 和 Foreman非常相似但不完全相同。主要区别在于驱动程序无法同时作为执行者运行,而 Foreman 也可用作 Drillbit
构建比较Spark和Drill的集群时,我会执行以下操作:
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。
创建属性文件 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查询。希望这会有所帮助。