Spark:为执行者而不是分区设置工作

时间:2016-07-30 03:46:46

标签: java apache-spark

我们知道我们可以使用mapPartition等为每个分区进行设置工作,但是我在每个执行器中都有很多分区要处理,每个分区都进行精确的设置工作。我想知道我是否可以为执行程序而不是分区执行设置工作,以便同一执行程序中的分区不必重复设置工作。

1 个答案:

答案 0 :(得分:0)

两种方式

  1. 使用broadcast variable。这主要是为了将一些大型结构复制到每个执行器,所以我不确定它是否适用于您的用例。我之所以提到它只是因为如果它确实适用于你的用例,那么更容易做对。

  2. 使用lazy值进行所有设置工作,然后在RDD转换中使用该值。由于在转换之前不需要该值,因此只有在到达执行程序时才会触发其评估。然后,凭借lazy,每个JVM实例只执行一次,因此每个执行程序执行一次。

    我在当前的项目中使用这种技术,所以我应该添加一个免责声明:您必须非常小心地编写代码以避免序列化错误...它很容易关闭在您的设置代码中无法序列化的内容。

  3. 修改

    我很抱歉由于某种原因我错过了你没有被标记的事实" Scala"但只有" Java"。我认为我给出的建议仍然有效,但是你必须稍微努力才能在那里得到懒惰 - although that appears to not be too difficult now that Java 8 has lambdas