2017-02-13 37 views
0

这是一段代码片段。 (问题描述如下)为什么一个适度的火花广播变量会使工作挂起?

val broadcastVarbannedDNS = sc.broadcast(filterList) 
val INPUT = hc.table(s"tableName").where(s"DS BETWEEN 2016120100 AND 2016120100").rdd.filter(x => !broadcastVarbannedDNS.value.map(str => x.getString(2).contains(str)).contains(true)) 
INPUT.count() 

filterList是一个带有200k +行的csv。出来约9MB。

当我使用整个筛选器列表运行时,作业在筛选器阶段挂起,并且没有任何异常或提示显示问题。日志上也没有。但是,当我将filterList文件剪切成几百行时,它会像热刀一样通过黄油运行。立即,可以得出结论:“更大”的文件是问题,尽管9MB与应该能够处理GB的缓存相比是微不足道的。任何帮助表示赞赏。

回答

1

我想象的问题是,如果你在过滤器中有RD记录和M行记录,那么你的处理是O(M * N),因为你正在检查每条记录对应的每行记录。

这意味着如果处理N个记录是1秒,并且你有200K行,那么你正在运行200K秒,这将与挂起相同。

相关问题