Pyspark并行多个工作

时间:2015-11-27 18:48:16

标签: python apache-spark pyspark

我的Pyspark有以下情况:

在我的驱动程序(driver.py)中,我从另一个文件(prod.py)调用一个函数

latest_prods = prod.featurize_prods(). 

驱动程序代码:

from Featurize import Featurize
from LatestProd import LatestProd
from Oldprod import Oldprod

sc = SparkContext()

if __name__ == '__main__':
    print 'Into main'

featurize_latest = Featurize('param1', 'param2', sc)

latest_prod = LatestProd(featurize_latest)
latest_prods = latest_prod.featurize_prods()
featurize_old = Featurize('param3', 'param3', sc)

old_prods = Oldprod(featurize_old)
old_prods = oldprod.featurize_oldprods()
total_prods =  sc.union([latest_prods, old_prods])

然后我在这里做一些reduceByKey代码......生成total_prods_processed

最后我打电话给:

total_prods_processed.saveAsTextFile(...)

我想并行生成latest_prods和old_prods。两者都是在同一SparkContext中创建的。有可能吗?如果没有,我该如何实现该功能?

这是自动执行Spark的吗?我运行代码时没有看到这种行为,所以请告诉我它是否是配置选项。

2 个答案:

答案 0 :(得分:0)

简短的回答是否定的,你不能在同一个火花环境中同时在两个不同的RDD上安排操作。但是有一些解决方法,您可以在同一个集群上的两个不同的SparkContext中处理它们并调用SaveAsTextFile。然后在另一个作业中读取以执行联合。 (文档不推荐这样做)。 如果你想尝试这个方法,这里讨论使用spark-jobserver,因为spark默认情况下不支持多个上下文:https://github.com/spark-jobserver/spark-jobserver/issues/147

然而,根据您执行的操作,没有理由同时处理这两个操作,因为您需要完整的结果来执行联合,spark会将这些操作分成两个不同的阶段,这些阶段将一个接一个地执行

答案 1 :(得分:0)

在互联网上搜索后,我认为您的问题可以通过线程解决。这就像为old_prod和latest_prod工作创建两个线程一样简单。

请查看this post以获取简化示例。由于Spark是线程安全的,因此您无需牺牲任何东西即可获得并行效率。