Apache Livy cURL不适用于spark-submit命令

时间:2018-06-21 13:05:56

标签: scala apache-spark curl hdfs livy

我最近开始使用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

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

请让我知道,我哪里错了?

谢谢!

3 个答案:

答案 0 :(得分:0)

hdfs://localhost:9001/jar/project.jar.

期望您的jar文件位于 hdfs 上。

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

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

答案 1 :(得分:0)

您必须使用代码库+必要的jar-fat jar来制作sbt assembly文件,或使用maven plugin,将此jar文件上传到HDFS并运行{{1} },并将其放在HDFS上,也可以使用spark-submit

使用cURL的步骤:

  1. 用SBT / Maven或其他东西制成胖子。
  2. 将胖子罐上传到Scala/Java
  3. 使用HDFS提交作业:

cURL

如果您不想制作一个胖jar文件并将其上传到HDFS,可以考虑使用python脚本,它可以像纯文本一样提交而无需任何jar文件。

带有简单python代码的示例:

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

在数据主体中,您必须发送有效的Python代码。 这是curl your_ip:8998/sessions/0/statements -X POST -H 'Content-Type: application/json' -d '{"code":"print(\"asdf\")"}'之类的工具的工作方式。

我还用Livy和Python制作了example。 检查结果:

Jupyter Notebook/Torch

如上所述,对于Scala / Java胖子,需要上传到HDFS。

答案 2 :(得分:0)

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

来自livy.conf.template的描述:

  

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