実際にHadoopで処理を実装していきながら「Hadoopは、誰にだって扱える」を体感しましょう。今回は、「MapperやReducerから特定のファイルを参照」「Hadoop Streamingでの処理」「script-runner.jarの使い方」など、Hadoopで処理を実装する初歩の手順を解説します。
書籍の中から有用な技術情報をピックアップして紹介する本シリーズ。今回は、秀和システム発行の書籍『Hadoopファーストガイド(2012年9月20日発行)』からの抜粋です。
ご注意:本稿は、著者及び出版社の許可を得て、そのまま転載したものです。このため用字用語の統一ルールなどは@ITのそれとは一致しません。あらかじめご了承ください。
今回は、実際にMapperやReducerを書くときに知っておくべきことについて説明します。MapperやReducerから特定のライブラリを利用したり、ファイルを読み込んだりするにはどうしたら良いのでしょうか。
例えばユーザの中から特定の都道府県に住んでいるユーザだけを抽出したい場合、外部ファイルを利用する必要があると思います。ログに出力されているのはユーザID程度で都道府県情報までは出力されていないと思うので、ユーザIDと都道府県のマッピングデータを別途用意して、それと照らし合わせる必要があるでしょう。
こういった場合に、マッピングデータをどのようにEMRクラスタに渡したら良いのか、という話です。そのために使えるオプションとして、--cacheオプションや--cache-archiveオプションがあります。
オプション | 説明 | 例 | |
---|---|---|---|
--cache CACHE_FILE | キャッシュにロードすべきファイルを指定する | s3n://mybucket/hoge#hoge | |
--cache-archive CACHE_FILE | キャッシュにアンパックすべきファイルを指定する | s3n://mybucket/sample.jar | |
では、実際に--cacheオプションを使ってファイルを渡しつつ処理を行ってみましょう。以下のような入力データ、マッピングデータ、Mapperを用意し、それぞれを「s3n://sasata299/input/input」「s3n://sasata299/files/test.txt」「s3n://sasata299/mappers/mapper.rb」に配置しました。Mapperを見るとわかりますが、マッピングデータに存在するデータは数字に変換してから出力し、存在しないデータはそのまま出力するという簡単な処理です。
aaa bbb ccc ddd eee fff
aaa,1 bbb,2 ccc,3
mapping_data = {} File.open('hoge') {|f| # マッピングデータを開く f.each_line do |line| line.chomp! keyword, number = line.split(',') mapping_data[keyword] = number end } ARGF.each_line do |line| line.chomp! if mapping_data && mapping_data[line] puts mapping_data[line] else puts line end end
実行する際のコマンドはこのようになります。まずはEMRクラスタを起動しましょう。
その後、ステップを追加するわけですが、そのときに--cacheオプションを使って任意のファイルをEMRクラスタ上に配置します。このようなコマンドとなります。
--cacheオプションは少し特殊な書き方で、s3n://sasata299/files/test.txt#hogeのように<s3のファイルパス>#<シンボリックリンク名>の形で指定します※4。MapperやReducerからこのマッピングデータを参照したいときにはこのシンボリックリンク名でアクセスすることになります。
※4 もちろん実際のファイル名とシンボリックリンク名が同じでも構いません
今回利用したMapperでもFile.open('hoge')として、hogeという名前のファイルに対して操作しています。なお、Reducerは利用しなかったのでNONEを指定しました。
実際、こういったファイルはどのように展開され、MapperやReducerからどのように参照されるのでしょうか。実は--cacheで指定したファイルやMapper、Reducerは各EMRクラスタ上の「/mnt/var/lib/hadoop/mapred/taskTracker/hadoop/distcache」ディレクトリ以下に展開され、作業ディレクトリである「/mnt/var/lib/hadoop/steps/x」からそれらのファイルに対してシンボリックリンクが張られます。このとき、--cacheオプションで指定したファイルに関しては、#の後ろに指定したシンボリックリンク名でシンボリックリンクが張られるというわけです。
MapperやReducerから#の後ろに指定した名前で参照できる理由がわかっていただけたでしょうか。これらのファイルは処理が実行されている間のみシンボリックリンクが張られていて、処理が完了すると削除されてしまうので注意してください※5。
※5 処理が実行されていないときはtmpディレクトリのみ存在します
最終的に出力されたファイルを見れば、マッピングデータを使って処理が行われたことが確認できます。マッピングデータに存在しないデータはそのまま出力されていますね。
3 ddd fff 1 eee 2
--cacheオプションと似ていますが、もうひとつ--cache-archiveオプションというものもあります。これは例えば特定のlibディレクトリ以下をjarファイルとして固めておけば、それを--cache-archiveオプションで指定することで、各サーバに配布後それぞれのサーバで展開して中身のライブラリを利用できるようになるというものです。
例えば、あるlibディレクトリをMapperやReducerから利用したい場合にはまずこのディレクトリをjarに圧縮します。
これをS3上に配置します。MapperやReducerから例えばsampleという名前で参照したいとするとこのようなコマンドを実行してください。
--cacheオプションのときと同様に、#の後ろに指定したシンボリックリンク名でシンボリックが張られるので、それを使ってローカルと同じようにさまざまな処理を行うことが可能です。例えばlibディレクトリの中にあるhoge.rbをMapperやReducerから使いたいときには、sample/hoge.rbのようにアクセスするというわけです。
Copyright © ITmedia, Inc. All Rights Reserved.