Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/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
Python GCP Dataproc节点中没有用于启动新SparkSession的资源_Python_Apache Spark_Pyspark_Google Cloud Dataproc_Namenode - Fatal编程技术网

Python GCP Dataproc节点中没有用于启动新SparkSession的资源

Python GCP Dataproc节点中没有用于启动新SparkSession的资源,python,apache-spark,pyspark,google-cloud-dataproc,namenode,Python,Apache Spark,Pyspark,Google Cloud Dataproc,Namenode,我正在处理一个必须处理大量数据(多个表)的用例,并尝试将其作为批处理作业提交给Dataproc集群(PySpark) 我的代码看起来像这样 从pyspark导入SparkContext 从pyspark.sql导入SQLContext 从pyspark.sql导入SparkSession def readconfig(): #读取yaml文件的代码 def func(文件名、选项卡名): sc=SparkContext(“本地”、“第一个应用程序”) sqlContext=sqlContext(

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

我的代码看起来像这样

从pyspark导入SparkContext
从pyspark.sql导入SQLContext
从pyspark.sql导入SparkSession
def readconfig():
#读取yaml文件的代码
def func(文件名、选项卡名):
sc=SparkContext(“本地”、“第一个应用程序”)
sqlContext=sqlContext(sc)
spark=SparkSession.builder.getOrCreate()
df1=使用sqlcontext以rdd形式从文件名中读取
df2=使用spark从bigquery tabname读取df
.
op=中间处理
.
#缓存和取消持久化2 dfs
.
op.write.csv(在gcs存储桶中写入多个文件)
sc.停止()
spark.stop()
打印(“已处理一对表和文件”)
如果名称=“\uuuuu main\uuuuuuuu”:
config=readconfig()
对于config.items()中的i,j:
func(i,j):
由于文件大小很大,我正在尝试为正在处理的每一对文件和表创建一个单独的
SparkSession
。它工作得很好,我能够处理很多表。后来,我开始收到有关节点内存问题的警告,最后出现一个错误,提示:

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


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

因为您正在将
本地
值传递给中的
参数,并且在单个VM(Dataproc主节点)上以本地方式运行应用程序。这就是为什么不能在应用程序中处理大量数据的原因

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


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

因为您正在运行单个VM(Dataproc主节点)上的本地应用程序。这就是为什么不能在应用程序中处理大量数据的原因

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

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