使用Spark避免顺序迭代

时间:2019-03-21 11:26:14

标签: apache-spark pyspark

我有一个python脚本,该脚本循环访问s3中的URL列表以对每个URL中的镶木地板文件重新分区,然后将合并的文件写入另一个s3目标。对于一小部分网址,我使用python的multiprocessing.Pool函数来并行化进程。

我现在需要针对数千个URL运行此逻辑。为了能够按时完成所有URL的重新分区,我想利用pyspark库并将其作为Spark作业部署在集群上。这是Spark中的代码:

def myfunction(x):
  # spark session is available here
  spark.read.parquet("s3_src").coalesce(1).write.parquet("s3_dest" + x +"/")

if __name__ == "__main__":
  # spark context is initiated and available here
  rdd_urls = [url1, url2, url3, url4, ……, urlN]
  rdd_urls.map(lambda x: myfunction(x))

我尝试同时使用RDD.map()和RDD.foreach(),但意识到Spark执行程序无法处理for循环内的内部代码块,并引发以下错误:

_pickle.PicklingError: Could not serialize object: Exception: It appears that you are attempting to reference SparkContext from a broadcast variable, action, or transformation. SparkContext can only be used on the driver, not in code that it run on workers. For more information, see SPARK-5063.

我目前的理解是,执行者无法将Spark作业提交给集群,但只有驱动程序可以这样做。但是作为Spark的新手,我试图找出如何在Spark中实现相同的目标。对代码示例的任何帮助将不胜感激。

0 个答案:

没有答案