2015-11-01 1 views
8

config.jsonが小さいJSONファイルとしよう:スパーククラッシュAWS-javaの-SDKとリンクしたときにJSONファイルを読みながら

{ 
    "toto": 1 
} 

私は、ファイルができるためsc.textFileとJSONファイルを(読み取り、簡単なコードを作りましたS3、ローカルまたはHDFS上、テキストファイル)が便利ですので

import org.apache.spark.{SparkContext, SparkConf} 

object testAwsSdk { 
    def main(args:Array[String]):Unit = { 
    val sparkConf = new SparkConf().setAppName("test-aws-sdk").setMaster("local[*]") 
    val sc = new SparkContext(sparkConf) 
    val json = sc.textFile("config.json") 
    println(json.collect().mkString("\n")) 
    } 
} 

SBTファイルプルのみspark-coreライブラリ

libraryDependencies ++= Seq(
    "org.apache.spark" %% "spark-core" % "1.5.1" % "compile" 
) 

プログラムは正常に動作し、config.jsonの内容を標準出力に書き出します。

今私はaws-java-sdk、amazonのsdkとリンクしてS3にアクセスしたいと考えています。

libraryDependencies ++= Seq(
    "com.amazonaws" % "aws-java-sdk" % "1.10.30" % "compile", 
    "org.apache.spark" %% "spark-core" % "1.5.1" % "compile" 
) 

同じコードを実行すると、sparkは次の例外をスローします。

スタックを読む
Exception in thread "main" com.fasterxml.jackson.databind.JsonMappingException: Could not find creator property with name 'id' (in class org.apache.spark.rdd.RDDOperationScope) 
at [Source: {"id":"0","name":"textFile"}; line: 1, column: 1] 
    at com.fasterxml.jackson.databind.JsonMappingException.from(JsonMappingException.java:148) 
    at com.fasterxml.jackson.databind.DeserializationContext.mappingException(DeserializationContext.java:843) 
    at com.fasterxml.jackson.databind.deser.BeanDeserializerFactory.addBeanProps(BeanDeserializerFactory.java:533) 
    at com.fasterxml.jackson.databind.deser.BeanDeserializerFactory.buildBeanDeserializer(BeanDeserializerFactory.java:220) 
    at com.fasterxml.jackson.databind.deser.BeanDeserializerFactory.createBeanDeserializer(BeanDeserializerFactory.java:143) 
    at com.fasterxml.jackson.databind.deser.DeserializerCache._createDeserializer2(DeserializerCache.java:409) 
    at com.fasterxml.jackson.databind.deser.DeserializerCache._createDeserializer(DeserializerCache.java:358) 
    at com.fasterxml.jackson.databind.deser.DeserializerCache._createAndCache2(DeserializerCache.java:265) 
    at com.fasterxml.jackson.databind.deser.DeserializerCache._createAndCacheValueDeserializer(DeserializerCache.java:245) 
    at com.fasterxml.jackson.databind.deser.DeserializerCache.findValueDeserializer(DeserializerCache.java:143) 
    at com.fasterxml.jackson.databind.DeserializationContext.findRootValueDeserializer(DeserializationContext.java:439) 
    at com.fasterxml.jackson.databind.ObjectMapper._findRootDeserializer(ObjectMapper.java:3666) 
    at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:3558) 
    at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:2578) 
    at org.apache.spark.rdd.RDDOperationScope$.fromJson(RDDOperationScope.scala:82) 
    at org.apache.spark.rdd.RDDOperationScope$$anonfun$5.apply(RDDOperationScope.scala:133) 
    at org.apache.spark.rdd.RDDOperationScope$$anonfun$5.apply(RDDOperationScope.scala:133) 
    at scala.Option.map(Option.scala:145) 
    at org.apache.spark.rdd.RDDOperationScope$.withScope(RDDOperationScope.scala:133) 
    at org.apache.spark.rdd.RDDOperationScope$.withScope(RDDOperationScope.scala:108) 
    at org.apache.spark.SparkContext.withScope(SparkContext.scala:709) 
    at org.apache.spark.SparkContext.hadoopFile(SparkContext.scala:1012) 
    at org.apache.spark.SparkContext$$anonfun$textFile$1.apply(SparkContext.scala:827) 
    at org.apache.spark.SparkContext$$anonfun$textFile$1.apply(SparkContext.scala:825) 
    at org.apache.spark.rdd.RDDOperationScope$.withScope(RDDOperationScope.scala:147) 
    at org.apache.spark.rdd.RDDOperationScope$.withScope(RDDOperationScope.scala:108) 
    at org.apache.spark.SparkContext.withScope(SparkContext.scala:709) 
    at org.apache.spark.SparkContext.textFile(SparkContext.scala:825) 
    at testAwsSdk$.main(testAwsSdk.scala:11) 
    at testAwsSdk.main(testAwsSdk.scala) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:497) 
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:140) 

