在EMR中运行spark作业时出现IllegalAccessError

时间:2017-04-05 17:24:41

标签: scala amazon-web-services apache-spark amazon-emr elastic-map-reduce

我正在尝试运行访问dynamodb的spark作业,并且不推荐使用旧的实例化dynamoDb客户端的方法,现在建议使用客户端构建器。

嗯,这在本地工作正常,但是当我部署到EMR时,我收到了这个错误:

  

线程“main”中的异常java.lang.IllegalAccessError:尝试从类com.amazonaws.services.dynamodbv2.AmazonDynamoDBAsyncClientBuilder访问类com.amazonaws.services.dynamodbv2.AmazonDynamoDBClientConfigurationFactory

导致此问题的代码是:

libraryDependencies += "com.amazonaws" % "aws-java-sdk" % "1.11.114"

我的build.sbt包含:

         function destroyer(arr) {
         // Remove all the value;
         return arr;

        }

        destroyer([1, 2, 3, 1, 2, 3], 2, 3);

和我的spark-submit命令如下所示:

  

spark-submit --conf spark.eventLog.enabled = false --packages com.typesafe.play:play-json_2.11:2.5.9,com.github.traviscrawford:spark-dynamodb:0.0.6,com .amazonaws:aws-java-sdk:1.11.114 --master yarn --deploy-mode cluster --class main application.jar

有没有人有任何想法?我忽略了一些基本的东西吗?

更新

我注意到EMR正在运行OpenJDK 1.8,而我的本地系统正在运行Oracle Java 1.8。我更改了EMR集群以匹配我正在运行的java,但仍然没有变化。

1 个答案:

答案 0 :(得分:1)

我在这里没有完美的答案,但我正在努力解决类似的问题,在EMR上运行胖胖的jar构建Spark驱动程序。所以我放弃了我最近的巡演。

  1. 尝试使用选项-v运行spark-submit并查看有关类路径的日志,依此类推。我可以看到EMR也在加载aws-java-sdk。我不清楚哪个版本的aws-java-sdk EMR正在运行? EMR版本4.7.0声明“将AWS SDK for Java升级到1.10.75”(http://docs.aws.amazon.com/emr/latest/ReleaseGuide/emr-whatsnew.html)。
  2. 然后添加另一个参数--conf spark.driver.userClassPathFirst=true 加载驱动程序指定的aws-java-sdk版本。
  3. 不幸的是,最后一步引发了纱线错误,例如:Unable to load YARN support ...(对此进行了一些讨论:https://community.cloudera.com/t5/Advanced-Analytics-Apache-Spark/spark-submit-fails-after-setting-userClassPathFirst-to-true/td-p/46778

    来自aws-java-sdk github repos的一些讨论:https://github.com/aws/aws-sdk-java/issues/1094

    结论:现在使用aws-java-sdk版本1.10.75的apis