2011年1月10日月曜日

Hadoop fs shell コマンド

年があけました. 今年もよろしくお願いします.

UNIXというものに触れ始めてからようやく4ヶ月程度たちました.
なぜこんなことになったかというと結局ちまたで話題のHadoopのせいです.

tipsなどが日本語でまとまってあまり見当たらないのでやっていることはまとめておきます.

まずはhadoop ファイルシステム(fs)のシェルコマンドをまとめ.

Hadoop fs -*

ファイル表示 -ls, -lsr
$ hadoop fs -ls
Found 1 items
drwxr-xr-x   - hadoop supergroup          0 2010-11-05 11:28 /user/hadoop/tera_1000
$ hadoop fs -ls /user/kimura/
Found 5 items
drwxr-xr-x   - hadoop supergroup          0 2010-12-06 15:31 /user/output
drwxr-xr-x   - hadoop supergroup          0 2010-12-06 16:27 /user/output1
drwxr-xr-x   - hadoop supergroup          0 2010-12-06 17:29 /user/output2
drwxr-xr-x   - hadoop supergroup          0 2010-12-07 09:38 /user/output3
drwxr-xr-x   - hadoop supergroup          0 2010-12-07 09:41 /user/output4
$ hadoop fs -lsr /user/output1/
drwxr-xr-x   - hadoop supergroup          0 2010-12-06 16:27 /user/output1/_logs
drwxr-xr-x   - hadoop supergroup          0 2010-12-06 16:27 /user/output1/_logs/history
-rw-r--r--   2 hadoop supergroup      17010 2010-12-06 16:27 /user/output1/_logs/history/c1-m01_1291256668975_job_xxxxx_conf.xml
-rw-r--r--   2 hadoop supergroup      27483 2010-12-06 16:27 /user/output1/_logs/history/c1-m01_1291256668975_job_xxxxx_hadoop_test
ディレクトリを指定することで見れる. -lsrは再帰的なファイル表示.
いちいちhadoop fs -ls ディレクトリ名として打たないといけない(tabも効かないorz) このシーンでは
-lsrはけっこう便利である.

ファイル操作:移動, コピー, 削除 ;mv, cp, rm...
$ hadoop fs -mv /user/output1 /user/test1
$ hadoop fs -ls /user/
Found 5 items
drwxr-xr-x   - hadoop supergroup          0 2010-12-06 15:31 /user/output
drwxr-xr-x   - hadoop supergroup          0 2010-12-06 17:29 /user/output2
drwxr-xr-x   - hadoop supergroup          0 2010-12-07 09:38 /user/output3
drwxr-xr-x   - hadoop supergroup          0 2010-12-07 09:41 /user/output4
drwxr-xr-x   - hadoop supergroup          0 2010-12-06 16:27 /user/test1
$ hadoop fs -rm /user/test1.txt
Deleted hdfs://xxxx/user//test1.txt
$ hadoop fs -rmr /user/test1
Deleted hdfs://xxxx/user/test1
このへんはUNIXの普通のファイルシステムの操作と同じである. -rmrはディレクトリの削除.
質問なしでいっきにディレクトリを消されるので注意.
hadoop MapReduceのように, outputのディレクトリを勝手に作られてしまう操作では,
テストするたびにディレクトリがどんどんできていくので, テスト実行してディレクトリ丸ごと削除は便利である.

ファイル中身表示: -cat, -tail
$ hadoop fs -cat /user/test1.txt
test
$ hadoop fs -tail /public/itpro/log_finish.txt
P/1.1" 200 4780
110.0.215.26 - - [28/Jan/2010:11:59:47 +0900] "GET /article/COLUMN/20090403/327762/?ST=lin-os&P=1 HTTP/1.1" 200 24872
110.0.134.240 - - [28/Jan/2010:11:59:48 +0900] "GET /article/COLUMN/20060228/231125/ HTTP/1.0" 200 24213
110.0.188.192 - - [28/Jan/2010:11:59:53 +0900] "GET /linux/backnum/199912/article/article_corel.shtml HTTP/1.1" 200 21881
110.0.169.231 - - [28/Jan/2010:11:59:54 +0900] "GET /article/COLUMN/20060224/230573/?ST=oss HTTP/1.1" 200 82220
110.0.163.203 - - [28/Jan/2010:11:59:54 +0900] "GET /article/COLUMN/20060227/230729/?ST=oss HTTP/1.1" 200 27778
110.0.147.216 - - [28/Jan/2010:11:59:58 +0900] "GET /article/COLUMN/20060227/230691/?ST=oss HTTP/1.1" 200 25140
110.0.169.231 - - [28/Jan/2010:11:59:58 +0900] "GET /article/COLUMN/20060227/230896/?ST=oss HTTP/1.1" 200 38033
110.0.169.231 - - [28/Jan/2010:12:00:00 +0900] "GET /article/COLUMN/20060227/230875/?ST=oss HTTP/1.1" 200 41170
110.0.85.59 - - [28/Jan/2010:12:00:00 +0900] "GET /article/COLUMN/20060228/231082/ HTTP/1.1" 200 27409
-head などはないが, -tailでファイル後ろ1kB分を表示する. 軽くみたいときに便利.
ペタ, テラ級のインプットに対し, いきなりプログラムを実行するのは無駄なので,

