【发布时间】:2011-06-26 03:20:20
【问题描述】:
我有一个包含数千个文件的存储桶。如何搜索存储桶?
【问题讨论】:
-
我有多个存储桶,所以我编写了一个简短的脚本来搜索所有存储桶:github.com/laurenfitch/utilities/blob/master/query_s3.py
标签: amazon-web-services amazon-s3
我有一个包含数千个文件的存储桶。如何搜索存储桶?
【问题讨论】:
标签: amazon-web-services amazon-s3
只是要在此处添加一个注释:现在已经 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 个字符。您不需要它,但如果您将输出传送到另一个命令中,那么“干净”的输出可能会很方便。
S3 没有原生的“搜索此存储桶”,因为实际内容是未知的 - 此外,由于 S3 是基于键/值的,因此没有原生方式一次访问多个节点,而更传统的数据存储提供了 @ 987654323@(在 SQL 模型中)。
您需要做的是执行ListBucket 以获取存储桶中的对象列表,然后遍历执行您实施的自定义操作的每个项目 - 这就是您的搜索。
【讨论】:
AWS 发布了一项使用 SQL 查询 S3 存储桶的新服务:Amazon Athena https://aws.amazon.com/athena/
【讨论】:
有(至少)两种不同的用例可以描述为“搜索桶”:
搜索存储在存储桶中的每个对象内部;这假定该存储桶中的所有对象(例如,文本文件)等都采用通用格式。对于这样的事情,您不得不做 Cody Caughlan 刚刚回答的事情。 AWS S3 文档的示例代码展示了如何使用适用于 Java 的 AWS 开发工具包执行此操作:Listing Keys Using the AWS SDK for Java(您还可以在其中找到 PHP 和 C# 示例)。
列表项 在该存储桶中包含的对象 keys 中搜索某些内容; S3 确实对此有部分支持,其形式是允许前缀完全匹配+在分隔符后折叠匹配。这在AWS S3 Developer Guide 中有更详细的解释。例如,这允许通过使用像
这样的对象键来实现“文件夹”folder/subfolder/file.txt如果您遵循此约定,大多数 S3 GUI(例如 AWS 控制台)将向您显示存储桶的文件夹视图。
【讨论】:
有多种选择,没有一个是简单的“一次性”全文解决方案:
键名模式搜索:搜索以某个字符串开头的键-如果您仔细设计键名,那么您可能会有相当快速的解决方案。
搜索附加到键的元数据:在将文件发布到 AWS S3 时,您可以处理内容,提取一些元信息并将这些元信息以自定义标头的形式附加到键中.这允许您获取关键名称和标题,而无需获取完整的内容。搜索必须按顺序进行,没有“类似 sql”的搜索选项。对于大文件,这可以节省大量网络流量和时间。
将元数据存储在 SimpleDB 上:如前所述,但将元数据存储在 SimpleDB 上。在这里,您有 sql 之类的 select 语句。在大型数据集的情况下,您可能会遇到 SimpleDB 限制,这是可以克服的(跨多个 SimpleDB 域分区元数据),但如果您走得太远,您可能需要使用另一种元数据类型的数据库。
连续全文搜索 - 一个一个地处理所有的键。非常慢,如果您要处理的键太多。
我们在几年内每天(每分钟一个)存储 1440 个版本的文件,使用版本化存储桶,这很容易实现。但是获得一些较旧的版本需要时间,因为必须逐个版本地按顺序进行。有时我使用带有记录的简单 CSV 索引,显示发布时间和版本 ID,有了这个,我可以很快跳转到旧版本。
如您所见,AWS S3 并不是为全文搜索而设计的,它是一种简单的存储服务。
【讨论】:
如果您使用的是 Windows 并且没有时间找到一个不错的 grep 替代方案,那么一种快速而肮脏的方法是:
aws s3 ls s3://your-bucket/folder/ --recursive > myfile.txt
然后在 myfile.txt 中快速搜索
“文件夹”位是可选的。
附:如果您没有安装 AWS CLI - 这是一个使用 Chocolatey 包管理器的单行程序
choco install awscli
附言如果你没有 Chocolatey 包管理器 - 得到它!您在 Windows 上的生活将提高 10 倍。 (我与 Chocolatey 没有任何关系,但是,嘿,它是必备品,真的)。
【讨论】:
直接在 AWS 控制台存储桶视图中。
当您拥有数千或数百万个文件时,获取所需文件的另一种方法是使用分布式副本将它们复制到另一个位置。您可以在 Hadoop 作业中的 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"
}
]
【讨论】:
试试这个命令:
aws s3api list-objects --bucket your-bucket --prefix sub-dir-path --output text --query 'Contents[].{Key: Key}'
然后,您可以将其通过管道传输到 grep 中,以获取特定的文件类型以对它们执行任何操作。
【讨论】:
--output text 指定输出将是纯文本,而不是 JSON 等,--query 'Contents[].{Key: Key, Size: Size}' 仅将列表的输出过滤为文件名和文件大小。它不搜索Key: Key 等。
我尝试了以下方式
aws s3 ls s3://Bucket1/folder1/2019/ --recursive |grep filename.csv
这会输出文件所在的实际路径
2019-04-05 01:18:35 111111 folder1/2019/03/20/filename.csv
【讨论】:
使用 Amazon Athena 查询 S3 存储桶。此外,将数据加载到 Amazon Elastic 搜索。希望这可以帮助。
【讨论】:
另一种选择是在您的 Web 服务器上镜像 S3 存储桶并在本地遍历。诀窍是本地文件是空的,仅用作骨架。或者,本地文件可以保存您通常需要从 S3 获取的有用元数据(例如文件大小、mimetype、作者、时间戳、uuid)。当您提供下载文件的 URL 时,请在本地搜索并提供指向 S3 地址的链接。
本地文件遍历很容易,而且这种 S3 管理方法与语言无关。本地文件遍历还避免了维护和查询文件数据库或延迟进行一系列远程 API 调用以进行身份验证和获取存储桶内容。
您可以允许用户通过 FTP 或 HTTP 将文件直接上传到您的服务器,然后在非高峰时间将一批新的和更新的文件传输到 Amazon,只需在目录中递归任意大小的文件即可。完成向 Amazon 的文件传输后,将 Web 服务器文件替换为同名的空文件。如果本地文件有任何文件大小,则直接提供它,因为它正在等待批量传输。
【讨论】:
鉴于您在 AWS...我想您会想要使用他们的 CloudSearch 工具。将您要搜索的数据放入他们的服务中...让它指向 S3 密钥。
【讨论】:
我的做法是: 我在 s3 中有数千个文件。 我在列表中看到了一个文件的属性面板。您可以看到该文件的 URI,然后我将其复制并粘贴到浏览器中——它是一个文本文件,并且呈现得很好。现在我用我手头的 uuid 替换了 url 中的 uuid,文件就在那里。
我希望 AWS 有更好的方法来搜索文件,但这对我有用。
【讨论】:
这是一个有点旧的线程 - 但也许可以帮助仍在搜索的人 - 我是一年搜索那个的人。
解决方案可能是“AWS Athena”,您可以在其中搜索这样的数据
'SELECT user_name FROM S3Object WHERE cast(age as int) > 20'
目前的定价是$5 for 1TB data - 例如,如果您对一个 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 返回,而不仅仅是匹配前缀和分隔符的那些。我正在寻找提高性能的方法,到目前为止我只发现我应该命名键并将它们正确地组织在存储桶中。
【讨论】:
状态 2018-07: 亚马逊确实有原生 sql,比如搜索 csv 和 json 文件!
【讨论】:
我遇到了同样的问题。在 S3 中搜索应该比目前的情况容易得多。这就是为什么我在 S3 中实现了这个用于搜索的开源工具。
SSEARCH 是完全开源的 S3 搜索工具。它的实施始终牢记性能是关键因素,根据基准它在几秒钟内搜索包含约 1000 个文件的存储桶。
安装很简单。您只需下载 docker-compose 文件并运行它
docker-compose up
SSEARCH 将启动,您可以搜索您拥有的任何存储桶中的任何内容。
【讨论】:
快进到 2020 年,使用 aws-okta 作为我们的 2fa,以下命令虽然在这个特定存储桶 (+270,000) 中迭代所有对象和文件夹的速度非常慢。
aws-okta exec dev -- aws s3 ls my-cool-bucket --recursive | grep needle-in-haystax.txt
【讨论】:
【讨论】: