通过与 EMR

问题描述

我正在尝试使用 EMR 6.1.0 向 livy session 发布声明。但我无法导入我正在尝试执行的类(到我的自定义 jar)。

声明我正在尝试发布到 livy 会话 -

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

Compactor 类存在于 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 时,上面的代码工作正常。

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

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

我已经查看了 spark 的工作目录,jar 是存在的。

我已经发布了这个 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]).invoke(null,Array(\"input 1\",\"input 2\",\"input 3\"))"
}