Size: a a a

2020 May 20

R

Renarde in Moscow Spark
Aleksandr Nikolaev
Всем привет. такой вопрос.
Есть несколько спарк джоб, которые работают параллельно и append пишут в одну и ту же табличку командой.

df.repartition(200, partitioned_by)
.write.format('orc').partitionBy(partitioned_by).mode('append').saveAsTable(адрес таблицы)


Каждая джоба пишет непересекающиеся партиции. эти партиции в большой таблице изначально отсутствуют

Обычно джоба которая завершает последней летит с ошибкой
j```ava.io.FileNotFoundException: File hdfs://bigdata/apps/hive/warehouse/011_001_0001.db/previous_changes_1/_temporary/0/task_20200520153305_0039_m_000077 does not exist.
```hive, spark 2.3
если я правильно помню как спарк работает при записи в hive табличку на hdfs, то промежуточные записи пишутся в папки:
<db-name>/<table-name>/_temporary/<idx>/<task-unique-number>
Проблема в том, что после записи последней партиции, таск который ее пишет зачищает _temporary директорию, удаляя файлы и из соседнего таска
источник

R

Renarde in Moscow Spark
но это только предположение, я не ручаюсь что именно это root cause
источник

AN

Aleksandr Nikolaev in Moscow Spark
Да, у меня такое же предположение было. Как его решать?
источник

AN

Aleksandr Nikolaev in Moscow Spark
Есть ещё такая ссылка на джиру спарка, может кого на мысль натолкнёт


https://issues.apache.org/jira/browse/SPARK-28945
источник

R

Renarde in Moscow Spark
<реклама mode=on> а вы используйте как файловый формат delta - там есть и параллельные инзерты, и update и delete - delta.io <реклама mode=off>
источник

RI

Rudnev Il’ya in Moscow Spark
А если писать в директорию и делать альтер тейбл?
источник

R

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

AA

Anton Alekseev in Moscow Spark
Подкиньте плиз доку как pandas udf работает в спарке. Откуда экзекьютор берет код для исполнения питон части внутри декоратора pandas_udf?
источник

PK

Pavel Klemenkov in Moscow Spark
Anton Alekseev
Подкиньте плиз доку как pandas udf работает в спарке. Откуда экзекьютор берет код для исполнения питон части внутри декоратора pandas_udf?
С драйвера вестимо
источник

AA

Anton Alekseev in Moscow Spark
Pavel Klemenkov
С драйвера вестимо
Это когда контекст разливает код аппликейшена, прямо из кода, или приходит с драйвера в виде таски?
источник

AA

Anton Alekseev in Moscow Spark
есть условный код внутри pudf, этот код идет из пайскрипта на экзекьюторе, а задача на это от драйвера, или и задача и код с драйвера?
источник

AA

Anton Alekseev in Moscow Spark
Просто если все идёт с драйвера, то зачем модули проекта подключать через py-files и сам main.py который запускаем, и делать доступным модуль для импорта на всех воркерах, кроме сабмита в режиме кластера.
источник

AS

Andrey Siunov in Moscow Spark
AFAIK, код, который содержит UDF (spark, не знаю что здесь меняет именно pandas), надо доставлять с помощью sparkContext.addFile(...), если этих файлов уже нет у исполнителей
источник

AS

Andrey Siunov in Moscow Spark
ну то есть сама задача, которая идет с драйвера, не содержит кода для исполнения
источник

ЕГ

Евгений Глотов... in Moscow Spark
А там не пиклится разве всё?
источник

AA

Anton Alekseev in Moscow Spark
Andrey Siunov
AFAIK, код, который содержит UDF (spark, не знаю что здесь меняет именно pandas), надо доставлять с помощью sparkContext.addFile(...), если этих файлов уже нет у исполнителей
я думал что обычный юдф довольно просто интерпретируется в код для исполнения, и там без питона все происходит, а с пандасом только через питон расчитывать.
источник

AA

Anton Alekseev in Moscow Spark
Не знал что и обычный юдф надо подключать, поэтому хочу доку которая это описывает, глянуть.
источник

ЕГ

Евгений Глотов... in Moscow Spark
Anton Alekseev
я думал что обычный юдф довольно просто интерпретируется в код для исполнения, и там без питона все происходит, а с пандасом только через питон расчитывать.
Идёт с драйвера только сама функция, то, что в ней внутри используется, нужно тащить на ноды отдельно
источник

ЕГ

Евгений Глотов... in Moscow Spark
Через виртуалэнв, через пайфайлс или как удобно
источник

ЕГ

Евгений Глотов... in Moscow Spark
Объекты, которые были на драйвере, можно использовать, значит они тоже пиклятся, но вот импортированные модули нет
источник