hadoop fs -cat xxx | head -100 > sampleinput.txt 
などでサンプルインプットを作ってから実行を推奨. UNIXでパイプで結果を渡すことはできるので.
あと, 余談だがhadoop fs コマンドラインでは*(アスタリスク)が効く.

ディスク容量, ファイルサイズ表示: -du -df
$ hadoop fs -df
Filesystem  Size Used Avail Use%
/  11597229867008 4592012775424 6422221864960 39%
$ hadoop fs -du /user/
Found 6 items
44492       hdfs://xxxx/user/output
44502       hdfs://xxxx/user/output2
88556       hdfs://xxxx/user/output3
88531       hdfs://xxxx/user/output4
44493       hdfs://xxxx/user/test1
5           hdfs://xxxx/user/test1.txt

ファイル転送: -copyToLcal, -get, -copyFromLocal, -put
$ hadoop fs -copyToLocal /user/test1.txt ~/workspace/test
$ ls test
test1.txt
$ hadoop fs -get /user/test1.txt ~/workspace/test
$ ls test
test1.txt
$ hadoop fs -copyFromLocal test1.txt /user/
$ hadoop fs -ls /user/
Found 5 items
drwxr-xr-x   - hadoop supergroup          0 2010-12-06 15:31 /user/output
drwxr-xr-x   - hadoop supergroup          0 2010-12-06 17:29 /user/output2
drwxr-xr-x   - hadoop supergroup          0 2010-12-07 09:38 /user/output3
drwxr-xr-x   - hadoop supergroup          0 2010-12-07 09:41 /user/output4
-rw-r--r--   2 hadoop supergroup          5 2010-12-07 10:35 /user/test1.txt
$ hadoop fs -put test1.txt /user/
$ hadoop fs -ls /user/
Found 6 items
drwxr-xr-x   - hadoop supergroup          0 2010-12-06 15:31 /user/output
drwxr-xr-x   - hadoop supergroup          0 2010-12-06 17:29 /user/output2
drwxr-xr-x   - hadoop supergroup          0 2010-12-07 09:38 /user/output3
drwxr-xr-x   - hadoop supergroup          0 2010-12-07 09:41 /user/output4
drwxr-xr-x   - hadoop supergroup          0 2010-12-06 16:27 /user/test1
-rw-r--r--   2 hadoop supergroup          5 2010-12-07 10:06 /user/test1.txt

-copyToLocal, -getはhdfsからファイルを現在のクライアントのローカルへコピーする.
逆に-copyFromLocal, -putはローカルからhdfsへコピーする.

その他
あとchmod等色々あるが, 基本的にUNIXのコマンドはhadoop fs -*とすれば使えることが多い.
コマンド一覧は以下のとおり.
$hadoop fs                                                                      [~]
Usage: java FsShell
           [-ls ]
           [-lsr ]
           [-df []]
           [-du [-s] [-h] ]
           [-dus ]
           [-count[-q] ]
           [-mv  ]
           [-cp  ]
           [-rm [-skipTrash] ]
           [-rmr [-skipTrash] ]
           [-expunge]
           [-put  ... ]
           [-copyFromLocal  ... ]
           [-moveFromLocal  ... ]
           [-get [-ignoreCrc] [-crc]  ]
           [-getmerge   [addnl]]
           [-cat ]
           [-text ]
           [-copyToLocal [-ignoreCrc] [-crc]  ]
           [-moveToLocal [-crc]  ]
           [-mkdir ]
           [-setrep [-R] [-w]  ]
           [-touchz ]
           [-test -[ezd] ]
           [-stat [format] ]
           [-tail [-f] ]
           [-chmod [-R]  PATH...]
           [-chown [-R] [OWNER][:[GROUP]] PATH...]
           [-chgrp [-R] GROUP PATH...]
           [-help [cmd]]

Generic options supported are
-conf      specify an application configuration file
-D             use value for given property
-fs       specify a namenode
-jt     specify a job tracker
-files     specify comma separated files to be copied to the map reduce cluster
-libjars     specify comma separated jar files to include in the classpath.
-archives     specify comma separated archives to be unarchived on the compute machines.

>>apache hadoopの公式ページ
http://hadoop.apache.org/common/docs/r0.18.3/hdfs_shell.html

も参考に.

hadoopの仕組み, MapReduce, その他のモジュールについてもまた別途書いていきたいと思います.