s3、s3n、s3a 的关系
s3 是最老版本的一个 S3 实现,s3n(各个 hadoop 版本都有)是基于 jets3t 的一个 native 的 S3 实现方案,s3a(2.7 版本以后)是功能最全,最完善的一个 S3 实现。
如果想要灵活地控制 endpoint 之类的参数,首选当然是 s3a,不行的情况下,s3n 也是可以工作的。
hadoop2.6
对于 hadoop2.7 以前的版本,通过 jets3t 读写 s3。如果使用 s3/s3a 去读写的话,会发现 hadoop2.6 使用的是 S3 signature-v2,而 ceph luminous 版本开始就只支持 v4了。此外,hadoop2.6 的 s3/s3a 不支持配置 endpoint。
首先在 /etc/hadoop/conf 目录下放置 jets3t.properties 配置文件,自定义相关的参数:
# s3的地址,填写ceph的内网地址192.168.1.22
s3service.s3-endpoint=[ceph地址]
# 不适用https协议
s3service.https-only=false
s3service.s3-endpoint-http-port=80
#s3service.s3-endpoint-https-port=8080
# 不适用带bucket名的域名
s3service.disable-dns-buckets=true
然后使用如下的命令读写
hdfs dfs -Dfs.s3n.awsAccessKeyId=[access key] -Dfs.s3n.awsSecretAccessKey=[secret key] -ls s3n://bucket-name
虽然可以读写,然后不能使用 distcp,因为 distcp 需要跨节点保持 session,hadoop2.6 的版本还不能支持。
hadoop2.7+
haodop2.7+ 的版本就容易很多了,直接使用以下命令即可实现跨集群复制:
hadoop distcp -Dfs.s3a.access.key=[access key] -Dfs.s3a.secret.key=[secret key] -Dfs.s3a.endpoint=[oss address] -Dfs.s3a.path.style.access=true -Dfs.s3a.connection.ssl.enabled=false /tmp/tmp.txt s3a://bucket-name/