В узле GCP Datapro c нет ресурсов для запуска нового сеанса SparkSession - PullRequest
1 голос
/ 20 июня 2020

Я работаю над вариантом использования, когда мне нужно обработать огромное количество данных (несколько таблиц), и я пытаюсь отправить это как пакетное задание в кластер Datapro c (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 для каждой пары обрабатываемых файлов и таблиц. Он отлично работает, и мне удалось обработать большое количество таблиц. Позже я начал получать предупреждение о проблемах с памятью на узле и, наконец, сообщение об ошибке:

node недостаточно ресурсов. Не удалось создать SparkSession.

Почему это происходит, когда закрытие SparkSession должно освободить память от данных с предыдущей итерации?

1 Ответ

0 голосов
/ 12 июля 2020

Поскольку вы передаете значение local параметру master в SparkContext конструкторе , вы запускаете приложение в локальном режиме развертывания на одной виртуальной машине ( Datapro c главный узел). Вот почему вы не можете обрабатывать большие объемы данных в своем приложении.

Чтобы исправить эту проблему, вы должны использовать без параметров SparkContext() конструктор , который будет загружать параметры из свойств, настроенных Datapro c - в этом случае ваше приложение будет работать на YARN, когда вы отправите его в кластер Datapro c, и сможете использовать все ресурсы / узлы кластера Datapro c.

Кроме того, вы можете захотеть провести рефакторинг ваше приложение должно обрабатывать данные для всех таблиц в одном SparkSession вместо создания SparkSession для каждой таблицы - это должно быть более эффективным и масштабируемым, если все сделано правильно.

...