S3-什么是前缀? 什么是速率限制?

我想知道是否有人知道 s3前缀到底是什么,以及它是如何与亚马逊的 公布的中三收费限额交互的:

Amazon S3自动扩展到高请求速率, 您的应用程序可以实现至少3,500 PUT/POST/DELETE 和5,500 在桶中,每秒钟每个前缀获取请求 桶中前缀的数量。

很明显,我不太确定前缀是什么?

前缀需要分隔符吗?

如果我们有一个存储所有文件在“根”级别(完全平坦,没有任何前缀/分隔符)的桶,这是否算作单一的“前缀”,它是否受到上面贴出的速率限制?

我解释 亚马逊的文档的方式告诉我,情况就是这样,扁平结构将被认为是一个单一的“前缀”。(须遵守上述公布的利率上限)

假设您的 bucket (管理创建的)有四个对象 以下对象键:

Development/Projects1.xls 开发/项目1.xls

财务/声明1.pdf

私人/税务文件 pdf

S3-dg. pdf

S3-dg.pdf 键没有前缀,因此将显示其对象 直接在 bucket 的根级别打开 文件夹中,可以看到 Projects.xlsx 对象。

在上面的例子中,s3-dg.pdf 与其他前缀(Development/Finance/Private)相比是否受到不同的速率限制(每秒5500个 GET 请求) ?


更令人困惑的是,我读过一些关于亚马逊使用前 N 个字节作为分区键的博客,并鼓励使用高基数前缀,我只是不确定如何与一个“平面文件结构”的桶交互。

67688 次浏览

In order for AWS to handle billions of requests per second, they need to shard up the data so it can optimise throughput. To do this they split the data into partitions based on the first 6 to 8 characters of the object key. Remember S3 is not a hierarchical filesystem, it is only a key-value store, though the key is often used like a file path for organising data, prefix + filename.

Now this is not an issue if you expect less than 100 requests per second, but if you have serious requirements over that then you need to think about naming.

For maximum parallel throughput you should consider how your data is consumed and use the most varying characters at the beginning of your key, or even generate 8 random character for the first 8 characters of the key.

e.g. assuming first 6 characters define the partition:

files/user/bob would be bad as all the objects would be on one partition files/.

2018-09-21/files/bob would be almost as bad if only todays data is being read from partition 2018-0. But slightly better if the objects are read from past years.

bob/users/files would be pretty good if different users are likely to be using the data at the same time from partition bob/us. But not so good if Bob is by far the busiest user.

3B6EA902/files/users/bob would be best for performance but more challenging to reference, where the first part is a random string, this would be pretty evenly spread.

Depending on your data, you need to think of any one point in time, who is reading what, and make sure that the keys start with enough variation to partition appropriately.


For your example, lets assume the partition is taken from the first 6 characters of the key:

for the key Development/Projects1.xls the partition key would be Develo

for the key Finance/statement1.pdf the partition key would be Financ

for the key Private/taxdocument.pdf the partition key would be Privat

for the key s3-dg.pdf the partition key would be s3-dg.

This looks like it is obscurely addressed in an amazon release communication

https://aws.amazon.com/about-aws/whats-new/2018/07/amazon-s3-announces-increased-request-rate-performance/

Performance scales per prefix, so you can use as many prefixes as you need in parallel to achieve the required throughput. There are no limits to the number of prefixes.

This S3 request rate performance increase removes any previous guidance to randomize object prefixes to achieve faster performance. That means you can now use logical or sequential naming patterns in S3 object naming without any performance implications. This improvement is now available in all AWS Regions. For more information, visit the Amazon S3 Developer Guide.

You're right, the announcement seems to contradict itself. It's just not written properly, but the information is correct. In short:

  1. Each prefix can achieve up to 3,500/5,500 requests per second, so for many purposes, the assumption is that you wouldn't need to use several prefixes.
  2. Prefixes are considered to be the whole path (up to the last '/') of an object's location, and are no longer hashed only by the first 6-8 characters. Therefore it would be enough to just split the data between any two "folders" to achieve x2 max requests per second. (if requests are divided evenly between the two)

