apache-spark - 使用 Spark 多集群改进 SQL 查询

标签 apache-spark pyspark distributed-computing

我正在尝试使用多集群的 Spark 是否可以改善缓慢的 SQL 查询。我为 master 创建了两个工作线程,它们在本地 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()

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

最佳答案

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

  • nicely pointed out通过 mtoto ,增加单台机器上的工作线程数量不太可能带来任何性能提升。

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

    在某些合理的情况下,我们更喜欢更多数量的执行器 JVM,但这与增加工作线程数量不同(前者是应用程序资源,后者是集群资源)。

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

    单独增加内核仅对 CPU 密集型作业有用(这些作业通常在单台机器上可以更好地扩展)。

  • 如果外部资源无法跟上请求,摆弄 Spark 资源不会对您有帮助。从单个非复​​制数据库进行大量并发批量读取只会限制服务器。

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

注意:

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

关于apache-spark - 使用 Spark 多集群改进 SQL 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44225732/

相关文章:

apache-spark - Spark SQL 与 Databricks SQL

java - Java 和 Python 守护进程之间的数据桥

python - 为什么 DataFrame 中缺少分区键列

python - 如何在 Python 中合并 Spark SQL 数据帧

python - 如何获得相关矩阵值pyspark

c - MPI_Gather 二维数组

distributed-computing - 奥尔良 - 当系统存储出现故障或无法访问时会发生什么?

python - ALS.trainImplicit() 的 alpha 参数可以大于 1 吗?

apache-spark - 连接器 spark-redshift 的替代品

python - Spark 读取 python3 pickle 作为输入