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

时间:2016-09-05 11:02:35

标签: python apache-spark pyspark partitioning rdd

我正在尝试协调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个节点的集群吗?

最后,这是一张似乎支持这种技术的幻灯片:

enter image description here slides - check #52

1 个答案:

答案 0 :(得分:0)

简短回答:不会。在集群中,RessourceManager(大多数情况下是YARN)将使用工作人员(如果可用),并且当您的系统是多用户时,或者如果您已经是在您的群集的子集中开始工作。因此,您无法使用索引绑定工作程序。

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