我需要使用 Hive 处理 S3 存储桶中的一些文件。问题是,Hive 显然不喜欢将存储桶用作文件夹,因此我决定在另一个存储桶中创建一个文件夹,并通过 s3cmd 将文件复制到那里。
这是我的命令:
s3cmd -v cp s3://main.bucket/\* s3://temp.bucket/input/
然后 s3cmd 立即声明我有 X 个文件需要传输(通常约为 5k++ 的数量级),然后在复制一个文件后,出现以下错误:
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
An unexpected error has occurred.
Please report the following lines to:
[email protected]
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Problem: KeyError: 'dest_name'
S3cmd: 1.0.1
Traceback (most recent call last):
File "/usr/local/bin/s3cmd", line 2006, in <module>
main()
File "/usr/local/bin/s3cmd", line 1950, in main
cmd_func(args)
File "/usr/local/bin/s3cmd", line 614, in cmd_cp
subcmd_cp_mv(args, s3.object_copy, "copy", "File %(src)s copied to %(dst)s")
File "/usr/local/bin/s3cmd", line 604, in subcmd_cp_mv
dst_uri = S3Uri(item['dest_name'])
KeyError: 'dest_name'
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
An unexpected error has occurred.
Please report the above lines to:
[email protected]
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
现在,这真是糟透了。
我认为问题在于 bucket-bucket 传输,因此我决定在 main.bucket 内创建一个文件夹,然后简单地复制其中的所有内容,而不关心要将所有内容复制到的文件夹是否也被复制,从而导致循环或诸如此类的事情,因为那时我已经束手无策了。
新的命令如下:
s3cmd -v cp s3://main.bucket/\* s3://main.bucket/111a/
再次,它只复制了一个文件,并给出了同样的错误。
这是什么意思?我该如何解决这个问题?
谢谢。
PS 如果其他方法都失败了,我想我可以通过 AWS 的 GUI 来完成,但手动检查每个复选框很麻烦。据我所知,如果你向下滚动的时间足够长,它会愚蠢地忘记你上面检查的文件,迫使你以蜗牛般的速度完成它。
如果有一种方法可以一次性选择它们,然后将它们复制粘贴到新目录中,那就太好了。
答案1
您使用的 s3cmd 版本非常老旧。我相信这个错误在过去几年里已经修复了。请使用上游 github.com/s3tools/s3cmd 主分支重试。截至今天,1.5.0-rc1 是最新版本。