Как отправить задания PySpark и Python в Livy

#apache-spark #pyspark #livy

#apache-spark #pyspark #livy

Вопрос:

Я пытаюсь отправить задание PySpark в Livy, используя конечную точку / batches, но я не нашел никакой хорошей документации. Жизнь была легкой, потому что мы отправляем JAR-файлы, скомпилированные на Scala, в Livy и указываем задание с помощью className.

Для файла JAR мы используем:

 data={
    'file': 's3://foo-bucket/bar.jar',
    'className': 'com.foo.bar',
    'jars': [
        's3://foo-bucket/common.jar',
    ],
    'args': [
        bucket_name,
        'https://foo.bar.com',
        "oof",
        spark_master
    ],
    'name': 'foo-oof bar',
    'driverMemory': '2g',
    'executorMemory': '2g',
    'driverCores': 1,
    'executorCores': 3,
    'conf': {
        'spark.driver.memoryOverhead': '600',
        'spark.executor.memoryOverhead': '600',
        'spark.submit.deployMode': 'cluster'
}
  

Я не уверен, как отправить задание PySpark аналогичным образом, где в пакете также есть некоторые относительные импорта…есть мысли?

Для справки структура папок приведена ниже:

  • bar2

    • __init__.py
    • foo2.py
    • bar3
      • __init__.py
      • foo3.py

Я хотел бы затем запустить:

 from foo2 import ClassFoo
class_foo = ClassFoo(arg1, arg2)
class_foo.auto_run()
  

Комментарии:

1. Никто не ответил? Я также пытаюсь выяснить, как отправлять задания pyspark с зависимостями python через Livy.

Ответ №1:

Вы можете попробовать передавать pyFiles

 data={
'file': 's3://foo-bucket/bar.jar',
'className': 'com.foo.bar',
'jars': [
    's3://foo-bucket/common.jar',
],
"pyFiles": ["s3://<busket>/<folder>/foo2.py", "s3://<busket>/<folder>/foo3.py”]
'args': [
    bucket_name,
    'https://foo.bar.com',
    "oof",
    spark_master
],
'name': 'foo-oof bar',
'driverMemory': '2g',
'executorMemory': '2g',
'driverCores': 1,
'executorCores': 3,
'conf': {
    'spark.driver.memoryOverhead': '600',
    'spark.executor.memoryOverhead': '600',
    'spark.submit.deployMode': 'cluster'
  

}

В приведенном выше примере

 "pyFiles": ["s3://<busket>/<folder>/foo2.py", "s3://<busket>/<folder>/foo3.py”]
  

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

Также вы можете передавать файлы в формате .zip, хотя я этого не пробовал

Ответ №2:

Вам нужно отправить, file будучи основным исполняемым файлом Python и pyFiles являясь дополнительными внутренними библиотеками, которые используются. Мой совет состоял бы в том, чтобы предоставить серверу действие bootstrap, которое копирует ваши собственные библиотеки и устанавливает библиотеки, устанавливаемые с помощью pip, на master и узлах.