通过使用 EMR 的 livy 会话执行语句时出现导入错误
Getting import error while executing statements via livy sessions with EMR
我正在尝试 post 声明以使用 EMR 6.1.0 来实现 session。但是我无法导入我正在尝试执行的 class(到我的自定义 jar)。
我正在尝试 post 的声明 session -
import com.path.to.Compactor
Compactor.compact(x, y, z)
Compactor
class 出现在 small-file-compactor-lib-1.0-SNAPSHOT-all.jar
这是我遇到的错误 -
<console>:23: error: object path is not a member of package com
import com.path.to.Compactor
当我尝试使用 spark-shell --jars small-file-compactor-lib-1.0-SNAPSHOT-all.jar
时,上面的代码工作正常。
我在创建 session 时尝试在 livy REST API 的 jars
参数中传递这个 jar 并且应用程序日志还表明它被拾取并上传到 hdfs .
最初我将 jar 保存在 S3 中并在 api 中传递 s3 link。然后,我尝试放入 hdfs,然后甚至尝试将 jar 放在 /usr/lib/livy/repl_2.12-jars/
目录中,以便它与其他 jar 一起上传。但这也没有解决 import
问题。
我查看了 spark 的工作目录,jar 存在。
我已经 post编辑了这个 println(sc.jars)
声明并且我得到了这个
ArrayBuffer(file:/usr/lib/livy/rsc-jars/livy-api-0.7.0-incubating.jar, file:/usr/lib/livy/rsc-jars/livy-rsc-0.7.0-incubating.jar, file:/usr/lib/livy/rsc-jars/livy-thriftserver-session-0.7.0-incubating.jar, file:/usr/lib/livy/rsc-jars/netty-all-4.1.17.Final.jar, hdfs:///user/livy/small-file-compactor-lib-1.0-SNAPSHOT-all.jar, file:/usr/lib/livy/repl_2.12-jars/commons-codec-1.9.jar, file:/usr/lib/livy/repl_2.12-jars/livy-core_2.12-0.7.0-incubating.jar, file:/usr/lib/livy/repl_2.12-jars/livy-repl_2.12-0.7.0-incubating.jar, file:/usr/lib/livy/repl_2.12-jars/small-file-compactor-lib-1.0-SNAPSHOT-all.jar)
我的罐子在这里^
但为什么 spark 无法导入 class?
看来 EMR 6.1.0 的 livy 版本存在错误,它确实将应用程序 类 加载到 JVM。
有解决此问题的方法。你可以使用反射。
{
"kind": "spark",
"code": "Thread.currentThread.getContextClassLoader.loadClass(\"com.path.to.Compactor\").getMethod(\"compact\", classOf[String], classOf[String], classOf[String]).invoke(null, Array(\"input 1\", \"input 2\", \"input 3\"))"
}
我正在尝试 post 声明以使用 EMR 6.1.0 来实现 session。但是我无法导入我正在尝试执行的 class(到我的自定义 jar)。
我正在尝试 post 的声明 session -
import com.path.to.Compactor
Compactor.compact(x, y, z)
Compactor
class 出现在 small-file-compactor-lib-1.0-SNAPSHOT-all.jar
这是我遇到的错误 -
<console>:23: error: object path is not a member of package com
import com.path.to.Compactor
当我尝试使用 spark-shell --jars small-file-compactor-lib-1.0-SNAPSHOT-all.jar
时,上面的代码工作正常。
我在创建 session 时尝试在 livy REST API 的 jars
参数中传递这个 jar 并且应用程序日志还表明它被拾取并上传到 hdfs .
最初我将 jar 保存在 S3 中并在 api 中传递 s3 link。然后,我尝试放入 hdfs,然后甚至尝试将 jar 放在 /usr/lib/livy/repl_2.12-jars/
目录中,以便它与其他 jar 一起上传。但这也没有解决 import
问题。
我查看了 spark 的工作目录,jar 存在。
我已经 post编辑了这个 println(sc.jars)
声明并且我得到了这个
ArrayBuffer(file:/usr/lib/livy/rsc-jars/livy-api-0.7.0-incubating.jar, file:/usr/lib/livy/rsc-jars/livy-rsc-0.7.0-incubating.jar, file:/usr/lib/livy/rsc-jars/livy-thriftserver-session-0.7.0-incubating.jar, file:/usr/lib/livy/rsc-jars/netty-all-4.1.17.Final.jar, hdfs:///user/livy/small-file-compactor-lib-1.0-SNAPSHOT-all.jar, file:/usr/lib/livy/repl_2.12-jars/commons-codec-1.9.jar, file:/usr/lib/livy/repl_2.12-jars/livy-core_2.12-0.7.0-incubating.jar, file:/usr/lib/livy/repl_2.12-jars/livy-repl_2.12-0.7.0-incubating.jar, file:/usr/lib/livy/repl_2.12-jars/small-file-compactor-lib-1.0-SNAPSHOT-all.jar)
我的罐子在这里^
但为什么 spark 无法导入 class?
看来 EMR 6.1.0 的 livy 版本存在错误,它确实将应用程序 类 加载到 JVM。
有解决此问题的方法。你可以使用反射。
{
"kind": "spark",
"code": "Thread.currentThread.getContextClassLoader.loadClass(\"com.path.to.Compactor\").getMethod(\"compact\", classOf[String], classOf[String], classOf[String]).invoke(null, Array(\"input 1\", \"input 2\", \"input 3\"))"
}