Hadoopで処理を実装してみる──Hadoop Streamingでの処理、script-runner.jarの使い方:きょうから試せる Hadoop“スモールスタート”ガイド(8)(2/4 ページ)
実際にHadoopで処理を実装していきながら「Hadoopは、誰にだって扱える」を体感しましょう。今回は、「MapperやReducerから特定のファイルを参照」「Hadoop Streamingでの処理」「script-runner.jarの使い方」など、Hadoopで処理を実装する初歩の手順を解説します。
Hadoop Streamingで処理を実装する
HadoopではMapフェーズ、Shuffleフェーズ、Reduceフェーズの順で処理が行われます(第2回「『Hadoopの処理の流れ』を理解し、実践する」を参照)。ここで重要なルールは、Mapフェーズの出力は「"key<タブ>value"という形式で行えば、同じkeyのデータは必ず同じReducerに渡される」というものでした。
そのこと忘れずに、実際にHadoopで処理を実装していきましょう。
検索キーワードランキングを生成する
まずは、例として検索キーワードランキングを生成する場合を考えてみましょう。短い期間での計算であればもちろんリレーショナルデータベースを使って計算した方が簡単で早いですが、長期間での計算となれば(データ量にもよりますが)Hadoopで計算した方が良いのではないかと思います。
例えば入力データとしては以下のような、検索キーワードとユーザIDで構成されているログが流れてくるとします。
ナス,193032 お弁当,39110 きゅうり,1039001 カレー 豚肉,90123 ズッキーニ,82919 パスタ トマト,1281032 からあげ,72920 じゃがいも キャベツ,402918 トマト,2101302 ナス ピーマン,822924 お弁当 おかず,291038 きゅうり サラダ,224703 豚肉 たまねぎ,90123 ハンバーグ,1038733 たいやき,547291 トマト,392018 お弁当 ウインナー,39110 にんじん カレー,382027 キャベツ,1039200 なす トマト,2101302 卵 スープ,191938 ...
検索キーワードはスペースで区切られて複数のキーワードが指定されている場合もあり、それらは別々のキーワードとしてカウントするものとします。
Mapper、Reducerはこのようになります。
keyword_counter = Hash.new {|h,k| h[k] = 0 } ARGF.each do |log| log.chomp! keyword, user_id = log.split(',') keywords = keyword.split(' ') keywords.each do |keyword| keyword_counter[keyword] += 1 keyword_counter['__TOTAL__'] += 1 end end keyword_counter.each do |keyword, count| puts "#{keyword}\t#{count}"end end
keyword_counter = Hash.new {|h,k| h[k] = 0 } previous_keyword = nil ARGF.each do |log| log.chomp! keyword, count = log.split(/\t/) if keyword == previous_keyword keyword_counter[keyword] += count.to_i else if previous_keyword puts "#{previous_keyword}\t#{keyword_counter[previous_keyword]}" end previous_keyword = keyword keyword_counter[keyword] += count.to_i end end puts "#{previous_keyword}\t#{keyword_counter[previous_keyword]}"
手元でこのようにして動作確認が取れたら、入力データやMapper、ReducerはS3に上げておきます。
ではHadoopで処理してみましょう。まずEMRクラスタを起動します。
ここに先ほどのMapper、Reducerでステップを追加します。
このような結果が出力されるはずです。__TOTAL__は全検索回数を表します。
__TOTAL__ 32 おかず 1 お弁当 3 からあげ 1 きゅうり 2 じゃがいも 1 たいやき 1 たまねぎ 1 なす 1 にんじん 1 ウインナー 1 カレー 2 キャベツ 2 サラダ 1 スープ 1 ズッキーニ 1 トマト 4 ナス 2 ハンバーグ 1 パスタ 1 ピーマン 1 卵 1 豚肉 2
これで確かに欲しいデータは得られたわけですが、まだいくつか問題があります。
- 結果がReducerの数だけ複数のファイルに分割されていて、扱いにくい
- ランキング順に並び替えたい
などです。それならば、EMRで出力されたファイルを連結して、それを並び替えてあげれば良さそうです。そういった処理を行うにはどうしたら良いのでしょうか。
Copyright © ITmedia, Inc. All Rights Reserved.
関連記事
- もし、あなたが「“ビッグデータプロジェクト”を任せる。何とかするように」と言われたら
「ビッグデータプロジェクトを始めることになった」ら、具体的に何をするのか。本連載は、「ビッグデータプロジェクトの“進め方”」を業務視点/ビジネス視点の両面から体系的に理解し、具体的に実践していく方のためのナレッジアーカイブです。第1回目は、「ビッグデータとは何か」の基礎と、「ビッグデータ基盤の概要とメリット」を解説します。 - Hadoopは「難しい・遅い・使えない」? 越えられない壁がある理由と打開策を整理する
ブームだったHadoop。でも実際にはアーリーアダプター以外には、扱いにくくて普及が進まないのが現状だ。その課題に幾つかの解決策が出てきた。転換期を迎えるHadoopをめぐる状況を整理しよう。 - いまさら聞けないHadoopとテキストマイニング入門
Hadoopとは何かを解説し、実際にHadoopを使って大規模データを対象にしたテキストマイニングを行います。テキストマイニングを行うサンプルプログラムの作成を通じて、Hadoopの使い方や、どのように活用できるのかを解説します - 欧米の金融業界は今、どうHadoopを活用しているか
Hadoopは、欧米の金融関連サービス業界でどう活用されているか。米Hortonworksの金融サービス業界担当ゼネラルマネージャーへのインタビューで得た情報を、2回に分けてお届けする。今回は金融業界におけるHadoopのユースケースを概観する。