Apache spark 火花磁芯&;任务并发性

Apache spark 火花磁芯&;任务并发性,apache-spark,architecture,internal,Apache Spark,Architecture,Internal,我有一个关于spark的基本问题。我通常使用50个内核运行spark作业。在查看作业进度时,大多数情况下,它显示50个进程并行运行(正如预期的那样),但有时它只显示2或4个spark进程并行运行。像这样: [Stage 8:================================> (297 + 2) / 500] 正在处理的RDD在100多个分区上重新分区。所以这不应该是个问题 不过我有一个想法。我看到的模式是,大多数情况下,Spark

我有一个关于spark的基本问题。我通常使用50个内核运行spark作业。在查看作业进度时,大多数情况下,它显示50个进程并行运行(正如预期的那样),但有时它只显示2或4个spark进程并行运行。像这样:

[Stage 8:================================>                      (297 + 2) / 500]
正在处理的RDD在100多个分区上重新分区。所以这不应该是个问题

不过我有一个想法。我看到的模式是,大多数情况下,SparkUI中的数据局部显示为
NODE\u LOCAL
,而其他情况下,当所有50个进程都在运行时,一些进程显示为
RACK\u LOCAL
。 这让我怀疑,这可能是因为数据在同一节点中处理之前被缓存,以避免网络开销,这会减慢进一步的处理


如果是这样的话,有什么办法可以避免呢。如果不是这样,这里发生了什么?

经过一周或更长时间的努力,我想我已经找到了问题的根源

如果您正在努力解决相同的问题,那么最好从检查Spark实例的配置是否良好开始。这是一个伟大的故事

但是,如果问题不在于配置(就像我一样),那么问题就出在代码中的某个地方。问题是,有时由于不同的原因(连接倾斜、数据源中的分区不均匀等),您正在处理的RDD会在2-3个分区上获取大量数据,而其余分区的数据很少

为了减少网络中的数据混乱,Spark尝试让每个执行器处理驻留在该节点上的本地数据。因此,2-3个执行器工作了很长时间,其余的执行器只在几毫秒内处理完数据。这就是为什么我遇到了我在上述问题中描述的问题

调试这个问题的方法是首先检查RDD的分区大小。如果一个或几个分区与其他分区相比非常大,那么下一步就是在大分区中查找记录,这样您就可以知道,特别是在倾斜联接的情况下,哪个键倾斜了。我编写了一个小函数来调试:

from itertools import islice
def check_skewness(df):
    sampled_rdd = df.sample(False,0.01).rdd.cache() # Taking just 1% sample for fast processing
    l = sampled_rdd.mapPartitionsWithIndex(lambda x,it: [(x,sum(1 for _ in it))]).collect()
    max_part = max(l,key=lambda item:item[1])
    min_part = min(l,key=lambda item:item[1])
    if max_part[1]/min_part[1] > 5: #if difference is greater than 5 times
        print 'Partitions Skewed: Largest Partition',max_part,'Smallest Partition',min_part,'\nSample Content of the largest Partition: \n'
        print (sampled_rdd.mapPartitionsWithIndex(lambda i, it: islice(it, 0, 5)     if i == max_part[0] else []).take(5))
    else:
        print 'No Skewness: Largest Partition',max_part,'Smallest Partition',min_part
它给出了最小和最大的分区大小,如果这两者之间的差异超过5倍,它会打印出最大分区的5个元素,让您大致了解发生了什么

一旦你发现问题出在歪斜的分区上,你可以找到摆脱歪斜的密钥的方法,或者你可以重新分区你的数据帧,这将迫使它平均分布,现在你会看到所有的执行者都会在相同的时间内工作,你会看到更少可怕的OOM错误,处理速度也会大大加快

这些只是我作为Spark新手的两分钱,我希望Spark专家能在这个问题上多加一些,因为我认为Spark世界中的很多新手经常面临类似的问题