在我的一个火花作业(EMR 5.0.0上的2.0)中,我有大约5GB的数据被交叉连接30行(数据大小几MB)。我还需要分组。我注意到我花了很多时间(一个m3.xlarge主节点和六个m3.2xlar核心节点大约需要4个小时)。通过处理总共花费2小时,并且另外花费2小时将数据写入s3。 所花的时间对我来说并不是很令人印象深刻。我尝试在网上搜索,发现这个链接说groupBy带来很多改组。它还建议,为了避免大量的混洗,应该使用ReduceByKey,因为reduceByKey数据被组合在一起,因此每个分区最多输出一个值,以便通过网络发送每个密钥。然而,随着groupByKey的混乱,所有数据都被浪费地通过网络发送并收集在reduce worker上。 但是,spark dataFrame中没有针对reduceByKey的直接API。您需要将dataFrame转换为RDD,然后执行reduceByKey。 所以问题是 - 1.是否有人面临类似问题以及采取了哪些措施来提高绩效? 2.我选择的机器不对吗? 3. spark 2.0中的GroupBy已经像reduceByKey一样优化,因此不需要reduceByKey作为DataFrame API吗?
以下是groupBy的代码 -
val aggregtedDF: DataFrame = joinedDFWithOtherDfs.groupBy("Col1", "Col2").agg(min("Col3").alias("Col3"))