工人之间的平衡RDD分区 - Spark

时间:2017-08-17 16:40:45

标签: python apache-spark pyspark rdd

我正在使用名为RDD的{​​{1}} x: key, y: set(values)

file

#values: RDD of tuples (key, val) file = values.groupByKey().mapValues(set).cache() info_file = array(file.map(lambda (x,y): len(y)).collect()) var = np.var(info_file) #extremely high def f(): ... file.foreachPartition(f) 的方差非常高,因此大约1%的对&#39}。集合(使用百分位数方法验证)生成集合len(y)中值的总数的20%。 如果Spark随机随机分区,那么1%可能会落入同一分区,从而导致工人之间的负载不均衡。

有没有办法确保“重”'元组是如何在分区之间分配的? 实际上,基于total = np.sum(info_file)给出的file的阈值,我将heavy分成两个分区lightlen(y),以便将此组分开元组然后重新分区。

threshold = np.percentile(info_file,99.9)

但运行时间几乎相同。负载可能已经优化,只是想检查我是否可以做更多/更好的事情。

1 个答案:

答案 0 :(得分:1)

您可以使用Ganglia来监控群集负载。这应该可以很好地指示可能导致集群负载不均匀的任何数据偏差。

如果确实存在不幸的数据偏差,可以通过重组数据或盐键来对抗它。例如,请参阅this StackOverflow Q&A

请注意,您还可以执行现在正在执行的操作,将数据拆分为heavy分区和light分区,但在这种情况下,您需要cache file 1}} - 不是heavylight - 因为它是file,您需要多次处理。像这样:

cachedFile = file.cache()

light = cachedFile.filter(lambda (x,y): len(y) < threshold)
heavy = cachedFile.filter(lambda (x,y): len(y) >= threshold)

light.foreachPartition(f)
heavy.foreachPartition(f)

希望它有所帮助。