2017-01-19 6 views
0

Nach this article here, wenn ich eine aws emr Cluster erstellen, die Funken Rohrdaten verwenden, um DynamoDB, muss ich mit der Linie Vorwort:Wie kann ich Funken auf emr-5.2.1 auf Dynamodb schreiben?

spark-shell --jars /usr/share/aws/emr/ddb/lib/emr-ddb-hadoop.jar 

Diese Zeile erscheint in zahlreichen Referenzen, einschließlich from the amazon devs themselves. Allerdings, wenn ich create-cluster mit einer zusätzlichen --jars Flagge laufen, bekomme ich diesen Fehler:

Exception in thread "main" java.io.FileNotFoundException: File file:/usr/share/aws/emr/ddb/lib/emr-ddb-hadoop.jar does not exist 
at org.apache.hadoop.fs.RawLocalFileSystem.deprecatedGetFileStatus(RawLocalFileSystem.java:616) 
at org.apache.hadoop.fs.RawLocalFileSystem.getFileLinkStatusInternal(RawLocalFileSystem.java:829) 
at org.apache.hadoop.fs.RawLocalFileSystem.getFileStatus(RawLocalFileSystem.java:606) 
at org.apache.hadoop.fs.FilterFileSystem.getFileStatus(FilterFileSystem.java:431) 
at org.apache.hadoop.fs.FileUtil.copy(FileUtil.java:337) 
at org.apache.hadoop.fs.FileUtil.copy(FileUtil.java:289) 
... 

Es gibt eine Antwort auf this SO question, dass die Bibliothek sollte in emr-5.2.1 enthalten sein, so habe ich versucht, meinen Code ausgeführt wird, ohne dass Extra --jars Flagge:

ERROR ApplicationMaster: User class threw exception: java.lang.NoClassDefFoundError: org/apache/hadoop/dynamodb/DynamoDBItemWritable 
java.lang.NoClassDefFoundError: org/apache/hadoop/dynamodb/DynamoDBItemWritable 
at CopyS3ToDynamoApp$.main(CopyS3ToDynamo.scala:113) 
at CopyS3ToDynamoApp.main(CopyS3ToDynamo.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:498) 
at org.apache.spark.deploy.yarn.ApplicationMaster$$anon$2.run(ApplicationMaster.scala:627) 
Caused by: java.lang.ClassNotFoundException: org.apache.hadoop.dynamodb.DynamoDBItemWritable 
at java.net.URLClassLoader.findClass(URLClassLoader.java:381) 
at java.lang.ClassLoader.loadClass(ClassLoader.java:424) 
at java.lang.ClassLoader.loadClass(ClassLoader.java:357) 

Nur für grins, habe ich versucht, die Alternative zu dieser Frage, die die anderen Antwort Vorschlag in --driver-class-path,/usr/share/aws/emr/ddb/lib/emr-ddb-hadoop.jar, zu meinem Schritt hinzufügen und bekam gesagt:

Exception in thread "main" java.lang.RuntimeException: java.lang.ClassNotFoundException: Class org.apache.hadoop.fs.s3a.S3AFileSystem not found 
at org.apache.hadoop.conf.Configuration.getClass(Configuration.java:2195) 
at org.apache.hadoop.fs.FileSystem.getFileSystemClass(FileSystem.java:2702) 
at org.apache.hadoop.fs.FileSystem.createFileSystem(FileSystem.java:2715) 
at org.apache.hadoop.fs.FileSystem.access$200(FileSystem.java:93) 

Nicht in der Lage s3a.S3AFileSystem zu finden scheint wie ein großer, vor allem, da ich andere Jobs, die aus s3 lesen, gut, aber anscheinend von s3 lesen und Dynamo schreiben ist knifflig. Irgendeine Idee, wie man dieses Problem löst?

aktualisieren: dachte ich, dass s3 nicht gefunden wurde, weil ich den Classpath deshalb überwiegend sei und alle anderen Bibliotheken fallen, so dass ich Classpath aktualisiert wie folgt:

class_path = "/usr/lib/hadoop-lzo/lib/*:/usr/lib/hadoop/hadoop-aws.jar:" \ 
      "/usr/share/aws/aws-java-sdk/*:/usr/share/aws/emr/emrfs/conf:" \ 
      "/usr/share/aws/emr/emrfs/lib/*:/usr/share/aws/emr/emrfs/auxlib/*:" \ 
      "/usr/share/aws/emr/security/conf:/usr/share/aws/emr/security/lib/*:" \ 
      "/usr/share/aws/emr/ddb/lib/*" 

Und ich bekomme jetzt diesen Fehler :

diagnostics: User class threw exception: java.lang.NoClassDefFoundError: org/apache/hadoop/dynamodb/DynamoDBItemWritable 
ApplicationMaster host: 10.178.146.133 
ApplicationMaster RPC port: 0 
queue: default 
start time: 1484852731196 
final status: FAILED 
tracking URL: http://ip-10-178-146-68.syseng.tmcs:20888/proxy/application_1484852606881_0001/ 

Es sieht also so aus, als ob die Bibliothek sich nicht an der von der AWS-Dokumentation angegebenen Stelle befindet. Hat jemand das zur Arbeit gebracht?

Antwort

1

OK, das herauszufinden, hat mich Tage gekostet, also werde ich denjenigen verschonen, der als nächstes kommt, um diese Frage zu stellen.

Der Grund dafür, dass diese Methoden fehlschlagen, besteht darin, dass der von den AWS-Gruppen angegebene Pfad in emr 5.2.1-Clustern nicht existiert (und möglicherweise überhaupt nicht in einem emr 5.0-Cluster).

Also, stattdessen habe ich die 4.2 Version der emr-dynamodb-hadoop jar from Maven heruntergeladen.

Da sich das JAR nicht auf dem emr-Cluster befindet, müssen Sie es in Ihr jar einfügen. Wenn Sie sbt verwenden, können Sie sbt assembly verwenden. Wenn Sie nicht möchten, dass solch ein monolithisches Jar läuft (und die Konfliktauflösung zwischen Version 1.7 und 1.8 von Netbeans herausfinden muss), können Sie auch just merge jars als Teil Ihres Build-Prozesses verwenden. Auf diese Weise haben Sie ein Glas für Ihre emr Schritt, die Sie für einfache On-Demand-Funken Jobs s3 für einfache create-cluster setzen können.

Verwandte Themen