我的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的吗?我运行代码时没有看到这种行为,所以请告诉我它是否是配置选项。
答案 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是线程安全的,因此您无需牺牲任何东西即可获得并行效率。