如何将PySpark和Python作业提交给Livy

时间:2019-04-02 21:08:32

标签: apache-spark pyspark livy

我正在尝试使用/ batches端点向Livy提交PySpark作业,但是我没有找到任何好的文档。生活很轻松,因为我们正在将Scala编译的JAR文件提交给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()

2 个答案:

答案 0 :(得分: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格式传递,尽管我还没有尝试过

答案 1 :(得分:0)

您需要提交file是主要的Python可执行文件,而pyFiles是正在使用的其他内部库。我的建议是为服务器提供引导操作,该操作将复制您自己的库,并在主服务器和节点上安装pip可安装的库。