我正在使用名为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
分成两个分区light
和len(y)
,以便将此组分开元组然后重新分区。
threshold = np.percentile(info_file,99.9)
但运行时间几乎相同。负载可能已经优化,只是想检查我是否可以做更多/更好的事情。
答案 0 :(得分:1)
您可以使用Ganglia来监控群集负载。这应该可以很好地指示可能导致集群负载不均匀的任何数据偏差。
如果确实存在不幸的数据偏差,可以通过重组数据或盐键来对抗它。例如,请参阅this StackOverflow Q&A。
请注意,您还可以执行现在正在执行的操作,将数据拆分为heavy
分区和light
分区,但在这种情况下,您需要cache
file
1}} - 不是heavy
和light
- 因为它是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)
希望它有所帮助。