2010年7月25日日曜日

Hadoop (4) Pigによる対話的操作


このエントリーをはてなブックマークに追加


Hadoopの標準インターフェース hadoop xx xxxx ってのは対話式じゃないので、ちょっと使いにくい。
PigはHadoopのサブプロジェクトで、Hadoopを対話的に操作することが可能なインターフェースと、 MapReduceを効率的に行うための専用言語環境を提供してくれる。
Yahoo!なんかでも使われているっぽい。
Pigの素晴らしいところは、LISPのREPLのように、書いたコードをその場で実行しながら確かめられること。




■事前準備
完全分散モードのHadoop環境が必要なので構築しておく。
Hadoop (3) 完全分散モード


■参考ページ
きりんさん日記 1台でHive, Pigを試してみる(Ubuntu + Cloudera)


(1)Pigの入手する
ftp://ftp.meisei-u.ac.jp/pub/www/apache/dist/hadoop/pig/
現時点での最新版は0.7

NamaeNodeで実施(例
[hadoop@hdp01 ~]$ cd
[hadoop@hdp01 ~]$ wget http://ftp.kddilabs.jp/infosystems/apache/hadoop/pig/stable/pig-0.7.0.tar.gz
[hadoop@hdp01 ~]$ tar zxvf /pig-0.7.0.tar.gz


(2)設定ファイルの編集
[hadoop@hdp01 ~]$ vi pig-0.7.0/conf/pig-env.sh
----------------------------------------------
export JAVA_HOME=/usr/java/default
export HADOOP_HOME=/home/hadoop/hadoop-0.20.2
export PIG_CLASSPATH=$HADOOP_HOME/conf
----------------------------------------------
基本的にはこれだけでよい。


(3)動かしてみる
-あまり考えることはない
[hadoop@hdp01 ~]$ pig-0.7.0/bin/pig
10/07/25 04:07:15 INFO pig.Main: Logging error messages to: /home/hadoop/pig_1279998435024.log
2010-07-25 04:07:15,350 [main] INFO org.apache.pig.backend.hadoop.executionengine.HExecutionEngine - Connecting to hadoop file system at: hdfs://hdp01.sol-net.jp:9000
2010-07-25 04:07:15,660 [main] INFO org.apache.pig.backend.hadoop.executionengine.HExecutionEngine - Connecting to map-reduce job tracker at: hdp01.sol-net.jp:9001
grunt>

-ヘルプを表示してみる。
grunt> help
Commands:
<pig latin statement>;
store <alias> into <filename> [using <functionSpec>]
dump <alias>
describe <alias>
kill <job_id>
ls <path>
du <path>
mv <src> <dst>
cp <src> <dst>
rm <src>
copyFromLocal <localsrc> <dst>
cd <dir>
pwd
cat <src>
copyToLocal <src> <localdst>
mkdir <path>
cd <path>
define <functionAlias> <functionSpec>
register <udfJar>
set key value
quit
-現在のパス
grunt> pwd
hdfs://hdp01.sol-net.jp:9000/user/hadoop

-カレントディレクトリのファイルを確認
grunt> ls
2010-07-25 04:07:42,430 [main] ERROR org.apache.pig.tools.grunt.Grunt - ERROR 2998: Unhandled internal error. File or directory null does not exist.
Details at logfile: /home/hadoop/pig_1279998435024.log

-ディレクトリ作成
grunt> mkdir input
grunt> ls
hdfs://hdp01.sol-net.jp:9000/user/hadoop/input  <dir>

-ローカルファイルのコピー
grunt> copyFromLocal /usr/share/doc/syslinux-3.11/pxelinux.doc input
grunt> ls input
hdfs://hdp01.sol-net.jp:9000/user/hadoop/input/pxelinux.doc<r 2>        14168

-中身の確認
grunt> cat input/pxelinux.doc
                               PXELINUX

    A bootloader for Linux using the PXE network booting protocol

                Copyright (C) 1994-2004 H. Peter Anvin
<<省略>>


(4)MapReduce処理
-参考ページ
大規模なデータセットを効率的に扱うための Pig 超入門

-構文のリファレンスはこちら
Pig Tutorial
Pig Latin Reference Manual 1
Pig Latin Reference Manual 2


-Word Countを実行してみる。

grunt> load_data = LOAD 'input/pxelinux.doc' USING PigStorage(' ') AS (row: chararray);
grunt> flated = FOREACH load_data GENERATE FLATTEN(TOKENIZE((chararray)$0));
grunt> grouped = GROUP flated BY $0;
grunt> counted = FOREACH grouped GENERATE COUNT (flated), group;
grunt> dump counted;
grunt> store counted into 'output/result.txt';

良く理解せずに実行したので、なんか結果が怪しかったデス。
dump ・・・結果をその場で表示。 store 結果をファイルに保存

もうちょっとどんな事ができるか研究するつもり。
後は、NameNode以外の周辺クライアントからHadoopを操作する方法も調査せねば。