s3闷袒、s3n、s3a 的關(guān)系
s3 是最老版本的一個(gè) S3 實(shí)現(xiàn),s3n(各個(gè) hadoop 版本都有)是基于 jets3t 的一個(gè) native 的 S3 實(shí)現(xiàn)方案奏篙,s3a(2.7 版本以后)是功能最全,最完善的一個(gè) S3 實(shí)現(xiàn)迫淹。
如果想要靈活地控制 endpoint 之類的參數(shù)秘通,首選當(dāng)然是 s3a,不行的情況下敛熬,s3n 也是可以工作的肺稀。
hadoop2.6
對(duì)于 hadoop2.7 以前的版本,通過(guò) jets3t 讀寫 s3应民。如果使用 s3/s3a 去讀寫的話话原,會(huì)發(fā)現(xiàn) hadoop2.6 使用的是 S3 signature-v2,而 ceph luminous 版本開始就只支持 v4了诲锹。此外繁仁,hadoop2.6 的 s3/s3a 不支持配置 endpoint。
首先在 /etc/hadoop/conf 目錄下放置 jets3t.properties 配置文件归园,自定義相關(guān)的參數(shù):
# s3的地址黄虱,填寫ceph的內(nèi)網(wǎng)地址192.168.1.22
s3service.s3-endpoint=[ceph地址]
# 不適用https協(xié)議
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庸诱,因?yàn)?distcp 需要跨節(jié)點(diǎn)保持 session捻浦,hadoop2.6 的版本還不能支持。
hadoop2.7+
haodop2.7+ 的版本就容易很多了桥爽,直接使用以下命令即可實(shí)現(xiàn)跨集群復(fù)制:
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/