、AWS-javaの-SDKがリンクされているとき、sc.textFileファイルはJSONファイルであることを検出しているようですし、ジャクソンは、特定の形式を想定して、それを解析しようとすると、それは当然のことながら見つけることができません。私はaws-java-sdkとリンクする必要があるので、私の質問は

です。なぜ、aws-java-sdkを追加すると、spark-coreの動作が変更されるのですか?

2回避策はありますか(ファイルはHDFS、S3またはローカルにある可能性があります)?

+0

これは、aws-java-sdkが最新のバージョン2.5.3のjacksonライブラリを使用しており、sparkが古い2.4.4を使用しているためです。私は同じ問題に直面していますが、解決できませんでした。解決策を見つけた場合は、それを共有してください。おかげで –

+0

こんにちはハフィズ...かなりanoyingではないですか?私はその事件をAWSに送付します。彼らは互換性の問題であることを確認しました。彼らは私に明確な解決策を教えていない。できるだけ早くそれを整理しようとします。 – Boris

+1

こんにちはBoris!はい、これはこの問題に直面するのは面倒ですが、私はspark-coreからjackson coreとjacksonモジュールライブラリを除外し、jackson core最新のライブラリ依存関係を追加することで解決しました –

答えて

10

Amazonのサポートに話しました。それはジャクソンの図書館の問題点です。 SBTでは、ジャクソンを上書き:

libraryDependencies ++= Seq( 
"com.amazonaws" % "aws-java-sdk" % "1.10.30" % "compile", 
"org.apache.spark" %% "spark-core" % "1.5.1" % "compile" 
) 

dependencyOverrides ++= Set( 
"com.fasterxml.jackson.core" % "jackson-databind" % "2.4.4" 
) 

その答:私たちは、Mac、Ec2と(AMIをRedHatの)インスタンス上およびEMR(アマゾンのLinux)上でこれを行っている 。 3異なる環境。この問題の根本的な原因は、sbtが依存関係グラフを作成し、古いバージョンを削除し、依存ライブラリの最新バージョンを選択することによって、バージョンの競合の問題を処理することです。この場合、スパークは2.4バージョンのjacksonライブラリに依存し、AWS SDKは2.5バージョンが必要です。したがって、バージョンの競合があり、sbtはsparkの依存バージョン(古いバージョン)を取り除き、AWS SDKバージョン(最新)を選択します。

1

あなたはジャクソン(多分将来的にあなたがスパークアップグレードされます)の修正版を使用したくない場合は、Boris' answerに追加するが、それでもAWSから1を破棄したい、次の操作を実行できます。

libraryDependencies ++= Seq( 
    "com.amazonaws" % "aws-java-sdk" % "1.10.30" % "compile" excludeAll (
    ExclusionRule("com.fasterxml.jackson.core", "jackson-databind") 
), 
    "org.apache.spark" %% "spark-core" % "1.5.1" % "compile" 
) 
関連する問題