Python 使用mapPartitionsWithIndex()在Spark中如何为节点分配索引?

Python 使用mapPartitionsWithIndex()在Spark中如何为节点分配索引?,python,apache-spark,pyspark,partitioning,rdd,Python,Apache Spark,Pyspark,Partitioning,Rdd,我试图在Spark集群上协调GPU的执行。为了实现这一点,我需要每个任务/分区在每个系统中只使用一个特定的GPU插槽。每个系统有4个gpu,我发现实现这一点的最简单方法是在rdd上使用数据执行mapPartitionsWithIndex(),然后使用索引作为gpu插槽 我的问题是,我是否可以依靠始终分配给工作节点的索引?是否有任何相关文件 快速示例: from pyspark import SparkContext from pyspark.sql import SQLContext sc =

我试图在Spark集群上协调GPU的执行。为了实现这一点,我需要每个任务/分区在每个系统中只使用一个特定的GPU插槽。每个系统有4个gpu,我发现实现这一点的最简单方法是在rdd上使用数据执行mapPartitionsWithIndex(),然后使用索引作为gpu插槽

我的问题是,我是否可以依靠始终分配给工作节点的索引?是否有任何相关文件

快速示例:

from pyspark import SparkContext
from pyspark.sql import SQLContext

sc = SparkContext(appName="sample")
sqlContext = SQLContext(sc)

def print_partition_info(idx, part):
    print "Index: {} - Partition data: {}".format(idx, part)
    for p in part:
        yield p

data = [1,1,1,2,2,2, 20, 30, 40, 100]
partitions = 4
rdd = sc.parallelize(data, partitions)
# rdd = rdd.coalesce(len(partition_keys))
rdd2 = rdd.mapPartitionsWithIndex(print_partition_info)
让我们假设在rdd2上运行操作的打印输出是

Index: 0 - Partition data: [1,1]  
Index: 1 - Partition data: [1,2]  
Index: 2 - Partition data: [2,2]  
Index: 3 - Partition data: [20,30,40,100] 
当这些分区被发送到工作区(比如2个工作区)时,它们是否总是像…
辅助进程1分区=1,2
辅助分区2=3,4

在此基础上展开,分区是否总是针对10个或50个节点的集群进行排序

最后,这张幻灯片似乎支持这项技术:


简短回答:不。在集群中,如果可用,RessourceManager(大多数情况下)将使用worker,并且当您的系统是多用户的,或者您已经在集群的某个子集中启动了作业时,情况并不总是如此。因此,您不能用索引绑定工作者


因此,我非常确定索引0将绑定到数据中的第一个分区,依此类推。如果我错了,专家会纠正我。

简短回答:不。在集群中,如果可用,RessourceManager(大多数情况下)将使用worker,并且当您的系统是多用户的,或者您已经在集群的某个子集中开始了作业时,情况并不总是如此。因此,您不能用索引绑定工作者


因此,我非常确定索引0将绑定到数据中的第一个分区,依此类推。如果我错了,专家会纠正我。

我本来打算添加我自己的答案,因为我看到其他人在Spark上使用这种技术进行GPU计算,但由于我仍在测试它,所以我还没有开始使用它,我只使用了一个独立的Spark群集。但是从我到目前为止的测试来看,mapPartitionsWithIndex总是按顺序为每个节点分配索引。第一个可用的节点仍将被拾取,但它们始终保持顺序,这样一个包含10个系统的集群就可以在每个系统中分配索引为%GPU_count的GPU。我将很快发布一个链接。我打算添加我自己的答案,因为我看到其他人在Spark上使用这种技术进行GPU计算,但由于我仍在测试它,我还没有开始使用它,我只使用一个独立的Spark群集。但是从我到目前为止的测试来看,mapPartitionsWithIndex总是按顺序为每个节点分配索引。第一个可用的节点仍将被拾取,但它们始终保持顺序,这样一个包含10个系统的集群就可以在每个系统中分配索引为%GPU_count的GPU。我将很快发布一个链接。