你如何searchamazon s3桶?
我有一个包含数千个文件的存储桶。 我怎样才能search桶? 有没有可以推荐的工具?
由于S3是基于键/值的,因此S3没有本地的“search这个桶”,因为实际的内容是未知的,所以没有原生的方式来一次访问许多节点。更传统的数据存储提供了一个(SELECT * FROM ... WHERE ...)
(在SQL模型中)。
你需要做的是执行ListBucket
获取桶中的对象列表,然后迭代每个项目执行自定义操作,你实现 – 这是你的search。
只需要在这里添加一个注释:现在是3年后,但是当你input“如何search一个S3桶”时,这个post在谷歌的顶部。
也许你正在寻找更复杂的东西,但是如果你在这里着陆,试图找出如何简单地find一个对象(文件)的标题,这是非常简单的:
打开存储桶,在右侧select“无”,然后开始input文件名。
http://docs.aws.amazon.com/AmazonS3/latest/UG/ListingObjectsinaBucket.html
至less有两种不同的用例可以被描述为“search桶”:
-
在存储在桶中的每个对象内search内容; 这假设一个通用格式的所有对象在这个桶(比如文本文件)等等。对于这样的事情,你不得不做Cody Cowlan刚刚回答的问题。 AWS S3文档提供了示例代码,演示了如何使用适用于Java的AWS开发工具包完成此操作: 使用适用于Java的AWS开发工具包列出密钥 (您也可以findPHP和C#示例)。
-
列表项search该存储桶中包含的对象键中的某些内容; S3对此有部分支持,允许前缀完全匹配+分隔符后的折叠匹配。 这在AWS S3开发者指南中有更详细的解释。 例如,这允许通过使用类似的对象键来实现“文件夹”
文件夹/子文件夹/ file.txt的
如果遵循此惯例,大多数S3 GUI(例如AWS控制台)将显示您的存储桶的文件夹视图。
有多种select,没有一个是简单的“一枪”全文解决scheme:
-
按键名称模式search :search以一些string开头的按键 – 如果您仔细devise按键名称,那么您可能会有相当快的解决scheme。
-
search附加到密钥的元数据 :将文件发布到AWS S3时,您可以处理内容,提取一些元信息,并将此元信息以自定义标题的forms附加到密钥中。 这使您可以获取密钥名称和标题,而无需获取完整的内容。 search必须按顺序进行,这里没有“sql like”search选项。 大文件可以节省大量的networkingstream量和时间。
-
在SimpleDB上存储元数据 :如前所述,但在SimpleDB上存储元数据。 在这里你有SQL像select语句。 在大数据集的情况下,您可能会遇到SimpleDB的限制(可以跨多个SimpleDB域进行分区元数据),但如果您走得太远,则可能需要使用另一个metedatatypes的数据库。
-
内容的顺序全文search – 逐个处理所有的密钥。 非常慢,如果你有太多的密钥处理。
我们每天存储1440个版本的文件(每分钟一个)几年,使用版本化的桶,很容易。 但是,获得一些较旧的版本需要时间,因为必须逐个版本地逐个版本。 有时我使用简单的CSV索引与logging,显示出版时间加上版本ID,有了这个,我可以跳转到旧版本相当快。
如您所见,AWS S3不是专为全文search而devise的,它是简单的存储服务。
以下是使用AWS CLI执行search文件名的简短和难看的方法:
aws s3 ls s3://your-bucket --recursive | grep your-search | cut -c 32-
AWS发布了一个新的服务,用SQL查询S3桶:Amazon Athena https://aws.amazon.com/athena/
鉴于你在AWS …我想你会想要使用他们的CloudSearch工具。 把你想要search的数据放在他们的服务中,让它指向S3键。
按S3控制台中的前缀进行search
直接在AWS控制台存储桶视图中。
使用s3-dist-cp复制想要的文件
当您拥有数千或数百万个文件时,获取所需文件的另一种方法是使用分布式复制将它们复制到另一个位置。 您在Hadoop作业中的EMR上执行此操作。 关于AWS的一个很酷的事情就是他们提供了自定义的S3版本s3-dist-cp 。 它允许您使用groupBy字段中的正则expression式对所需文件进行分组。 您可以在EMR的自定义步骤中使用此function
[ { "ActionOnFailure": "CONTINUE", "Args": [ "s3-dist-cp", "--s3Endpoint=s3.amazonaws.com", "--src=s3://mybucket/", "--dest=s3://mytarget-bucket/", "--groupBy=MY_PATTERN", "--targetSize=1000" ], "Jar": "command-runner.jar", "Name": "S3DistCp Step Aggregate Results", "Type": "CUSTOM_JAR" } ]
另一个select是在您的Web服务器上镜像S3存储桶并在本地进行遍历。 诀窍是本地文件是空的,只能用作骨架。 另外,本地文件可以保存你通常需要从S3获得的有用的元数据(例如,文件大小,MIMEtypes,作者,时间戳,uuid)。 当您提供一个URL来下载文件时,请在本地进行search,但是提供一个到S3地址的链接。
本地文件遍历很容易,S3pipe理的这种方法是语言不可知的。 本地文件遍历还避免了维护和查询文件数据库或延迟,使得一系列远程API调用进行authentication和获取桶内容。
您可以允许用户通过FTP或HTTP将文件直接上传到您的服务器,然后通过在任意大小的文件目录上recursion,在非高峰时间将一批新的和更新的文件传输到Amazon。 在完成向亚马逊的文件传输时,请将Web服务器文件replace为空名称。 如果本地文件具有任何文件大小,则直接由于等待批量传输而提供。
试试这个命令:
aws s3api list-objects --bucket your-bucket --prefix sub-dir-path --output text --query 'Contents[].{Key: Key}'
然后,你可以pipe这个grep来获得特定的文件types来做任何你想要的东西。
看看这个文档: http : //docs.aws.amazon.com/AWSSDKforPHP/latest/index.html#m=amazons3/get_object_list
您可以使用Perl兼容的正则expression式(PCRE)来过滤名称。
我做到这一点的方式是:我在S3中有成千上万个文件。 我看到列表中的一个文件的属性面板。 您可以看到该文件的URI,并将其复制粘贴到浏览器 – 这是一个文本文件,它很好地呈现。 现在我用我手上的uuidreplace了url中的uuid,然后在那里激活文件。
我希望AWS有一个更好的方式来search一个文件,但是这对我有效。
我做了一些如下的事情来find我的桶里的模式
def getListOfPrefixesFromS3(dataPath: String, prefix: String, delimiter: String, batchSize: Integer): List[String] = { var s3Client = new AmazonS3Client() var listObjectsRequest = new ListObjectsRequest().withBucketName(dataPath).withMaxKeys(batchSize).withPrefix(prefix).withDelimiter(delimiter) var objectListing: ObjectListing = null var res: List[String] = List() do { objectListing = s3Client.listObjects(listObjectsRequest) res = res ++ objectListing.getCommonPrefixes listObjectsRequest.setMarker(objectListing.getNextMarker) } while (objectListing.isTruncated) res }
对于较大的桶,这会消耗太多时间,因为所有的对象摘要都是由Aws返回的,而不仅仅是匹配前缀和分隔符的那些对象摘要。 我正在寻找方法来提高性能,到目前为止,我只发现我应该命名的密钥,妥善组织在桶中。