使用 Spark 多集群改进 SQL 查询

Improving SQL Query using Spark Multi Clusters

我正在试验具有多集群的 Spark 是否可以改善缓慢的 SQL 查询。我为 master 创建了两个 worker,他们在本地 Spark Standalone 上 运行。是的,我确实将内存和内核数量减半以在本地机器上创建工作人员。我使用 partitionColumnlowerBoundUpperBoundnumberPartitionssqlContext 指定了分区,以便可以将任务(或分区)分配给工作人员。我将它们描述如下(partitionColumn 是独一无二的):

df = sqlContext.read.format("jdbc").options(
    url = "jdbc:sqlserver://localhost;databasename=AdventureWorks2014;integratedSecurity=true;", 
    driver = "com.microsoft.sqlserver.jdbc.SQLServerDriver",  
    dbtable = query,
    partitionColumn = "RowId",
    lowerBound = 1,
    upperBound = 10000000,
    numPartitions = 4).load()

我在指定选项后 运行 我的脚本在 master 上,但是我无法在没有集群的情况下 运行 在 spark 上获得任何性能改进。我知道我不应该为了实验的完整性而将内存减半。但我想知道是否可能是这种情况,或者如果不是这种情况有什么原因。欢迎任何想法。非常感谢。

这里有多种因素在起作用,尽管每个因素的权重可能因具体情况而异。

  • by mtoto一样,增加单台机器上的工人数量不太可能带来任何性能提升。

    一台机器上的多个工作人员可以访问同一个固定资源池。由于 worker 本身不参与处理,因此您只需使用此池的较高部分进行管理。

    当我们更喜欢更多的executor JVM数量时,有一些合理的情况,但这与增加worker数量不同(前者是应用程序资源,后者是集群资源)。

  • 不清楚您是否将相同数量的内核用于基线和多工作器配置,但是内核并不是您在使用 Spark 时必须考虑的唯一资源。典型的 Spark 作业是 IO(主要是网络和磁盘)绑定的。增加单个节点上的线程数量,而没有确保有足够的磁盘和网络配置,只会让它们等待数据。

    单独增加内核仅对 CPU 绑定的作业有用(并且这些作业通常会在一台机器上更好地扩展)。

  • 如果外部资源跟不上请求,摆弄 Spark 资源将无济于事。来自单个非复制数据库的大量并发批读取只会限制服务器。

    在这种特殊情况下,运行 与 Spark 在同一节点上的数据库服务器会使情况变得更糟。它有一些优点(所有流量都可以通过环回),但除非数据库和 Spark 使用不同的磁盘组,否则它们将竞争磁盘 IO(以及其他资源)。

:

不清楚什么是query,但是如果直接对数据库执行很慢,从Spark中获取它会更慢。您可能应该首先仔细查看查询 and/or 数据库结构和配置。