GCP Dataproc 节点中没有资源来启动新的 SparkSession

Posted

技术标签:

【中文标题】GCP Dataproc 节点中没有资源来启动新的 SparkSession【英文标题】:No resources in GCP Dataproc node to start new SparkSession 【发布时间】:2020-06-20 11:44:29 【问题描述】:

我正在处理一个必须处理大量数据(多个表)的用例,并且我正在尝试将其作为批处理作业提交到 Dataproc 集群 (PySpark)。

我的代码看起来像这样

from pyspark import SparkContext
from pyspark.sql import SQLContext
from pyspark.sql import SparkSession

def readconfig():
   #code to read a yaml file

def func(filename, tabname):
   sc = SparkContext("local", "First App")
   sqlContext = SQLContext(sc)
   spark = SparkSession.builder.getOrCreate()
   df1= read from file-filename as rdd using sqlcontext
   df2= read from bigquery-tabname as df using spark
   .
   op = intermediate processing
   .
   #caching and unpersisting 2 dfs 
   .
   op.write.csv(write multiple files in gcs bucket)
   sc.stop()
   spark.stop()
   print("one pair of table and file processed")

if __name__ == "__main__":
   config= readconfig()
   for i,j in config.items():
      func(i,j):

由于文件很大,我正在尝试为正在处理的每对文件和表创建一个单独的SparkSession。它工作正常,我能够处理大量表格。后来我开始收到关于节点内存问题的警告,最后一个错误说:

节点资源不足。无法创建 SparkSession。

为什么在关闭 SparkSession 应该释放上一次迭代的数据内存时会发生这种情况?

【问题讨论】:

【参考方案1】:

因为您将local 值传递给SparkContext constructor 中的master 参数,所以您正在单个VM(Dataproc 主节点)上的本地deployment mode 中运行您的应用程序。这就是您无法在应用程序中处理大量数据的原因。

要解决此问题,您应该使用parametless SparkContext() constructor,它将从 Dataproc 配置的属性中加载参数 - 在这种情况下,当您将应用程序提交到 Dataproc 集群时,您的应用程序将在 YARN 上运行,并且能够利用所有 Dataproc 集群资源/节点。

此外,您可能希望重构您的应用程序,以便在单个 SparkSession 中对所有表进行数据处理,而不是创建每个表 SparkSession - 如果操作正确,这应该更高效和可扩展。

【讨论】:

以上是关于GCP Dataproc 节点中没有资源来启动新的 SparkSession的主要内容,如果未能解决你的问题,请参考以下文章

带有presto的GCP dataproc - 有没有办法使用pyhive通过python远程运行查询?

在不使用 Dataproc 的情况下将 GCP 与 PySpark 连接

GCP Dataproc 自定义图像 Python 环境

YARN 上 GCP Dataproc 上的自动缩放指标

如何在自动扩缩 GCP Dataproc 时了解初级工作者?

错误:启动 Dataproc 集群时资源项目的权限被拒绝