我正在研究spark任务的一些输入和输出指标。这基本上是一个count by key,最后有一个saveashadoop将数据存储到dynamodb中。经典的MapReduce。
看看一些指标,
似乎在Map之后,spark会盲目地对数据进行洗牌,然后对每个洗牌的分区应用reduce函数。如果reduce函数主要减少了输出,那么在洗牌之前和洗牌之后,首先对每个分区进行排序并应用reduce是最佳的,这很容易,因为reduce函数会进行关联和交换。这是一个经典的hadoopMap->组合->洗牌->减少模式。spark能利用这个优化吗?
1条答案
按热度按时间ars1skjm1#
还原键:
在上图中,您可以看到rddx有一组多个成对的元素,如(a,1)和(b,1)以及3个分区。
它接受一个函数
(accum, n) => (accum + n)
它用默认整数值0初始化accum变量,为每个键加上一个元素并返回finalRDD Y
总计数与键配对。在跨分区洗牌数据之前,它也会这样做aggregation
本地为每个分区。这是一个广泛的操作,因为它从多个分区洗牌数据,并创建另一个分区
RDD
.在跨分区发送数据之前,它还
merges the data locally
使用相同的关联函数优化数据洗牌来源