1.概念#
Amazon s3全称Amazon Simple Storage Service,是一个对象存储,不是一个file system,所以在使用s3的时候,list dir会很慢
kv存储:从零开始写KV数据库:基于哈希索引
比如如下的s3路径
1 | s3://BucketName/Project/WordFiles/123.txt |
其中BucketName是s3的桶名
bucketname/Project/WordFiles/是分区前缀prefix
123.txt是对象名字
s3://BucketName/Project/WordFiles/123.txt是键前缀
参考:对于 Amazon S3 请求速率,前缀和嵌套文件夹之间有何区别? S3 存储桶中可以有多少个前缀?
S3 - What Exactly Is A Prefix? And what Ratelimits apply?
Organizing objects using prefixes
2.s3性能#
Amazon S3 是一个非常大的分布式系统,在应用程序对 Amazon S3 读写数据时,您可以将请求性能扩展到每秒数千个事务。
Amazon S3 性能不是按存储桶定义的,而是按存储桶中的前缀。在一个存储桶中,对于每个前缀,应用程序每秒可以处理至少 3500 个 PUT/COPY/POST/DELETE 请求或 5500 个 GET/HEAD 请求。
此外,存储桶中的前缀数量没有限制,因此您可以利用并行处理,横向扩展读取或写入性能。
例如,如果您在 S3 存储桶中创建 10 个前缀来并行执行读取操作,则可以将读取性能扩展到每秒 55000 个读取请求。同样,您也可以利用多个前缀写入数据来扩展写入性能。
参考:Best practices design patterns: optimizing Amazon S3 performance
从 Amazon EMR 和 AWS Glue 访问 Amazon S3 中数据的性能优化最佳实践
3.对象存储和文件系统的区别#
参考:是否可以将 Amazon S3 而不是 HDFS 作为 Hadoop 存储?
1 | https://hadoop.apache.org/docs/stable2/hadoop-project-dist/hadoop-common/filesystem/introduction.html#Object_Stores_vs._Filesystems |
脉脉上老哥的解答
对于hdfs这种的fs而言,rename和list操作很快,而s3作为KV存储,rename和list操作很慢,因此s3使用了dynamodb使用了索引对齐做加速,尤其是rename操作,s3的rename等于copy+delete
4.s3协议的区别#
|Generation|Usage|Description
|First|s3:\|s3 which is also called classic (s3: filesystem for reading from or storing objects in Amazon S3 This has been deprecated and recommends to use either the second or third generation library.
|Second|s3n:\|s3n uses native s3 object and makes easy to use it with Hadoop and other files systems.
|Third|s3a:\|s3a – This is a replacement of s3n which supports larger files and improves in performance.
在EMR中,还是建议使用s3协议
s3和cdh hdfs之间数据迁移,参考
1 | http://bdlabs.edureka.co/static/help/topics/cdh_admin_distcp_data_cluster_migrate.html |
HDP的s3 guide
1 | https://docs.cloudera.com/HDPDocuments/HDP3/HDP-3.0.0/bk_cloud-data-access/content/s3-get-started.html |
s3常用命令,参考:
1 | https://docs.aws.amazon.com/zh_cn/cli/latest/userguide/cli-services-s3.html |
5.常用命令#
1.安装awscli
1 | pip install awscli |
版本
1 | aws --version |
有些在CDH的s3自动安装的awscli版本可能会过低,导致一些命令不支持,比如
1 | aws --version |
在~/.aws目录下配置region和账号密码
1 | ~/.aws$ ls |
config
1 | [default] |
credentials
1 | [default] |
2.查看文件夹
1 | aws s3 ls s3://xxxxx/logs/ |
- 递归删除s3文件夹
1 | aws s3 rm --recursive s3://xxxxx/logs/test |
4.下载对象存储的前1024个字节的文件
1 | aws s3api get-object --bucket {bucket-name} --key xxx/xxx/xxx_log/2021-09-22/xx-xx.gz --range bytes=0000-1024 my_data_range |
5.下载s3文件到本地
1 | aws s3 cp s3://{bucket_name}/xxxx/xx/xxxx/2021-10-21/00/xxxxx.bin.gz ./ |
6.上传文件到s3
1 | aws s3 cp ~/test.json s3://xxx-bucket/new_dic/ |