Python 2.7 如何使用PySpark并行运行独立转换?

Python 2.7 如何使用PySpark并行运行独立转换?,python-2.7,apache-spark,pyspark,apache-spark-sql,python-multiprocessing,Python 2.7,Apache Spark,Pyspark,Apache Spark Sql,Python Multiprocessing,我正在尝试使用PySpark在单个RDD上并行运行两个函数进行完全独立的转换。有哪些方法可以做到这一点 def doXTransforms(sampleRDD): (X transforms) def doYTransforms(sampleRDD): (Y Transforms) if __name__ == "__main__": sc = SparkContext(appName="parallelTransforms") sqlContext = SQ

我正在尝试使用PySpark在单个RDD上并行运行两个函数进行完全独立的转换。有哪些方法可以做到这一点

def doXTransforms(sampleRDD):
    (X transforms)

def doYTransforms(sampleRDD):
    (Y Transforms)

if __name__ == "__main__":
    sc = SparkContext(appName="parallelTransforms")
    sqlContext = SQLContext(sc)
    hive_context = HiveContext(sc)

    rows_rdd = hive_context.sql("select * from tables.X_table")

    p1 = Process(target=doXTransforms , args=(rows_rdd,))
    p1.start()
    p2 = Process(target=doYTransforms, args=(rows_rdd,))  
    p2.start()
    p1.join()
    p2.join()
    sc.stop()
这是行不通的,我现在明白这是行不通的。
但是,有没有其他方法可以让这一切顺利进行呢?具体来说,是否有任何特定于python spark的解决方案?

只需使用线程,并确保集群有足够的资源同时处理这两个任务

从线程导入线程
导入时间
def过程(rdd,f):
def延迟(x):
时间。睡眠(1)
返回f(x)
返回rdd.map(delay.sum())
rdd=sc.parallelize(范围(100),int(sc.defaultParallelism/2))
t1=线程(目标=进程,参数=(rdd,λx:x*2))
t2=线程(目标=进程,参数=(rdd,λx:x+1))
t1.start();t2.start()
可以说,这在实践中并不经常有用,但在其他方面应该可以很好地工作

您可以进一步与
FAIR
调度程序和调度程序池一起使用,以便更好地控制执行策略

您也可以尝试(免责声明-此答案的作者也是该软件包的作者),该软件包提供了一套围绕Spark API和
concurrent.futures的包装:

导入异步操作
进口期货
f1=rdd.filter(lambda x:x%3==0).countAsync()
f2=rdd.filter(lambda x:x%11==0).countAsync()
[x.result()用于并发.futures.as_中的x已完成([f1,f2])]

如果您的每个转换都可以使用(几乎)100%的集群资源(通常是这样),那么并行运行它们实际上会降低速度。由于GIL,python中的线程并不是真正的并行。因此,如果我使用上述方法,那么我将无法使用多个核,对吗?这并不重要。这段代码中唯一发生的事情是RPC调用。它不涉及实际计算。您也可以通过异步调用在单个线程中处理此问题。请参阅下面的内容和我的评论。这很有效,谢谢!我唯一需要做的修改是在/etc/hadoop/conf/capacity-scheduler.xml中将warn.scheduler.capacity.maximum-am-resource-percent从0.1更改为0.5。