For reference, here is a response from AWS support to my clarification request:

Hello Oren,

Thank you for contacting AWS Support.

I understand that you read AWS post on S3 request rate performance being increased and you have additional questions regarding this announcement.

Before this upgrade, S3 supported 100 PUT/LIST/DELETE requests per second and 300 GET requests per second. To achieve higher performance, a random hash / prefix schema had to be implemented. Since last year the request rate limits increased to 3,500 PUT/POST/DELETE and 5,500 GET requests per second. This increase is often enough for applications to mitigate 503 SlowDown errors without having to randomize prefixes.

However, if the new limits are not sufficient, prefixes would need to be used. A prefix has no fixed number of characters. It is any string between a bucket name and an object name, for example:

  • bucket/folder1/sub1/file
  • bucket/folder1/sub2/file
  • bucket/1/file
  • bucket/2/file

Prefixes of the object 'file' would be: /folder1/sub1/ , /folder1/sub2/, /1/, /2/. In this example, if you spread reads across all four prefixes evenly, you can achieve 22,000 requests per second.

In the case you query S3 using Athena, EMR/Hive or Redshift Spectrum increasing the number of prefixes could mean adding more partitions (as the partititon id is part of the prefix). If using datetime as (one of) your partititon keys the number of partittions (and prefixes) will automatically grow as new data is added over time and the total max S3 GETs per second grow as well.

The upvoted answer on this was a bit misleading for me. If these are the paths

bucket/folder1/sub1/file
bucket/folder1/sub2/file
bucket/1/file
bucket/2/file

Your prefix for file would actually be
folder1/sub1/
folder1/sub2/
1/file
2/file

https://docs.aws.amazon.com/AmazonS3/latest/dev/ListingKeysHierarchy.html Please se docs. I had issues with the leading '/' when trying to list keys with the airflow s3hook.

S3 prefixes used to be determined by the first 6-8 characters;

This has changed mid-2018 - see announcement https://aws.amazon.com/about-aws/whats-new/2018/07/amazon-s3-announces-increased-request-rate-performance/

But that is half-truth. Actually prefixes (in old definition) still matter.

S3 is not a traditional “storage” - each directory/filename is a separate object in a key/value object store. And also the data has to be partitioned/ sharded to scale to quadzillion of objects. So yes this new sharding is kinda of “automatic”, but not really if you created a new process that writes to it with crazy parallelism to different subdirectories. Before the S3 learns from the new access pattern, you may run into S3 throttling before it reshards/ repartitions data accordingly.

Learning new access patterns takes time. Repartitioning of the data takes time.

Things did improve in mid-2018 (~10x throughput-wise for a new bucket with no statistics), but it's still not what it could be if data is partitioned properly. Although to be fair, this may not be applied to you if you don't have a ton of data, or pattern how you access data is not hugely parallel (e.g. running a Hadoop/Spark cluster on many Tbs of data in S3 with hundreds+ of tasks accessing same bucket in parallel).

TLDR:

"Old prefixes" still do matter. Write data to root of your bucket, and first-level directory there will determine "prefix" (make it random for example)

"New prefixes" do work, but not initially. It takes time to accommodate to load.

PS. Another approach - you can reach out to your AWS TAM (if you have one) and ask them to pre-partition a new S3 bucket if you expect a ton of data to be flooding it soon.

S3 - What Exactly Is A Prefix?

S3 recently updated their document to better reflect this.

"A prefix is a string of characters at the beginning of the object key name. A prefix can be any length, subject to the maximum length of the object key name (1,024 bytes). "

From - https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-prefixes.html

Note: "You can use another character as a delimiter. There is nothing unique about the slash (/) character, but it is a very common prefix delimiter."

As long as two objects have different prefixes, s3 will provide the documented throughput over time.

Update: https://docs.aws.amazon.com/general/latest/gr/glos-chap.html#keyprefix reflecting the updated definition.