tonglin0325的个人主页

aws s3原理和常用命令

1.概念#

Amazon s3全称Amazon Simple Storage Service,是一个对象存储,不是一个file system,所以在使用s3的时候,list dir会很慢

kv存储:从零开始写KV数据库:基于哈希索引

 

比如如下的s3路径

1
2
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
2
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
2
http://bdlabs.edureka.co/static/help/topics/cdh_admin_distcp_data_cluster_migrate.html

HDP的s3 guide

1
2
https://docs.cloudera.com/HDPDocuments/HDP3/HDP-3.0.0/bk_cloud-data-access/content/s3-get-started.html

s3常用命令,参考:

1
2
https://docs.aws.amazon.com/zh_cn/cli/latest/userguide/cli-services-s3.html

 

5.常用命令#

1.安装awscli

1
2
pip install awscli

版本

1
2
3
aws --version
aws-cli/1.18.143 Python/3.6.2 Linux/4.4.0-165-generic botocore/1.18.2

有些在CDH的s3自动安装的awscli版本可能会过低,导致一些命令不支持,比如

1
2
3
aws --version
aws-cli/1.4.2 Python/3.4.2 Linux/4.9.0-0.bpo.6-amd64

在~/.aws目录下配置region和账号密码

1
2
3
~/.aws$ ls
config credentials

config

1
2
3
[default]
region = ap-northeast-1

credentials

1
2
3
4
[default]
aws_access_key_id = XXXX
aws_secret_access_key = XXXX

2.查看文件夹

1
2
aws s3 ls s3://xxxxx/logs/

  1. 递归删除s3文件夹
1
2
aws s3 rm --recursive s3://xxxxx/logs/test

4.下载对象存储的前1024个字节的文件

1
2
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
2
aws s3 cp s3://{bucket_name}/xxxx/xx/xxxx/2021-10-21/00/xxxxx.bin.gz ./

6.上传文件到s3

1
2
aws s3 cp ~/test.json s3://xxx-bucket/new_dic/