访问客户端对象和代码

时间:2016-03-31 11:54:19

标签: apache-spark

Spark应用程序需要验证RDD中的每个元素。

给定一个名为Validator的驱动程序\客户端Scala对象,以下两种解决方案中的哪一种更好:

rdd.filter { x => if Validator.isValid(x.somefield) true else false }

或类似

// get list of the field to validate against
val list = rdd.map(x => x.somefield)
// Use the Validator to check which ones are invalid
var invalidElements = Validator.getValidElements().diff(list)
// remove invalid elements from the RDD
rdd.filter(x => !invalidElements.contains(x.somefield))

第二种解决方案避免在传递给RDD的函数中引用驱动程序端对象。在客户端上确定无效元素,然后将该列表传递回RDD。

或者既不推荐?

由于

1 个答案:

答案 0 :(得分:2)

如果我理解正确(即你有一个object Validator),那不是驱动程序代码,因为你的工作的Jar也会分发给工人。因此,您定义的Scala对象也将在执行程序JVM中实例化。 (这也是为什么你没有收到序列化异常而不是使用作业中定义的方法,例如在带有检查点的Spark Streaming中)。

第一个版本应该更好,因为您先过滤。映射所有数据然后过滤它会更慢。

第二个版本也存在问题,因为如果要在驱动程序上创建有效元素列表,则现在必须将其发送回工作者。