【问题标题】:Apache Livy cURL not working for spark-submit commandApache Livy cURL 不适用于 spark-submit 命令
【发布时间】:2018-06-21 13:05:56
【问题描述】:

我最近开始使用 Spark Scala、HDFS、sbt 和 Livy。目前我试图创建 livy 批次。

Warning: Skip remote jar hdfs://localhost:9001/jar/project.jar.
java.lang.ClassNotFoundException: SimpleApp
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:348)
at org.apache.spark.util.Utils$.classForName(Utils.scala:225)
at org.apache.spark.deploy.SparkSubmit$.org$apache$spark$deploy$SparkSubmit$$runMain(SparkSubmit.scala:686)
at org.apache.spark.deploy.SparkSubmit$.doRunMain$1(SparkSubmit.scala:185)
at org.apache.spark.deploy.SparkSubmit$.submit(SparkSubmit.scala:210)
at org.apache.spark.deploy.SparkSubmit$.main(SparkSubmit.scala:124)
at org.apache.spark.deploy.SparkSubmit.main(SparkSubmit.scala)

这是错误语句,显示在 livy 批处理日志中。

我的 spark-submit 命令对本地 .jar 文件运行良好。

spark-submit --class "SimpleApp" --master local target/scala-2.11/simple-project_2.11-1.0.jar

但对于 livy(在 cURL 中)也是一样的,它会抛出错误。

"requirement failed: Local path /target/scala-2.11/simple-project_2.11-1.0.jar cannot be added to user sessions."

所以,我将 .jar 文件转移到 hdfs 中。我的 livy 新代码是 -

curl -X POST --data '{
    "file": "/jar/project.jar",
    "className": "SimpleApp",
    "args": ["ddd"]
}'  
-H 
"Content-Type: application/json" 
http://server:8998/batches

这是上面提到的抛出错误。

请告诉我,我哪里错了?

提前致谢!

【问题讨论】:

    标签: scala apache-spark curl hdfs livy


    【解决方案1】:
    hdfs://localhost:9001/jar/project.jar.
    

    它期待您的 jar 文件位于 hdfs

    如果是本地的,也许你应该尝试在路径中指定协议,或者只是将其上传到 hdfs:

     "file": "file:///absolute_path/jar/project.jar",
    

    【讨论】:

    • 好的,ClassNotFoundException 的解决方案是什么?
    • 找不到包含该类的 Jar,只要您提供正确的类路径,问题就应该得到解决。
    • 在 jar 文件类位于 spark/wordcount 文件夹中,我尝试将 spark.wordcount.SimpleApp 作为类名,但仍然抛出 ClassNotFoundException
    • 您解决了 jar 文件路径的问题吗?错误信息是一样的吗?
    • 我已经在hdfs中上传了jar文件,但错误还是一样。
    【解决方案2】:

    您必须使用您的代码库 + 必要的 jar - sbt assembly 制作一个 fat jar 文件,或者使用 maven plugin,将此 jar 文件上传到 HDFS 并使用放置在 HDFS 上的此 jar 文件运行 spark-submit或者你也可以使用cURL

    Scala/Java 的步骤:

    1. 使用 SBT/Maven 或其他工具制作胖罐子。
    2. 上传胖罐到HDFS
    3. 使用cURL 提交作业:

    curl -X POST --data '{ //your data should be here}' -H "Content-Type: plication/json" your_ip:8998/batches

    如果你不想制作fat jar文件并上传到HDFS,你可以考虑python脚本,它可以像纯文本一样提交,没有任何jar文件。

    纯python代码示例:

    curl your_ip:8998/sessions/0/statements -X POST -H 'Content-Type: application/json' -d '{"code":"print(\"asdf\")"}'

    在数据正文中,您必须发送有效的 Python 代码。 这是Jupyter Notebook/Torch 等工具的工作方式。

    另外,我用 Livy 和 Python 又制作了一个 example。 检查结果:

    curl your_ip:8998/sessions/0/statements/1

    正如我上面提到的,对于 Scala/Java fat jar 和上传到 HDFS 是必需的。

    【讨论】:

    • 我已经按照您的说明创建了 fat jar 并上传到 HDFS 但问题陈述仍然相同,jar 文件仍然适用于本地路径,即 "spark-submit --class "SimpleApp" --master local myProject/target/scala-2.11/SimpleProject-assembly-1.0.jar" 但不适用于 HDFS 路径,即 "spark-submit --class "SimpleApp" --master local hdfs://localhost:9001/jar/SimpleProject -assembly-1.0.jar"
    • @Divine 你为 HDFS 的路径指定了local - 这是错误的。
    【解决方案3】:

    要将本地文件用于livy 批处理作业,您需要将本地文件夹添加到livy.conf 中的livy.file.local-dir-whitelist 属性。

    来自livy.conf.template的描述:

    允许将文件添加到用户会话的本地目录列表。默认情况下它是空的,这意味着用户只能在开始他们的会话时引用远程 URI。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-10-06
      • 2023-03-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多