Answers:
S3没有本机的“搜索此存储区”,因为实际内容是未知的-而且,由于S3是基于键/值的,因此没有一种本机方式可同时访问许多节点以及提供(SELECT * FROM ... WHERE ...)
(模型)。
您需要执行的操作是ListBucket
获取存储桶中的对象列表,然后遍历执行您实现的自定义操作(即搜索)的每个项目。
只是在此处添加一条注释:现在已经3年了,但是当您键入“如何搜索S3存储桶”时,这篇文章在Google中排名第一。
也许您正在寻找更复杂的东西,但是如果您试图通过标题找到一个简单的对象(文件),那么就很简单了:
打开存储桶,在右侧选择“无”,然后开始输入文件名。
http://docs.aws.amazon.com/AmazonS3/latest/UG/ListingObjectsinaBucket.html
这是使用AWS CLI搜索文件名的一种简短而丑陋的方法:
aws s3 ls s3://your-bucket --recursive | grep your-search | cut -c 32-
cut -c 32-
只需从输出中截取时间戳记和文件大小信息,在我的系统上就占用了32个字符。您不需要它,但是如果将输出管道输送到另一个命令中,则拥有“干净”输出可能会很方便。
include/exclude
。因此,aws s3 ls s3://bucket --recursive --exclude '*' --include 'myfile*'
(至少)有两种不同的用例,它们可以描述为“搜索存储桶”:
在存储在存储桶中的每个对象中搜索内容;这假定该存储桶中的所有对象(例如文本文件)等都采用通用格式。对于类似的事情,您不得不执行Cody Caughlan刚刚回答的操作。AWS S3文档中有示例代码,展示了如何使用适用于Java的AWS开发工具包执行此操作:使用适用于Java的AWS开发工具包列出密钥(您还将找到PHP和C#示例)。
列表项在该存储桶中包含的对象键中搜索某些内容;S3 确实对此提供了部分支持,其形式为允许前缀精确匹配+在定界符之后折叠匹配。《AWS S3开发人员指南》中对此进行了更详细的说明。例如,这允许通过使用诸如以下的对象键来实现“文件夹”
文件夹/子文件夹/file.txt如果遵循此约定,则大多数S3 GUI(例如AWS控制台)将为您显示存储桶的文件夹视图。
AWS发布了一项新服务以使用SQL查询S3存储桶:Amazon Athena https://aws.amazon.com/athena/
有多种选择,没有一个是简单的“一枪”全文解决方案:
密钥名称模式搜索:搜索以某些字符串开头的密钥-如果您精心设计密钥名称,则可能会有较快速的解决方案。
搜索附加到密钥的元数据:将文件发布到AWS S3时,您可以处理内容,提取一些元信息,然后以自定义标头的形式将此元信息附加到密钥中。这使您无需获取完整的内容即可获取键名和标题。搜索必须按顺序进行,为此没有“ sql like”搜索选项。对于大文件,这可以节省大量网络流量和时间。
在SimpleDB的存储元数据:如前一点,但存储在SimpleDB的元数据。在这里,您有sql之类的select语句。对于大型数据集,您可能会达到SimpleDB限制,可以克服该限制(跨多个SimpleDB域的分区元数据),但是如果走得太远,则可能需要使用另一种metedata类型的数据库。
内容的顺序全文搜索 -逐一处理所有键。如果您要处理的密钥太多,则非常慢。
我们每天使用一天一分钟(每分钟一个)存储1440个文件版本,使用版本化存储桶很容易。但是要获得一些较旧的版本会花费一些时间,因为必须逐个版本地进行升级。有时我使用带有记录的简单CSV索引,显示发布时间和版本ID,有了这个,我可以很快跳到旧版本。
如您所见,AWS S3不是为全文搜索而设计的,它是简单的存储服务。
直接在AWS Console存储桶视图中。
当您有成千上万个文件时,获取所需文件的另一种方法是使用分布式副本将它们复制到另一个位置。您可以在Hadoop Job中的EMR上运行它。关于AWS的很棒的事情是,它们提供了自定义的S3版本s3-dist-cp。它允许您使用groupBy字段中的正则表达式对所需文件进行分组。例如,您可以在EMR的自定义步骤中使用它
[
{
"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"
}
]
如果您使用的是Windows,并且没有时间找到不错的grep
选择,那么一种快速而肮脏的方法是:
aws s3 ls s3://your-bucket/folder/ --recursive > myfile.txt
然后在myfile.txt中进行快速搜索
“文件夹”位是可选的。
PS(如果未安装AWS CLI)-这是一个使用Chocolatey软件包管理器的衬板
choco install awscli
PPS如果您没有Chocolatey软件包管理器,请安装它!您在Windows上的生活将提高10倍。(我与Chocolatey没有任何关系,但是,这确实是必须的)。
另一个选择是将S3存储桶镜像到Web服务器上并在本地遍历。诀窍是本地文件为空,仅用作框架。另外,本地文件可以保存您通常需要从S3获取的有用元数据(例如,文件大小,mimetype,作者,时间戳,uuid)。当您提供URL来下载文件时,请在本地搜索,但是提供指向S3地址的链接。
本地文件遍历很容易,并且这种用于S3管理的方法与语言无关。本地文件遍历还避免了维护和查询文件数据库,也避免了进行一系列远程API调用以验证和获取存储桶内容的延迟。
您可以允许用户通过FTP或HTTP直接将文件上传到您的服务器,然后在非高峰时间通过将任意大小的文件遍历目录将一批新的和更新的文件传输到Amazon。完成向Amazon的文件传输后,将Web服务器文件替换为一个空的同名文件。如果本地文件具有任何文件大小,则因为等待批传输而直接将其提供。
这是一个有点老的话题-但也许可以帮助仍在搜索的人-我就是那个搜索那一年的人。
解决方案可能是“ AWS Athena ”,您可以在其中搜索像这样的数据
'SELECT user_name FROM S3Object WHERE cast(age as int) > 20'
目前1TB数据的价格为5美元 -例如,如果您对一个1TB文件的查询进行了3倍的查询,则费用为15美元-例如,如果只有1列要转换的“转换列格式”,则需要支付1美元价格的/ 3表示$ 1.67 / TB。
看看这份文档:http : //docs.aws.amazon.com/AWSSDKforPHP/latest/index.html#m=amazons3/get_object_list
您可以使用与Perl兼容的正则表达式(PCRE)来过滤名称。
我做了如下操作以找到我的存储桶中的模式
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返回,而不仅仅是与前缀和分隔符匹配的对象。我正在寻找提高性能的方法,到目前为止,我仅发现我应该命名密钥并正确地将其组织在存储桶中。
我遇到了同样的问题。在S3中进行搜索应该比当前情况容易得多。因此,我在S3中实现了用于搜索的开源工具。
SSEARCH是完全开源的S3搜索工具。在实施时始终牢记性能是关键因素,并且根据基准,它会在几秒钟内搜索包含约1000个文件的存储桶。
安装很简单。您仅下载docker-compose文件并使用
docker-compose up
SSEARCH将启动,您可以在任何存储桶中搜索任何内容。
状态2018-07:亚马逊确实有本机sql,例如搜索csv和json文件!