Apache spark SPARK-在pyspark的RDD.map中将多个内核分配给一个任务

Apache spark SPARK-在pyspark的RDD.map中将多个内核分配给一个任务,apache-spark,parallel-processing,pyspark,spark-dataframe,rdd,Apache Spark,Parallel Processing,Pyspark,Spark Dataframe,Rdd,我是SPARK的新手,我正在尝试使用pyspark中的RDD.map来并行运行SPARK框架中名为function的方法(一个独立的SPARK集群中总共有72个内核-一个驱动程序有100G RAM,三个工作程序各有24个内核和100G RAM) 我的目标是运行函数200次,并对结果进行平均。该函数的输出是一个大小为12×num×num×u的numpy.array(就内存而言,这是一个巨大的变量) 我的第一次尝试是创建一个大小为200的RDD,然后使用RDD.map,最后使用reduce: sum

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

我的目标是运行函数200次,并对结果进行平均。该函数的输出是一个大小为12×num×num×u的numpy.array(就内存而言,这是一个巨大的变量)

我的第一次尝试是创建一个大小为200的RDD,然后使用RDD.map,最后使用reduce:

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消耗所有可用的内核,而不是为每个映射使用一个内核?

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


有关更多信息,请参阅。

我已经尝试过了,但它不起作用:sc.parallelize(范围(0,40),72)我想当RDD中的元素数小于分区数(numslice)时,它就不起作用了。