分享

如何通过代码统计spark在shuffle阶段所消耗的时间

现在有一个问题,就是统计shuffle阶段消耗的时间占程序运行总时间的百分比,可是怎么通过代码实现统计shuffle阶段消耗的时间呢?

已有(5)人评论

跳转到指定楼层
langke93 发表于 2018-5-22 20:32:49
这个还真不好弄。除非在代码中埋点,通过time统计。当然需要修改源码。除非配置中有这个选项,似乎当前也没有。
所以楼主不嫌麻烦,那就改下源码吧。
当然也有其它一些间接的办法,比如通过监控查看资源的使用,如果过高了,那肯定是在shuffle。这个只能统计个大概。
为啥想统计shuffle了哪?
回复

使用道具 举报

星语心愿 发表于 2018-5-22 21:11:49
langke93 发表于 2018-5-22 20:32
这个还真不好弄。除非在代码中埋点,通过time统计。当然需要修改源码。除非配置中有这个选项,似乎当前也没 ...

撰写毕业论文,需要研究一下网络的延迟对分布式系统的影响,所以我想研究一下shuffle消耗的时间占程序运行总时间的比值
回复

使用道具 举报

einhep 发表于 2018-5-22 22:31:00
星语心愿 发表于 2018-5-22 21:11
撰写毕业论文,需要研究一下网络的延迟对分布式系统的影响,所以我想研究一下shuffle消耗的时间占程序运 ...

那这个你可以通过改变网速来研究。
对网速分层10K,100K,1M来查看情况。

回复

使用道具 举报

fly2015 发表于 2018-5-23 11:03:04
监控界面 应该可以看吧
回复

使用道具 举报

星语心愿 发表于 2018-5-24 09:17:39
本帖最后由 星语心愿 于 2018-5-24 09:19 编辑

知道怎么弄了,谢谢
int num = jsc.sc().jobProgressListener().completedStages().size();
long shuffleReadTime = 0;
long shuffleWriteTime = 0;
for(int i=0;i<num;i++){
    int id = jsc.sc().jobProgressListener().completedStages().apply(i).stageId();
    shuffleReadTime += jsc.sc().jobProgressListener().stageIdToInfo().apply(id).
                                                taskMetrics().shuffleReadMetrics().fetchWaitTime();
    shuffleWriteTime += jsc.sc().jobProgressListener().stageIdToInfo().apply(id).
                                               taskMetrics().shuffleWriteMetrics().writeTime();
}
时间单位是纳秒
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条