2015-11-01 7 views
8

Let एक छोटे से json फ़ाइल हो config.json:स्पार्क दुर्घटना जबकि json फ़ाइल पढ़ने जब एडब्ल्यूएस-जावा-sdk के साथ जुड़ा हुआ

{ 
    "toto": 1 
} 

मैं (क्योंकि फ़ाइल हो सकता है एक सरल कोड है कि sc.textFile साथ json फ़ाइल को पढ़ने बनाया एस 3, स्थानीय या HDFS पर है, तो textfile सुविधाजनक है)

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")) 
    } 
} 

एसबीटी फ़ाइल पुल केवल spark-core पुस्तकालय

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

प्रोग्राम अपेक्षाकृत काम करता है, मानक आउटपुट पर config.json की सामग्री लिख रहा है।

अब मैं एस 3 तक पहुंचने के लिए अमेज़-जावा-एसडीके, अमेज़ॅन के एसडीके के साथ भी लिंक करना चाहता हूं।

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

उसी कोड को निष्पादित करते हुए स्पार्क निम्नलिखित अपवाद को फेंकता है।

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) 

ढेर पढ़ना, ऐसा लगता है जब एडब्ल्यूएस-जावा-sdk जुड़ा हुआ है, sc.textFile पता लगाता है कि फ़ाइल एक json फ़ाइल है और जैक्सन एक निश्चित प्रारूप है, जो यह निश्चित रूप से नहीं मिल सकता है यह सोचते हैं के साथ यह पार्स करने के लिए कोशिश है कि । मुझे aws-java-sdk से लिंक करने की आवश्यकता है, इसलिए मेरे प्रश्न हैं:

1- aws-java-sdk क्यों जोड़ना spark-core के व्यवहार को संशोधित करता है?

2- क्या कोई काम है (फ़ाइल एचडीएफएस, एस 3 या स्थानीय पर हो सकती है)?

+0

ऐसा इसलिए है क्योंकि aws-java-sdk जैक्सन लाइब्रेरी का नवीनतम संस्करण 2.5.3 का उपयोग कर रहा है और स्पार्क पुराने 2.4.4 का उपयोग कर रहा है। मुझे एक ही समस्या का सामना करना पड़ रहा है लेकिन इसे हल नहीं कर सका। अगर आपको समाधान मिल गया है तो कृपया इसे साझा करें। धन्यवाद –

+0

हाय हाफिज ... बहुत परेशान नहीं है? मैं मामले को एडब्ल्यूएस भेजता हूं। उन्होंने पुष्टि की कि यह एक संगतता मुद्दा है। उन्होंने मुझे स्पष्ट समाधान नहीं बताया है। इसे एप को सॉर्ट करने का प्रयास करेंगे। – Boris

+1

हाय बोरिस! हां यह इस मुद्दे का सामना करने के लिए परेशान है, लेकिन मैंने स्पार्क-कोर से जैक्सन कोर और जैक्सन मॉड्यूल पुस्तकालयों को छोड़कर इसे हल किया है और जैक्सन कोर नवीनतम लाइब्रेरी निर्भरता –

उत्तर

10

अमेज़ॅन समर्थन से बात की। यह जैक्सन पुस्तकालय के साथ एक depency मुद्दा है। एसबीटी में, जैक्सन को ओवरराइड:

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" 
) 

उनके जवाब: हम पर एक मैक, EC2 (redhat AMI) उदाहरण और ईएमआर (अमेज़न लिनक्स) पर यह किया है। 3 विभिन्न वातावरण। इस मुद्दे का मूल कारण यह है कि एसबीटी एक निर्भरता ग्राफ बनाता है और फिर पुराने संस्करण को बेदखल करके और निर्भर पुस्तकालय का नवीनतम संस्करण चुनकर संस्करण विवादों के मुद्दे से संबंधित है। इस मामले में, स्पार्क जैक्सन लाइब्रेरी के 2.4 संस्करण पर निर्भर करता है जबकि एडब्ल्यूएस एसडीके को 2.5 की आवश्यकता होती है। तो एक संस्करण संघर्ष है और एसबीटी स्पार्क के निर्भरता संस्करण (जो पुराना है) का खुलासा करता है और एडब्ल्यूएस एसडीके संस्करण (जो नवीनतम है) चुनता है।

1

Boris' answer को जोड़ना, आप जैक्सन (शायद भविष्य में आप स्पार्क को अपग्रेड करेगा) की एक निश्चित संस्करण का उपयोग नहीं करना चाहते हैं, तो, लेकिन अभी भी एडब्ल्यूएस से एक अभी नहीं करना चाहते, तो आप निम्न कर सकते हैं:

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" 
) 
संबंधित मुद्दे