Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jquery-ui/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache spark PySpark reduceByKey导致内存不足_Apache Spark_Pyspark_Google Cloud Dataproc - Fatal编程技术网

Apache spark PySpark reduceByKey导致内存不足

Apache spark PySpark reduceByKey导致内存不足,apache-spark,pyspark,google-cloud-dataproc,Apache Spark,Pyspark,Google Cloud Dataproc,我正在尝试在Thread模式下运行一个作业,该模式处理从google云存储读取的大量数据(2TB)。 我的管道可以处理10GB的数据。 我的集群的规格和我的管道的开始在这里详细说明: 以下是管道的其余部分: input.groupByKey()\ [...] processing on sorted groups for each key shard .mapPartitions(sendPartition)\ .map(mergeShardsb

我正在尝试在Thread模式下运行一个作业,该模式处理从google云存储读取的大量数据(2TB)。 我的管道可以处理10GB的数据。 我的集群的规格和我的管道的开始在这里详细说明:

以下是管道的其余部分:

      input.groupByKey()\
      [...] processing on sorted groups for each key shard
      .mapPartitions(sendPartition)\
      .map(mergeShardsbyKey)
      .reduceByKey(lambda list1, list2: list1 + list2).take(10)
      [...] output
应用于分区的映射函数如下所示:

def sendPartition(iterator):
    pool = external_service_connection_pool()
    return [make_request(record, pool) for record in iterator]

def make_request(record, pool):
    [...] tags a record based on query results from the external service
    return key, taggedrecord
在整个数据集上,由于以下原因导致执行失败:

java.lang.OutOfMemoryError:java堆空间

我试图获取更多的信息,我看到它在
reduceByKey
上失败,但是由于
mapPartitions
,任务只在一个执行者上执行,直到它在reduce上失败为止(Spark web界面上至少只显示一个executor,并且在reduce之前作业不会拆分为多个任务)

我的问题是:为什么它只在一个执行者身上运行? 尽管描述函数的文档似乎符合我的想法
mapPartitions
(这是一个故障,还是应该在
groupByKey
之后工作


编辑:我在一个较小的集群上使用较小的数据集进行了尝试,尽管成功了,但在groupByKey之后,只使用一个执行器来处理所有数据。此外,每个阶段之后都有多个分区,groupByKey阶段被记为“挂起”当我一个接一个地启动stages时,请在界面上为每个stage指定numtask。

尝试为reduce指定numtask。很抱歉,不是很清楚,reduce被拆分为任务,而不是mapPartitions,reduce使用了所有worker。我只是认为它们可以以某种方式链接。mapPartitions的使用主要是为了优化con的重用吗尽可能多的连接池?是的,它是用来这样做的,我知道我可以合并分区,使每个工作者只有一个连接池,但我不认为这是问题,因为考虑到分区的数量(大约58000个),我的外部服务没有得到那么大的负载.奇怪的是,reduceByKey在一个小数据集上已经非常慢了(在一个小集群上是group by持续时间的15倍)。一种可能是mapPartitions在spark动态分配中越来越不走运;在该步骤中是否只有1个注册的执行器,或者是否有其他执行器未被使用?无论哪种方式,您都可以尝试将spark.executor.instances=99999设置为--conf或在gcloud dataproc,--properties中,并查看这是否重要尝试指定NumTasks for ReduceByKey抱歉,不是很清楚,reduce被分成了任务,但mapPartitions没有,reduce使用了所有的worker。我只是认为它们可以以某种方式链接。mapPartitions的使用主要是为了尽可能优化连接池的重用吗?是的,它是用来这样做的,我知道我可以将分区合并到ha我每个工作者只有一个连接池,但我不认为这是问题所在,因为考虑到分区的数量(大约58000个),我的外部服务没有得到那么大的负载。奇怪的是,reduceByKey在一个小数据集上已经非常慢了(在一个小集群上是group by的15倍)。一种可能是mapPartitions在spark动态分配中越来越不走运;在该步骤中是否只有1个注册的执行器,或者是否有其他执行器未被使用?无论哪种方式,您都可以尝试将spark.executor.instances=99999设置为--conf或在gcloud dataproc,--属性,然后看看这是否重要