我是Spark的新手。当工作节点数量增加时,我面临性能问题。所以为了研究这个问题,我在spark-shell上尝试了一些示例代码。
我创建了一个包含2个工作节点(m3.xlarge)的Amazon AWS EMR。我在主节点上的spark-shell上使用了以下代码。
var df = sqlContext.range(0,6000000000L).withColumn("col1",rand(10)).withColumn("col2",rand(20))
df.selectExpr("id","col1","col2","if(id%2=0,1,0) as key").groupBy("key").agg(avg("col1"),avg("col2")).show()
此代码执行时没有任何问题,大约需要8分钟。但是当我添加了2个工作节点(m3.xlarge)并在主节点上使用spark-shell执行相同的代码时,时间增加到10分钟。
这是问题,我认为时间应该减少,而不是减半,但我应该减少。我不知道为什么增加工人节点相同的火花工作需要更多的时间。知道为什么会这样吗?我错过了什么吗?
答案 0 :(得分:0)
这不应该发生,但是分布时算法可能运行得更慢。 基本上,如果同步部分很重,那么使用2个节点执行此操作将花费更多时间。 我将首先比较一些更简单的转换,运行更多的异步代码,没有任何同步点(例如按键分组),看看你是否遇到同样的问题。
答案 1 :(得分:0)
@ z-star,是的,当分发时,算法可能会变慢。我使用Spark Dynamic Allocation找到了解决方案。这使得spark只能使用所需的执行程序。静态分配在所有执行程序上运行一个作业,这会增加执行时间和更多节点。