Hadoopで処理を実装してみる──Hadoop Streamingでの処理、script-runner.jarの使い方:きょうから試せる Hadoop“スモールスタート”ガイド(8)(1/4 ページ)
実際にHadoopで処理を実装していきながら「Hadoopは、誰にだって扱える」を体感しましょう。今回は、「MapperやReducerから特定のファイルを参照」「Hadoop Streamingでの処理」「script-runner.jarの使い方」など、Hadoopで処理を実装する初歩の手順を解説します。
書籍の中から有用な技術情報をピックアップして紹介する本シリーズ。今回は、秀和システム発行の書籍『Hadoopファーストガイド(2012年9月20日発行)』からの抜粋です。
ご注意:本稿は、著者及び出版社の許可を得て、そのまま転載したものです。このため用字用語の統一ルールなどは@ITのそれとは一致しません。あらかじめご了承ください。
MapperやReducerから特定のファイルを参照する
今回は、実際に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オプション
では、実際に--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-archiveオプション
--cacheオプションと似ていますが、もうひとつ--cache-archiveオプションというものもあります。これは例えば特定のlibディレクトリ以下をjarファイルとして固めておけば、それを--cache-archiveオプションで指定することで、各サーバに配布後それぞれのサーバで展開して中身のライブラリを利用できるようになるというものです。
例えば、あるlibディレクトリをMapperやReducerから利用したい場合にはまずこのディレクトリをjarに圧縮します。
これをS3上に配置します。MapperやReducerから例えばsampleという名前で参照したいとするとこのようなコマンドを実行してください。
--cacheオプションのときと同様に、#の後ろに指定したシンボリックリンク名でシンボリックが張られるので、それを使ってローカルと同じようにさまざまな処理を行うことが可能です。例えばlibディレクトリの中にあるhoge.rbをMapperやReducerから使いたいときには、sample/hoge.rbのようにアクセスするというわけです。
関連記事
- もし、あなたが「“ビッグデータプロジェクト”を任せる。何とかするように」と言われたら
「ビッグデータプロジェクトを始めることになった」ら、具体的に何をするのか。本連載は、「ビッグデータプロジェクトの“進め方”」を業務視点/ビジネス視点の両面から体系的に理解し、具体的に実践していく方のためのナレッジアーカイブです。第1回目は、「ビッグデータとは何か」の基礎と、「ビッグデータ基盤の概要とメリット」を解説します。 - Hadoopは「難しい・遅い・使えない」? 越えられない壁がある理由と打開策を整理する
ブームだったHadoop。でも実際にはアーリーアダプター以外には、扱いにくくて普及が進まないのが現状だ。その課題に幾つかの解決策が出てきた。転換期を迎えるHadoopをめぐる状況を整理しよう。 - いまさら聞けないHadoopとテキストマイニング入門
Hadoopとは何かを解説し、実際にHadoopを使って大規模データを対象にしたテキストマイニングを行います。テキストマイニングを行うサンプルプログラムの作成を通じて、Hadoopの使い方や、どのように活用できるのかを解説します - 欧米の金融業界は今、どうHadoopを活用しているか
Hadoopは、欧米の金融関連サービス業界でどう活用されているか。米Hortonworksの金融サービス業界担当ゼネラルマネージャーへのインタビューで得た情報を、2回に分けてお届けする。今回は金融業界におけるHadoopのユースケースを概観する。
Copyright © ITmedia, Inc. All Rights Reserved.