Hadoopの疑似分散モードと完全分散モードを試す:きょうから試せる Hadoop“スモールスタート”ガイド(4)(2/4 ページ)
実際にHadoopで処理を実装していきながら「Hadoopは、誰にだって扱える」を体感しましょう。今回は「Hadoopの疑似分散モード」「完全分散モードでHadoopクラスタを構築する手順」を解説します。
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以下を指定したものと見なされます。
コマンドは他には以下のようなものが利用できます。
コマンド | 引数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を用意します。それぞれは以下のような内容となっています。
ARGF.each_line do |line| line.chomp! words = line.split(' ') words.each do |word| puts "#{word.upcase}\t1" end end
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.
関連記事
- もし、あなたが「“ビッグデータプロジェクト”を任せる。何とかするように」と言われたら
「ビッグデータプロジェクトを始めることになった」ら、具体的に何をするのか。本連載は、「ビッグデータプロジェクトの“進め方”」を業務視点/ビジネス視点の両面から体系的に理解し、具体的に実践していく方のためのナレッジアーカイブです。第1回目は、「ビッグデータとは何か」の基礎と、「ビッグデータ基盤の概要とメリット」を解説します。 - Hadoopは「難しい・遅い・使えない」? 越えられない壁がある理由と打開策を整理する
ブームだったHadoop。でも実際にはアーリーアダプター以外には、扱いにくくて普及が進まないのが現状だ。その課題に幾つかの解決策が出てきた。転換期を迎えるHadoopをめぐる状況を整理しよう。 - いまさら聞けないHadoopとテキストマイニング入門
Hadoopとは何かを解説し、実際にHadoopを使って大規模データを対象にしたテキストマイニングを行います。テキストマイニングを行うサンプルプログラムの作成を通じて、Hadoopの使い方や、どのように活用できるのかを解説します - 欧米の金融業界は今、どうHadoopを活用しているか
Hadoopは、欧米の金融関連サービス業界でどう活用されているか。米Hortonworksの金融サービス業界担当ゼネラルマネージャーへのインタビューで得た情報を、2回に分けてお届けする。今回は金融業界におけるHadoopのユースケースを概観する。