1

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

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

请告诉我,我哪里错了?

提前致谢!

4

3 回答 3

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

它期待您的 jar 文件位于hdfs上。

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

 "file": "file:///absolute_path/jar/project.jar",
于 2018-06-21T13:14:04.833 回答
0

要将本地文件用于livy批处理作业,您需要将本地文件夹添加livy.file.local-dir-whitelistlivy.conf.

说明来自livy.conf.template

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

于 2018-08-13T20:46:18.130 回答
0

您必须fat jar使用您的代码库 + 必要的 jar 创建一个文件 -sbt assembly或使用maven 插件,将此 jar 文件上传到该 jar 文件HDFS并使用该 jar 文件运行spark-submit,该 jar 文件放置在 HDFS 上,或者您也可以使用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

如果您不想制作一个胖 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做了一个例子。检查结果:

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

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

于 2018-06-26T10:01:31.153 回答