我是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使用所有可用内核而不是每个映射使用一个内核?
答案 0 :(得分:0)
我认为这可以通过指定spark必须将RDD
划分为的分区数来实现。
这样做的最简单方法是在numSlices
方法调用中添加可选的parallelize
参数,这样可以确保将数据分成numSlices
分区,我认为它将使用整个核心。
有关详细信息,请参阅official documentation。