【发布时间】:2015-03-14 15:47:16
【问题描述】:
在我的应用程序中获取性能数据时,groupby 占用了大量时间。
我的 RDD 的结构如下:
JavaPairRDD<CustomTuple, Map<String, Double>>
自定义元组: 此对象包含有关 RDD 中当前行的信息,例如星期、月份、城市等。
public class CustomTuple implements Serializable{
private Map hierarchyMap = null;
private Map granularMap = null;
private String timePeriod = null;
private String sourceKey = null;
}
地图
此地图包含有关该行的统计数据,例如投资多少、GRP 多少等。
<"Inv", 20>
<"GRP", 30>
我在这个 RDD 上的 DAG 下执行
- 在此 RDD 上应用过滤器并确定相关行的范围:过滤器
- 在此 RDD 上应用过滤器并确定相关行的范围:过滤器
- 加入 RDD:加入
- 应用地图阶段来计算投资:地图
- 应用 GroupBy 阶段根据所需视图对数据进行分组:GroupBy
- 应用地图阶段以根据上述步骤中实现的分组聚合数据(例如查看跨时间段的数据),并根据希望收集的结果集创建新对象:地图
- 收集结果:收集
因此,如果用户想要查看跨时间段的投资,则返回下面的列表(这是在上面的第 4 步中实现的):
<timeperiod1, value>
当我检查操作所花费的时间时,GroupBy 花费了执行整个 DAG 所花费时间的 90%。
IMO,我们可以用一个单一的 reduce 替换 GroupBy 和后续的 Map 操作。 但reduce 将适用于JavaPairRDD> 类型的对象。 所以我的 reduce 就像 T reduce(T,T,T) 其中 T 是 CustomTuple, Map。
或者也许在上面 DAG 中的第 3 步之后,我运行另一个 map 函数,该函数返回一个 RDD 类型,用于需要聚合的指标,然后运行 reduce。
另外,我不确定聚合函数是如何工作的,在这种情况下它能否帮助我。
其次,我的应用程序将收到有关不同键的请求。在我当前的 RDD 设计中,每个请求都需要我在这个键上重新分区或重新组合我的 RDD。这意味着对于每个请求,分组/重新分区将花费我 95% 的时间来计算作业。
<"market1", 20>
<"market2", 30>
这非常令人沮丧,因为当前没有 Spark 的应用程序性能比使用 Spark 的性能好 10 倍。
感谢任何见解。
[EDIT]我们还注意到 JOIN 花费了很多时间。也许这就是 groupby 需要时间的原因。[编辑]
TIA!
【问题讨论】:
标签: aggregate apache-spark reduce