出于测试目的,虽然我没有生产集群,但我在本地使用spark:
print('Setting SparkContext...')
sconf = SparkConf()
sconf.setAppName('myLocalApp')
sconf.setMaster('local[*]')
sc = SparkContext(conf=sconf)
print('Setting SparkContext...OK!')
另外,我使用的是一个非常小的数据集,在postgresql数据库中只包含20行(~2kb)
另外(!),我的代码也非常简单,仅通过键对 20行进行分组并应用简单的地图操作
params = [object1, object2]
rdd = df.rdd.keyBy(lambda x: (x.a, x.b, x.c)) \
.groupByKey() \
.mapValues(lambda value: self.__data_interpolation(value, params))
def __data_interpolation(self, data, params):
# TODO: only for testing
return data
困扰我的是整个执行需要 5分钟!!
检查Spark UI,我发现大部分时间花费在第6阶段:byKey方法。 (第7阶段,collect()方法也很慢......)
一些信息:
这些数字对我没有意义......为什么我需要22个任务,执行54秒,处理少于1 kb的数据
是否可能是网络问题,试图弄清楚localhost的IP地址? 我不知道......有什么线索吗?
答案 0 :(得分:3)
似乎代码片段性能下降的主要原因是使用了groupByKey()
。 groupByKey
的问题在于它最终改组了所有键值对,导致大量数据被不必要地传输。解释此问题的一个很好的参考是Avoid GroupByKey。
要解决此问题,您可以:
reduceByKey
(上面的避免GroupByKey链接中还包含更多信息)。顺便说一下,回顾上面的Spark UI图,#22指的是DAG中的任务#(不是执行的任务数)。
HTH!
答案 1 :(得分:1)
我认为“postgresql”是解决这个难题的关键。
cbCtrl.DataBindings.Add( "Text", myBindingSource, ColDBName );
可能是第一个真正使用数据的操作,因此它需要从外部数据库获取数据时执行时间更长。您可以通过在开头添加来验证它:
keyBy
如果我是对的,您需要优化数据库。它可能是:
答案 2 :(得分:0)
从我在运行spark时在系统中看到的情况开始:
当我们运行一个spark作业时,它会在内部创建map并减少任务并运行它们。在您的情况下,为了运行您拥有的数据,它创建了22个此类任务。我的数据量越大,数字就越大。
希望这有帮助。