amazons3exception错误请求:从frankfurt s3到emr hdfs的distcp失败

oxiaedzo  于 2021-05-29  发布在  Hadoop
关注(0)|答案(2)|浏览(304)

我正在尝试将一个文件从一个来自法兰克福(eu-central-1)的s3存储桶复制到我通过爱尔兰emr托管的hdfs(eu-west-1)上。我尝试执行的复制命令,其中:

hdfs dfs -cp "s3a://<bucket>/<file>" /user/hadoop/<file>

s3-dist-cp --src "s3a://<bucket>/" --dest hdfs:///user/hadoop/ --srcPattern <file>

hadoop distcp "s3a://<bucket>/<file>" /user/hadoop/<file>

在所有情况下(以及关于额外选项和所有这些命令上的s3、s3a、s3n的各种排列),我确实得到了如下例外情况:

16/01/15 11:48:24 ERROR tools.DistCp: Exception encountered
com.amazonaws.services.s3.model.AmazonS3Exception: Bad Request (Service: Amazon S3; Status Code: 400; Error Code: 400 Bad Request; Request ID: 4A77158C1BD71C29), S3 Extended Request ID:     LU41MspxqVnHqyaMreTvggRG480Wb9d+TBx1MAo5v/g9yz07mmPizcZVOtRMQ+GElXs8vl/WZXA=
        at com.amazonaws.http.AmazonHttpClient.handleErrorResponse(AmazonHttpClient.java:1219)
        at com.amazonaws.http.AmazonHttpClient.executeOneRequest(AmazonHttpClient.java:803)
        at com.amazonaws.http.AmazonHttpClient.executeHelper(AmazonHttpClient.java:505)
        at com.amazonaws.http.AmazonHttpClient.execute(AmazonHttpClient.java:317)
        at com.amazonaws.services.s3.AmazonS3Client.invoke(AmazonS3Client.java:3595)
        at com.amazonaws.services.s3.AmazonS3Client.headBucket(AmazonS3Client.java:1041)
        at com.amazonaws.services.s3.AmazonS3Client.doesBucketExist(AmazonS3Client.java:1013)
        at org.apache.hadoop.fs.s3a.S3AFileSystem.initialize(S3AFileSystem.java:154)
        at org.apache.hadoop.fs.FileSystem.createFileSystem(FileSystem.java:2644)
        at org.apache.hadoop.fs.FileSystem.access$200(FileSystem.java:90)
        at org.apache.hadoop.fs.FileSystem$Cache.getInternal(FileSystem.java:2678)
        at org.apache.hadoop.fs.FileSystem$Cache.get(FileSystem.java:2660)
        at org.apache.hadoop.fs.FileSystem.get(FileSystem.java:374)
        at org.apache.hadoop.fs.Path.getFileSystem(Path.java:296)
        at org.apache.hadoop.tools.GlobbedCopyListing.doBuildListing(GlobbedCopyListing.java:76)
        at org.apache.hadoop.tools.CopyListing.buildListing(CopyListing.java:84)
        at org.apache.hadoop.tools.DistCp.createInputFileListing(DistCp.java:353)
        at org.apache.hadoop.tools.DistCp.execute(DistCp.java:160)
        at org.apache.hadoop.tools.DistCp.run(DistCp.java:121)
        at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:70)
        at org.apache.hadoop.tools.DistCp.main(DistCp.java:401)

所以我认为使用s3a在幕后使用亚马逊的sdk。经过大量研究,我找到了推测的原因:
链接:amazons3a用spark返回400个错误请求
链接:https://github.com/aws/aws-sdk-java/issues/360
总之,法兰克福和其他一些较新的中心“只能”使用签名版本4,但是hadoop cp、distcp或s3 dist cp所能做的所有命令都是使用版本2?
因为使用s3a就是使用awsdk,所以我尝试通过添加

export JAVA_OPTS="-Dcom.amazonaws.services.s3.enableV4 -Dcom.amazonaws.services.s3.enforceV4"

但无济于事。
这一事实让我尝试做以上所有的事情,但不是在eu-central-1,而是在eu-west-1。成功了。我猜就是这样?
这个问题有解决办法吗?有人也经历过吗?
编辑
另一种可行的方法是使用awscli将数据从s3下载到主服务器上,然后使用。

hdfs dfs -put <src> <dst>

完成任务。但是,如果这真的是大量的数据不适合主节点,该怎么办呢?

m3eecexj

m3eecexj1#

通过指定端点,我成功地将数据从s3、fra获取到hdfs中:

hdfs dfs -Dfs.s3a.awsAccessKeyId=<access key ID> -Dfs.s3a.awsSecretAccessKey=<secret acces key> -Dfs.s3a.endpoint=<s3 enpoint> -ls s3a://<bucket_name>/...

您不应该也不应该在本地复制它。

jhdbpxl9

jhdbpxl92#

s3a支持法兰克福&seol;这是我们明确测试的对象。正如lulia所指出的,您确实需要设置端点。s3a的hadoop文档涵盖了这一点。
请注意,一旦将端点固定为frankfurt或seol,就不能再访问其他区域中的数据,因为它们不会中继到其他区域。

相关问题