SPARK - 在pyspark中的RDD.map中为一个任务分配多个核心

时间:2017-05-16 15:26:54

标签: apache-spark parallel-processing pyspark spark-dataframe rdd

我是SPARK的新手,我尝试在pyspark中使用RDD.map来并行运行SPARK框架中名为 function 的方法(独立SPARK中共有72个核心)集群 - 一个带100G RAM的驱动程序和3个工作程序,每个驱动程序有24个内核和100G RAM。)

我的目标是运行功能 200次并对结果取平均值。 函数的输出是一个大小为12的numpy.array,由num_of_samples(在内存方面是一个巨大的变量)。

我的第一次尝试是创建一个大小为200的RDD,然后使用RDD.map并在结尾处减少:

sum_data = sc.parallelize(range(0,200)).map(function).reduce(lambda x,y:x+y)

尽管我将spark驱动程序内存设置为最大值,但它在reduce级别耗尽内存(我猜是由于函数的巨大numpy.array输出)。我想为了避免内存错误,我可以放入RDD的最大元素数量大约有40个元素:

sum_data = sc.parallelize(range(0,40)).map(function).reduce(lambda x,y:x+y)

现在,当我尝试这个时,我发现SPARK创建了40个任务,并为每个任务分配了一个核心(在集群中只使用了72个可用核心中的40个核心)。因此其他32个内核空闲且未使用,导致运行时间非常慢。我想知道这种方法是否正确,如何让RDD.map使用所有可用内核而不是每个映射使用一个内核?

1 个答案:

答案 0 :(得分:0)

我认为这可以通过指定spark必须将RDD划分为的分区数来实现。 这样做的最简单方法是在numSlices方法调用中添加可选的parallelize参数,这样可以确保将数据分成numSlices分区,我认为它将使用整个核心。

有关详细信息,请参阅official documentation