【问题标题】:SparkContext can only be used on the driverSparkContext 只能在驱动上使用
【发布时间】:2018-08-28 15:11:28
【问题描述】:

我正在尝试使用 SparkContext.binaryFiles 函数来处理一组 ZIP 文件。设置是从文件名的 RDD 映射,其中映射函数使用 binaryFiles 函数。

问题是映射函数中引用了 SparkContext,我收到此错误。我该如何解决?

PicklingError:无法序列化对象:异常:您似乎正试图从广播变量、操作或转换中引用 SparkContext。 SparkContext 只能在驱动程序上使用,不能在它在工作人员上运行的代码中使用。有关详细信息,请参阅 SPARK-5063。

示例代码:

file_list_rdd.map(lambda x: sc.binaryFiles("/FileStore/tables/xyz/" + x[1]))

file_list_rdd 是 (id, filename) 元组的 RDD。

【问题讨论】:

  • 其实,在现实世界中。我们很少(几乎不)将 SparkContext 对象从驱动程序转移到工作人员。那么为什么需要这样做呢?
  • 那是因为 binaryFiles 函数只在 SparkContext 类中可用...见spark.apache.org/docs/latest/api/python/pyspark.html
  • 你能分享一些代码吗?这是一个需要考虑的众所周知的问题。
  • 用示例代码更新了问题。我认为我的问题是我想要有两个级别 - 对于顶级 RDD 中的每一行,我想创建一个新的 RDD。但是,创建 RDD 的唯一方法是使用 SparkContext,但我不能在那里使用 SparkContext...
  • 任何值,答案是什么?

标签: pyspark


【解决方案1】:

您似乎需要在不引用 spark 上下文的情况下调用该函数 - 如果这确实适用。

还可以考虑将函数/def 移动到地图主体语句本身。这通常是这样做的——我们使用的是函数式语言。除非我诉诸上述方法并将 defs 移至 Executor 逻辑,否则我一直无法解决序列化错误。

一些文件处理也是通过驱动程序完成的。这篇文章可能很有趣:How to paralelize spark etl more w/out losing info (in file names)。根据您的代码 sn-p 我会在这里查看。

你应该使用这样的东西并相应地处理:

 zip_data = sc.binaryFiles('/user/path-to-folder-with-zips/*.zip')

现在您正在从驱动程序和 sc 使用它。

【讨论】:

  • 很确定这不能完成,你会得到一个错误。看看我发送的那个链接,我会建议。
  • SparkContext 只能在驱动上使用。当你调用 map 时,你是在一个 Executor 上。我发送给您的链接运行并行集合,并从驱动程序调用,还做一些压缩的东西。我就那个问题与那个人讨论了这个问题,因为这就是它的结果。这是正确的方法恕我直言。
  • 更新答案。
  • 很高兴能提供帮助
猜你喜欢
  • 2019-07-21
  • 2021-10-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-08
  • 1970-01-01
  • 1970-01-01
  • 2019-05-19
相关资源
最近更新 更多