使用EMR通过livy会话执行语句时出现导入错误



我正在尝试使用EMR 6.1.0将语句发布到livy会话。但是我无法导入我试图执行的类(到我的自定义jar(。

声明我正试图张贴到一个愤怒的会议-

import com.path.to.Compactor 
Compactor.compact(x, y, z) 

small-file-compactor-lib-1.0-SNAPSHOT-all.jar中存在Compactor

这是我得到的错误-

<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时,上面的代码运行良好。

在创建会话时,我尝试在livy REST API中传递这个jar injars参数,应用程序日志也表明它已被拾取并上传到hdfs。

最初,我将jar保存在S3中,并在api中传递S3链接。然后,我试着放入hdfs,然后甚至试着将jar放在/usr/lib/livy/repl_2.12-jars/目录中,以便它与其他jar一起上传。但这也没有解决import问题。

我已经查看了spark的工作目录,罐子就在那里。

我已经发布了这个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不能导入类?

看起来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"))"
}

相关内容

  • 没有找到相关文章

最新更新