2014年6月19日木曜日

(備忘) Amazon AWSを使ってのMapReduce -第1章

Elastic Map Reduce(EMR)を使って簡単な集計をしたときのメモ。
使用データは、wikipediaのtraffic を集めたwikistatsデータ。公になっているデータでサイズは150GBです。
(http://aws.amazon.com/datasets/6025882142118545)

結構調べながらやったこともあり、週末かかりました。もう一度はできないので、メモします。


第一章: データの準備


参考URL
http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/using-public-data-sets.html


1) Amazon EBS Snapshotのコピー

正直なんのこっちゃって感じでしたが、どうやらデータは、Amazon Elastic Block Store(EBS)でサポートされており、EBCとは仮想の外付けHDDのようなものだと理解しています。そして、Amazonが公開しているフリーのデータの多くは、EBCに格納されているようです。

1. まず初めにAWSのマネジメントコンソールから、EC2のページに行きます。

2. 右にあるツールバーから「Snapshots」を選び、 wikistatsのsnapshots ID (US Snapshot ID (Linux/Unix):snap-f57dec9a) を表示させます。EBSはRegion(Virgnia、N. Carifornia, Oregon, Tokyoなどなど)によって分かれており、wikistatsデータは、Virgniaにありました。なので、表示されなかったら、RegionがVirgniaになっているか確認します。

3. N.Virgniaから自分の最寄りのRegionにコピーします(「Actions」から「Copy」を選択すると、ポップアップでどこにコピーするか聞いてきます)。

4. コピーし終わったら、Create Volumeします。

5. 続いて、EC2のインスタンスを起動します。EBSは”外付けHDD"なので、バーチャルマシンであるEC2インスタンスからアクセスすることになります。EC2を立ち上げるときに、コピーで作ったSnap ShotのIDを入力すると、インスタンスが起動したときに、認識してくれます。


6. EC2が起動したら、Snapshotをマウントします。SSHでEC2のインスタンスにログインして、以下を実行します(ec2-userでログインしているが、rootで作業したいのでsudo suします)

$sudo su
#mkdir /mnt/wikidata
#mount /dev/xvdf1/ /mnt/wikidata

ここまで準備の準備・・・・続いて、マウントしたデータをS3にデータを移します。


2) EC2からS3へデータの転送


1) EC2にSSHログインして、sudo suしたら、便利ツール「s3cmd」をインストールします。そして、s3cmd --configure でセッティング。 Access Key、Secret Keyを聞かれますので、AWSのマネジメントコンソール右上のログイン名をクリックし、Security Credentialから確認できます。
$sudo su
#yum --enablerepo=epel install s3cmd
#s3cmd --configure
2) そして、S3でバケット(フォルダ)を用意します。作ったバケットにデータをコピーしていきます。というのも、EMRはS3からデータを読み込むので、ここにインプットするデータを置いておきたいわけです。


3)さて、いよいよデータをEC2からS3に転送します。以下のコマンドでいけるはずです。
#cd /your path to wikistats data/
#s3cmd put --recursive /mnt/wikidata/wikistats/ s3://<your bucket>/wikidata/

それにしても、150GB、約2000のgzipファイルをコピーするので、めちゃ時間かかる・・・

これ以外のs3cmdの用法は、こちら(http://s3tools.org/usage)


(おまけ)

転送中にまさか!!・・・途中でエラーが出てファイルの一括アップロードが止まりました。残り961ファイル・・・そこで、残りのファイルのリストを作り、Perlでs3cmd putを呼び出すone linerコードを準備しました。遠い昔にやった、Perl one linerの記憶を便りに検索しまくりました。。。

#まず、残ったファイルのリストをテキストファイルで保存
ls /mnt/wikidata/wikistats/ | cat | tail -n 961 > filelist.txt

#そして、Perl one-linerで残ったファイルを転送
perl -nle '$from = "s3cmd put /mnt/wikidata/wikistats/".$_; $to = " s3://<your bucket>/wikidata/wikistats/".$_; $cmd = $from.$to; system($cmd);' filelist.txt

ちょっとつかれたので、続きは次回!