我正在尝试使用多集群的 Spark 是否可以改善缓慢的 SQL 查询。我为 master 创建了两个工作线程,它们在本地 Spark Standalone 上运行。是的,我确实将内存和核心数量减半,以在本地计算机上创建工作线程。我使用 partitionColumn
、lowerBound
、UpperBound
和 numberPartitions
为 sqlContext
指定分区,以便任务(或分区)可以分配给工作人员。我将它们描述如下(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/