相关疑难解决方法(0)

Spark:groupBy需要花费大量时间

在我的应用程序中,当获取性能数字时,groupby正在吃掉很多时间.

我的RDD低于strcuture:

JavaPairRDD<CustomTuple, Map<String, Double>>
Run Code Online (Sandbox Code Playgroud)

CustomTuple: 此对象包含有关RDD中当前行的信息,如周,月,城市等.

public class CustomTuple implements Serializable{

private Map hierarchyMap = null;
private Map granularMap  = null;
private String timePeriod = null;
private String sourceKey  = null;
}
Run Code Online (Sandbox Code Playgroud)

地图

此地图包含有关该行的统计数据,例如投资额,GRP数量等.

<"Inv", 20>

<"GRP", 30>
Run Code Online (Sandbox Code Playgroud)

我正在这个RDD上执行DAG

  1. 对此RDD应用过滤器并限定相关行:过滤器
  2. 对此RDD应用过滤器并限定相关行:过滤器
  3. 加入RDD:加入
  4. 应用地图阶段计算投资:地图
  5. 应用GroupBy阶段根据所需视图对数据进行分组:GroupBy
  6. 应用地图阶段按照上一步骤中实现的分组聚合数据(比如跨时间段的视图数据),并根据希望收集的结果集创建新对象:Map
  7. 收集结果:收集

因此,如果用户想要跨时间段查看投资,则返回List以下(这是在上面的步骤4中实现的):

<timeperiod1, value> 
Run Code Online (Sandbox Code Playgroud)

当我检查操作时间时,GroupBy占用了执行整个DAG所用时间的90%.

IMO,我们可以通过sing 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>
Run Code Online (Sandbox Code Playgroud)

这是非常令人沮丧的,因为没有Spark的应用程序的当前性能比Spark的性能好10倍.

任何见解都表示赞赏.

[编辑]我们也注意到JOIN花了很多时间.也许这就是为什么groupby需要时间.[编辑]

TIA!

reduce aggregate apache-spark

1
推荐指数
1
解决办法
5214
查看次数

标签 统计

aggregate ×1

apache-spark ×1

reduce ×1