我正在尝试使用多群集的Spark可以改善慢速SQL查询。我为master创建了两个worker,他们在本地Spark Standalone上运行。是的,我确实将内存和内核数量减半,以便在本地计算机上创建工作程序。我使用sqlContext
,partitionColumn
,lowerBound
和UpperBound
为numberPartitions
指定了分区,以便可以在工作人员上分配任务(或分区)。我将它们描述如下(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时,我无法获得任何性能提升。我知道我不应该为实验的完整性减半记忆。但我想知道是否可能是这种情况或任何原因,如果不是这样的话。欢迎任何想法。非常感谢。
答案 0 :(得分:1)
这里有多种因素起作用,尽管每种因素的权重可能因具体情况而异。
nicely pointed out作为mtoto,单台计算机上的工作人员数量不断增加,不太可能带来性能提升。
单台计算机上的多个工作人员可以访问相同的固定资源池。由于工作人员本身不参与处理,因此您只需使用此池中的较高部分进行管理。
当我们更喜欢更多数量的执行程序JVM时会出现这种情况,但它与增加的工作数量不同(前者是应用程序资源,后者是集群资源)。
< / LI>目前尚不清楚是否使用相同数量的核心进行基准和多工作配置,但核心并不是您考虑使用Spark的唯一资源。典型的Spark作业是IO(主要是网络和磁盘)绑定。单个节点上增加的线程数,而不确保有足够的磁盘和网络配置,只会让它们等待数据。
仅增加内核仅适用于受CPU限制的作业(这些作业通常在单台计算机上扩展得更好)。
如果外部资源无法跟上请求,摆弄Spark资源对您无济于事。来自单个非复制数据库的大量并发批量读取只会限制服务器。
在这种特殊情况下,通过在与Spark相同的节点上运行数据库服务器,会使情况更糟。它有一些优点(所有流量都可以通过环回),但除非数据库和Spark使用不同的磁盘集,否则它们将通过磁盘IO(以及其他资源)进行竞争。
注意强>:
目前尚不清楚query
是什么,但如果直接针对数据库执行它很慢,从Spark获取它会更慢。您可能应该首先仔细查看查询和/或数据库结构和配置。