【问题标题】:In spark streaming can I create RDD on worker在火花流中,我可以在工作人员上创建 RDD
【发布时间】:2016-09-27 05:10:27
【问题描述】:

我想知道如何在包含地图的工人上创建 RDD。这个 Map/RDD 会很小,我希望这个 RDD 完全驻留在一台机器/执行器上(我猜 repartition(1) 可以实现这一点)。此外,我希望能够在本地执行器上缓存此 Map/RDD,并在此执行器上运行的任务中使用它以进行查找。

我该怎么做?

【问题讨论】:

  • 您不会发现任何简单/漂亮的方法可以做到这一点。这不是 Spark 擅长的领域。进行本地查找等。

标签: apache-spark rdd


【解决方案1】:

不,您不能在工作节点中创建 RDD。只有驱动才能创建 RDD。

广播变量似乎是您的情况的解决方案。它会将数据发送给所有工作人员,但是如果您的地图很小,那么这不是问题。

您无法控制您的 RDD 将放置在哪个分区上,因此您不能只执行 repartition(1) - 您不知道此 RDD 是否会放置在同一个节点上;) 广播变量将在每个节点上,所以查找会非常快

【讨论】:

  • 感谢您提供此信息。我的地图可能会不时发生变化。是否可以更新此 Map/Broadcast 变量并将其重新广播给所有执行者。我在以下位置找到了一些相关信息:gist.github.com/BenFradet/c47c5c7247c5d5d0f076,它是否有效/有效。
  • 不,不应更改广播变量。更新广播数据的唯一可能方法是不创建自己的 AccumulatorV2 实现,它将保存您的地图的状态 - 添加操作只会替换状态
  • 可以更改您的数据并重新广播。帮助您的链接:gist.github.com/mcnamaras/040a362ca8100347e1a6
【解决方案2】:

您可以使用 sc.parallelize(data) 在您的驱动程序上创建 RDD。对于存储 Map,可以将其拆分为 2 部分作为键、值,然后可以作为两个单独的列存储在 RDD/Dataframe 中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-25
    • 1970-01-01
    • 2017-01-03
    相关资源
    最近更新 更多