、私はDynamoDBのためにパイプデータに火花を使用するAWS EMRクラスタを作成するとき、私はラインと前置きする必要があります。emotr-5.2.1でdynamodbに書き込むためにどのようにしてsparkを得ることができますか? <a href="https://aws.amazon.com/blogs/big-data/analyze-your-data-on-amazon-dynamodb-with-apache-spark/" rel="nofollow noreferrer">this article here</a>によると
spark-shell --jars /usr/share/aws/emr/ddb/lib/emr-ddb-hadoop.jar
この行はfrom the amazon devs themselvesを含む多数の文献に表示されます。しかし、私は追加--jars
フラグでcreate-cluster
を実行すると、私はこのエラーを取得:
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)
...
あり、ライブラリは、EMR-5.2.1に含まれるべきであることをthis SO questionの答えですので、私はそれなしで私のコードを実行してみました余分な--jars
フラグ:
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)
ちょうどにやにや笑いのために、私は私のステップへ--driver-class-path,/usr/share/aws/emr/ddb/lib/emr-ddb-hadoop.jar,
に追加することによって、その質問へのそのほかの回答によって提案された代替案を試してみました、と言われました:
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)
s3a.S3AFileSystem
は大きなもののようですが、特にs3から読み込んだ他のジョブがありますが、明らかにs3から読み込んでダイナモに書き込むのは難しいです。どのようにこの問題を解決するための任意のアイデアですか?
更新:私は、私はクラスパスをオーバーライドし、他のすべてのライブラリを落としたためにそのS3が発見されていなかったので、私はそうのようにクラスパスを更新考え出し:
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/*"
そして今、私はこのエラーを取得します:
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/
ライブラリは、AWSのドキュメントで指定された場所ではないようなので、それが見えます。誰かがこれを働かせてくれましたか?