要件のニッチさがすごい気はするけどドハマりしたので。
EMRのhadoopのバージョン(正確にはjets3tのバージョン)があがれば特に苦労せん気もするけどね。
ただ、apache的にはs3://は非推奨で、EMR的にはs3://推奨というおっぺけぺーな状態ではあるので今後どうするべきかはまた別個の話になるかねえ。
というわけで本題。
「s3上でkmsにてserver side encryptionされているorcファイルを入力としてmapreduceを動かし、同じくkmsでs3に吐き出す」
細かい部分はぐぐれば出てくるので、重要な部分だけを。
・EMRのcore-site
{
"classification":"core-site",
"properties":{
"fs.s3.awsAccessKeyId":"access key",
"fs.s3.impl":"com.amazon.ws.emr.hadoop.fs.EmrFileSystem",
"fs.s3.awsSecretAccessKey":"secret key"
},
"configurations":[]
}
アクセスキーとシークレットキーのほかにfs.s3.implを設定する。
custom jar側のconfに設定してもいけるみたいだけど未検証。
・java側
よく見かけるアレ、
conf.set("fs.s3n.impl", "org.apache.hadoop.fs.s3native.NativeS3FileSystem");
conf.set("fs.s3n.awsAccessKeyId", "access key");
conf.set("fs.s3n.awsSecretAccessKey", "secret key");
こいつを
//conf.set("fs.s3n.impl", "org.apache.hadoop.fs.s3native.NativeS3FileSystem");
conf.set("fs.s3.awsAccessKeyId", "access key");
conf.set("fs.s3.awsSecretAccessKey", "secret key");
こうする。要するに、impl設定を外して、s3nになってたらs3にする。
もちろんコメントアウトでなくて削除でも問題なし。
addInputPathとかsetOutputPathに渡すPathも、
FileInputFormat.addInputPath(jobConf, new Path("s3://bucket/key"));
みたいにs3nでなくs3にする。
これでいけました。
Emrでのhadoop実行がどのように実施されているか、をちゃんと知っていればハマらなかったのかもしれない。