2012-03-23 93 views
12

我试图删除由于MapReduce作业而创建的文件夹。存储桶中的其他文件删除就好了,但该文件夹不会被删除。当我尝试从控制台中删除它时,其状态旁边的进度条只停留在0.已经进行了多次尝试,包括在两者之间注销/登录。文件夹不会在亚马逊S3上删除

+0

该文件夹是否来自[Elastic MapReduce](http://aws.amazon.com/elasticmapreduce/)作业或来自另一个MapReduce f ramework? – 2012-03-24 14:52:43

+0

Elastic MapReduce – babonk 2012-03-25 00:22:34

回答

5

首先,Amazon S3实际上并没有文件夹/目录的本机概念,而仅仅是一个由存储桶和对象/键组成的平面存储体系结构 - 在S3的大多数工具(包括AWS Management Console本身)完全基于约定,即模拟具有相同前缀的对象的层次结构 - 请参阅我对How to specify an object expiration prefix that doesn't match the directory?的回答以获取关于此体系结构的更多详细信息,包括AWS文档中的引用/引用。

因此,您的问题可能会从工具中使用不同的约定来模拟这一层次在AWS论坛干的,例如参见如下回答:

  • 伊万·莫伊谢耶夫的回答相关问题Cannot delete file from bucket,其中他建议使用另一种工具来检查你是否可能有这样的问题并相应地进行补救。

  • AWS团队对What are these _$folder$ objects的回应? - 这是一个由许多工具使用的约定,包括Hadoop在S3中创建目录。他们主要需要指定空目录。人们可能更喜欢更美观的方案,但是这正是这些工具所采用的方式。

祝你好运!

0

首先,从getBucket方法中读取目录的内容,然后得到所有文件的数组列表,然后从deleteObject方法中删除该文件。

if (($contents = $this->S3->getBucket(AS_S3_BUCKET, "file_path")) !== false) 
{ 
    foreach ($contents as $file) 
    { 
    $result = $this->S3->deleteObject(AS_S3_BUCKET,$file['name']); 
    } 
} 

$this->S3是S3类对象,和AS_S3_BUCKET是桶名。

1

我试图从Cloudfront中删除一个存放日志文件的目录存储桶时出现以下错误。

An unexpected error has occurred. Please try again later. 

当我在Cloudfront中禁用日志功能后,我能够成功删除文件夹。

我的猜测是,这是Cloudfront使用的系统文件夹,不允许所有者删除。

在你的情况下,你可能想检查MapReduce是否持有有问题的文件夹。

1

我正面临同样的问题。尝试了许多登录,注销尝试和刷新,但问题仍然存在。搜索了stackoverflow并找到了在不同文件夹中剪切和粘贴文件夹的建议,然后删除但没有奏效。 你应该看的另一件事是可能影响你的存储桶的版本控制可能会暂停版本控制,允许你删除该文件夹。

我的解决方案是用代码删除它。我用python中的boto包进行s3文件处理,当我尝试从python代码中删除该文件夹时删除工作。

import boto 
from boto.s3.key import Key 
keyId = "your_aws_access_key" 
sKeyId = "your_aws_secret_key" 
fileKey="dummy/foldertodelete/" #Name of the file to be deleted 
bucketName="mybucket001" #Name of the bucket, where the file resides 
conn = boto.connect_s3(keyId,sKeyId) #Connect to S3 
bucket = conn.get_bucket(bucketName) #Get the bucket object 
k = Key(bucket,fileKey) #Get the key of the given object 
k.delete() #Delete 

S3不保留目录它只是有一个扁平的文件结构,所以一切都用密钥管理。 对于你来说它是一个文件夹,但对于S3来说它只是一个关键。

如果你想删除一个文件夹命名为 - >虚拟 那么关键是

fileKey = "/dummy/" 
15

我有同样的问题,并使用AWS CLI来解决它:

aws s3 rm s3://<your-bucket>/<your-folder-to-delete>/ --recursive ; 

(假设你已经运行aws configureaws s3 ls s3://<your-bucket>/已经工作)

+0

工程就像一个魅力,绝对是一种方式。对于任何好奇的人,如果你想上传本地目录,相反的命令是'''aws s3 cp YourLocalProjectFolder s3:// yourS3bucketname --recursive --debug''' – AdjunctProfessorFalcon 2017-02-27 22:31:31

+0

没有';'在行结束。 'aws> s3 rm s3:// /<你的文件夹删除>/- 递归' – 2017-05-09 07:51:28

+0

@YuAnShaolinMaculelêLai';'在powershell或bash中是可选的。我承认,我们已经进入了一个半结肠(ruby/python)的后现代时代......但它有它的用途:允许在一行中使用多个命令,或者表示语句的结束。 – sonjz 2017-05-09 23:16:05