Общее выделение превышает 95,00% (960 285 889 байт) кучи памяти - ошибка Pyspark - PullRequest
0 голосов
/ 21 ноября 2018

Я написал скрипт на python 2.7, который использует pyspark для преобразования csv в паркет и другие вещи.когда я запускаю свой сценарий для небольших данных, он работает хорошо, но когда я выполняю его для больших данных (250 ГБ), я сталкиваюсь со следующей ошибкой: общее выделение превышает 95,00% (960 285 889 байт) памяти кучи.Как я могу решить эту проблему?и в чем причина, что это происходит?tnx!

часть кода: импортированные библиотеки: import pyspark as ps from pyspark.sql.types import StructType, StructField, IntegerType, DoubleType, StringType, TimestampType,LongType,FloatType from collections import OrderedDict from sys import argv

с использованием pyspark:

 schema_table_name="schema_"+str(get_table_name())
 print (schema_table_name)
 schema_file= OrderedDict()

schema_list=[]
ddl_to_schema(data)
for i in schema_file:
schema_list.append(StructField(i,schema_file[i]()))

schema=StructType(schema_list)
print schema

spark = ps.sql.SparkSession.builder.getOrCreate()
df = spark.read.option("delimiter", 
",").format("csv").schema(schema).option("header", "false").load(argv[2])
df.write.parquet(argv[3])

# df.limit(1500).write.jdbc(url = url, table = get_table_name(), mode = 
  "append", properties = properties)
# df = spark.read.jdbc(url = url, table = get_table_name(), properties = 
  properties)
pq = spark.read.parquet(argv[3])
pq.show()

только для пояснения имени_стали_таблицы предназначено для сохранения имени всех таблиц (чтонаходятся в DDL, которые соответствуют csv).

функция ddl_to_schema просто возьмите обычный ddl и отредактируйте его в ddl, с которым может работать паркет.

1 Ответ

0 голосов
/ 21 ноября 2018

Кажется, что вашему драйверу не хватает памяти.

По умолчанию память драйвера установлена ​​на 1 ГБ.Поскольку ваша программа использовала 95% ее объема, приложению не хватило памяти.

, вы можете пытаться изменить его, пока не достигнете «сладкого пятна» для ваших нужд, ниже я устанавливаю его на 2 ГБ:

pyspark --driver-memory 2g

Вы также можете играть с памятью исполнителя, хотя здесь это не является проблемой (по умолчанию для исполнителя4 ГБ).

pyspark --driver-memory 2g --executor-memory 8g

теория состоит в том, что искровые действия могут выгружать данные в драйвер, вызывая его запускНедостаточно памяти, если не правильно измерены.Я не могу сказать наверняка в вашем случае, но кажется, что причиной является именно запись.

Вы можете взглянуть на теорию здесь (прочитайте о программе драйвера, а затем проверьте действия):

https://spark.apache.org/docs/2.2.0/rdd-programming-guide.html#actions

...