Pyspark simple re-partition и toPandas() не заканчиваются только на 600,000 + строках

у меня есть данные JSON, которые я читаю в фрейм данных с несколькими полями, переделывая его на основе двух столбцов и преобразуя в панды.

эта работа продолжает терпеть неудачу на EMR только на 600 000 строк данных с некоторыми неясными ошибками. Я также увеличил настройки памяти драйвера spark и до сих пор не вижу никакого разрешения.

вот мой код pyspark:

enhDataDf = (
    sqlContext
    .read.json(sys.argv[1])
    )

enhDataDf = (
    enhDataDf
    .repartition('column1', 'column2')
    .toPandas()
    )
enhDataDf = sqlContext.createDataFrame(enhDataDf)
enhDataDf = (
    enhDataDf
    .toJSON()
    .saveAsTextFile(sys.argv[2])
    )

Мои настройки spark следующие:

conf = SparkConf().setAppName('myapp1')
conf.set('spark.yarn.executor.memoryOverhead', 8192)
conf.set('spark.executor.memory', 8192)
conf.set('spark.driver.memory', 8192)
sc = SparkContext(conf=conf)

ошибки, которые я получаю являются:

16/10/01 19:57:56 ERROR executor.CoarseGrainedExecutorBackend: Driver 172.31.58.76:37973 disassociated! Shutting down.
16/10/01 19:57:11 ERROR executor.CoarseGrainedExecutorBackend: Driver 172.31.58.76:42167 disassociated! Shutting down.
16/10/01 19:57:56 ERROR executor.CoarseGrainedExecutorBackend: Driver 172.31.58.76:37973 disassociated! Shutting down.
log4j:ERROR Could not read configuration file from URL [file:/etc/spark/conf/log4j.properties].
log4j:ERROR Ignoring configuration file [file:/etc/spark/conf/log4j.properties].
16/10/01 19:57:11 ERROR ApplicationMaster: RECEIVED SIGNAL 15: SIGTERM
16/10/01 19:57:11 ERROR ApplicationMaster: User application exited with status 143
log4j:ERROR Could not read configuration file from URL [file:/etc/spark/conf/log4j.properties].
log4j:ERROR Ignoring configuration file [file:/etc/spark/conf/log4j.properties].
16/10/01 19:57:56 ERROR ApplicationMaster: RECEIVED SIGNAL 15: SIGTERM
16/10/01 19:57:56 ERROR ApplicationMaster: User application exited with status 143
16/10/01 19:57:11 ERROR executor.CoarseGrainedExecutorBackend: Driver 172.31.58.76:42167 disassociated! Shutting down.
16/10/01 19:57:56 ERROR executor.CoarseGrainedExecutorBackend: Driver 172.31.58.76:37973 disassociated! Shutting down.

код отлично работает примерно на 600 000 строк JSON-даже если есть тонна доступной памяти. Затем он продолжает терпеть неудачу.

любые мысли о том, что происходит и как отлаживать / исправить эту проблему?

2 ответов


Я считаю, что проблема исходит из следующего часть кода:

enhDataDf = (
    enhDataDf
    .repartition('column1', 'column2')
    .toPandas()
)

.toPandas() собирает данные, поэтому, когда количество записей растет, это приведет к ошибке водителя.

согласно вашему комментарию это точный трубопровод, который вы используете. Это означает, что целый этап не только устарел, но и некорректен. Когда данные собираются и далее распараллеливаются, гарантируется, что разбиение создается

.repartition('column1', 'column2')

будет сохранено когда вы re-create Spark DataFrame:

sqlContext.createDataFrame(enhDataDf)

если вы хотите записать данные по столбцу, вы можете сделать это напрямую:

(sqlContext
    .read.json(sys.argv[1])
    .repartition('column1', 'column2')
    .write
    .json(sys.argv[2]))

пропуск промежуточных toPandas и преобразование в RDD.

после вашего комментария:

если toPandas служит цели, то он всегда будет оставаться ограничивающим фактором в конвейере, и единственным прямым решением является масштабирование узла драйвера. В зависимости от точных алгоритмов, которые вы применяете к собранным данным, Вы можете рассмотреть альтернативу опции:

  • переопределение алгоритмов, которые вы используете поверх Spark it, уже недоступны.
  • рассмотрим альтернативную структуру с лучшей совместимостью стека SciPy (например,ДАСК).

Это напоминает мне о шахте Spark-контейнер вышел с ненулевым кодом выхода 143, где я работал в PySpark в кластер режим, который указывает на проблему памяти с вашим приложением.

сначала попробуйте определить, какие машины терпят неудачу, драйвер или исполнитель(Ы), и, таким образом, быть в состоянии нацелить ваши шаги лучше - из того, что я читал, это должны быть исполнители.


Я вижу, что вы уже установили memoryOverhead конфигурация, хорошо. Теперь давайте сосредоточимся на memory конфигурация:

...запуск Python с Spark (PySPark), поэтому весь мой код запускается из кучи. По этой причине я должен выделить" не много " памяти (так как это сократит память, которую мне разрешено использовать из общей памяти; т. е. если общая память, которую мне разрешено использовать, составляет 20G, и я запрашиваю 12G, то 8G будет оставлено для моего приложения Python.

поэтому попробуйте уменьшить этот атрибут, да уменьшить его!


следующая цель: #ядер!

уменьшите это тоже, например, если вы используете 8, а затем используйте 4 в исполнителях и / или драйвере:

spark.executor.cores                        4
spark.driver.cores                          4