連載
» 2017年02月21日 05時00分 公開

Hadoopの疑似分散モードと完全分散モードを試すきょうから試せる Hadoop“スモールスタート”ガイド(4)(2/4 ページ)

[佐々木達也,著]

Hadoop処理の実行

 疑似分散モードではスタンドアロンモードとは違い、ファイルシステムとしてHDFSを利用します。先ほどのstart-all.shの実行でネームノードが起動したため、以下のコマンドでHDFSの中身を見ることができるはずです。

 hadoop fs [コマンド]でHDFS上のファイル操作が行えます。ちなみにhadoop dfs [コマンド]という表記も見かけるのでややこしいのですが、どちらもまったく同じ動作となります※8。ただし、HDFSは分散ファイルシステムなので、このディレクトリ(/tmp)はあくまでも仮想的なものです。Linux上のファイルパスには存在しない仮想ディレクトリなので注意してください。

 ※8 (参考リンク)Differnce between `hadoop dfs` and `hadoop fs` - Stack Overflow


 では、先ほどのスタンドアロンモードのときに利用したインプットファイルをHDFS上に配置してみましょう。

 すると、このような状態でインプットデータが作成されます。HDFS上のパスを相対パスで指定すると/user/hadoop以下を指定したものと見なされます。

 コマンドは他には以下のようなものが利用できます。

hadoop fsのコマンド(一部)
コマンド 引数1 引数2 説明
-ls <path> HDFS上のファイルやディレクトリの情報を表示する
-lsr <path> HDFS上のディレクトリの情報を再帰的に表示する
-rm <path> HDFS上の指定したファイルを削除できる
-rmr <path> HDFS上の指定したディレクトリを再帰的に削除できる
-touchz <path> HDFS上に空ファイルを作成する
-mkdir <path> HDFS上にディレクトリを作成する
-cp <src> <dest> HDFS上でファイルをコピーする
-mv <src> <dest> HDFS上でファイルを移動する
-put <localsrc> <dst> ローカルにあるファイルをHDFS上に配置する
-get <src> <localdst> HDFS上にあるファイルをローカルにコピーする
-getmerge <src> <localdst> HDFS上のディレクトリを指定すると、その中のファイルを連結した結果をローカルにコピーする
-cat <path> HDFS上のファイルを標準出力する

 他にもいろいろなコマンドが使えるので、ぜひヘルプを確認してみてください。以下のコマンドでヘルプが確認できます。

 では、スタンドアロンモードのときと同様に、例としてワードカウントを動かしてみましょう。実行するコマンドはまったく同じですが、疑似分散モードではinputとoutputがHDFS上のファイルパスを参照している点が違います。スタンドアロンモードのときにも説明しましたが、outputディレクトリが存在するとエラーになってしまうので注意してください。今回はHDFS上にoutputディレクトリが作成されるので、HDFS上のoutputディレクトリを削除する必要があります。

 ※9 HDFS上にoutputディレクトリが存在しない場合には省略可能です


 HDFS上のoutputディレクトリに出力された結果ファイルを見てみましょう。正しくワードカウントできていることがわかります。

 もちろんHadoop Streamingを使って処理を書くこともできます。例えばRubyで同じようにワードカウントしてみましょう。ちゃんとHadoop Streamingで処理されていることがわかるように、各ワードを大文字にしてからカウントするものとします。

 MapperとReducerを用意します。それぞれは以下のような内容となっています。

mapper.rb
ARGF.each_line do |line|
  line.chomp!
  words = line.split(' ')
  words.each do |word|
    puts "#{word.upcase}\t1"
  end
end
reducer.rb
counter = Hash.new {|h,k| h[k] = 0 }
 
ARGF.each_line do |line|
  line.chomp!
  word, num = line.split(/\t/)
  counter[word] += num.to_i
end
 
counter.each do |word, counter|
  puts "#{word}\t#{counter}"
end

 とてもシンプルな処理です。これを早速Hadoop Streamingで実行したいところですが、Hadoopでの処理は簡単なものであってもタスクトラッカーの起動などでどうしても時間が掛かってしまうので、必ず事前にローカル環境でデバッグを行うようにしてください。Hadoop環境でデバッグまで行うのは時間も掛かるし大変です。

 Hadoop Streaming用に作成したスクリプトは標準入出力を受け付けるようにして書いているはずなので、このようにパイプで繋げれば簡単に動作確認することができます。今回の例はそもそもデータ量が少ないので問題はありませんが、データ量が多い場合には入力データを制御して小さなデータ量で試すようにすると良いでしょう。

 エラーもなくきちんと結果が出力されるようになったら、このMapperとReducerを使ってHadoop Streaingで処理を実行してみましょう。このようなコマンドとなります。

 ※10 今回、rvm(Ruby Version Manager)を使ったため指定していますが、通常は必要ありません


 結果はこのようになり、正しくカウント出来ていることがわかります。

 なお、デーモンの停止はstop-all.shというシェルスクリプトから行えます。

 また、HDFSを一度まっさらな状態にしたいこともあるかと思いますが、そういう場合にはデーモンを一旦停止し、/tmp/hadoop-hadoopディレクトリを削除して、その後HDFSをフォーマットしてから再度デーモンを起動するようにしてください。

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。