Hadoop HDFSコマンド実行メモ(0.20.1)

概要
公式ページにあるHDFS File System Shell Guideに書いてあるコマンドを、さらっと触ってみた際のコマンドログです。

# 全体のhelpを見る
$ bin/hadoop dfs -help

# コマンド単体のヘルプを見る
$ bin/hadoop dfs -help ls
-ls <path>:     List the contents that match the specified file pattern. If
                path is not specified, the contents of /user/<currentUser>
                will be listed. Directory entries are of the form
                        dirName (full path) <dir>
                and file entries are of the form
                        fileName(full path) <r n> size
                where n is the number of replicas specified for the file
                and size is the size of the file, in bytes.

# lsしてみる
$ bin/hadoop dfs -ls
ls: Cannot access .: No such file or directory.

# 実行した際に
# ipc.Client: Retrying connect to server: localhost/127.0.0.1:9000. Already tried 0 time(s).
# とか出た場合は
# 1. フォーマットをしていない($ bin/hadoop namenode -format)
# 2. Hadoopをスタートしていない($ bin/start-all.sh)
# 辺りがポピュラーな原因だと思います。

# mkdir : ディレクトリを作る
$ bin/hadoop dfs -mkdir test_dir

# ls : Linuxのコマンドと一緒
$ bin/hadoop dfs -ls
Found 1 items
drwxr-xr-x   - hadoop supergroup          0 2009-11-28 01:34 /user/hadoop/test_dir

# パスを指定してlsしてみる
$ bin/hadoop dfs -ls /user
Found 1 items
drwxr-xr-x   - hadoop supergroup          0 2009-11-28 01:34 /user/hadoop

# hdfs://localhostからパスを指定して、ls
$ bin/hadoop dfs -ls hdfs://localhost:9000/user/hadoop
Found 1 items
drwxr-xr-x   - hadoop supergroup          0 2009-11-28 01:34 /user/hadoop/test_dir

# lsr : 再帰的にlsしてくれるコマンド
$ bin/hadoop dfs -lsr /user
drwxr-xr-x   - hadoop supergroup          0 2009-11-28 01:34 /user/hadoop
drwxr-xr-x   - hadoop supergroup          0 2009-11-28 01:34 /user/hadoop/test_dir

# mv : リネーム
# 「test_dir」を「hoge_dir」にリネームしてみる
$ bin/hadoop dfs -mv /user/hadoop/test_dir /user/hadoop/hoge_dir
$ bin/hadoop dfs -ls
Found 1 items
drwxr-xr-x   - hadoop supergroup          0 2009-11-28 01:34 /user/hadoop/hoge_dir

# put : ファイルやディレクトリをローカルからHDFSにコピーする
$ echo hello > test_file.txt
$ bin/hadoop dfs -put test_file.txt .
$ bin/hadoop dfs -ls
Found 2 items
drwxr-xr-x   - hadoop supergroup          0 2009-11-28 01:34 /user/hadoop/hoge_dir
-rw-r--r--   1 hadoop supergroup          6 2009-11-28 01:40 /user/hadoop/test_file.txt

# 既に存在するファイルをputした場合は、already exists
bin/hadoop dfs -put test_file.txt .
put: Target test_file.txt already exists

# 標準出力を渡せたりもする
$  bin/hadoop dfs -put - test_file.txt

# cat : ファイルの中身を標準出力する
$ bin/hadoop dfs -cat test_file.txt
hello

# text : ファイルの中身を見る
$ bin/hadoop dfs -text test_file.txt
hello

# get : ファイルをHDFSからローカルにコピーする
# 下記コマンドの場合、HDFSのtest_file.txtを、hoge.txtという名前でローカルにコピー
$ bin/hadoop dfs -get test_file.txt hoge.txt
$ ls -l
-rw-r--r--  1 hadoop hadoop       6 2009-12-04 00:49 hoge.txt

# chmod : ファイル権限を変えれる
# 使用前
$ bin/hadoop dfs -ls test_file.txt
Found 1 items
-rw-r--r--   1 hadoop supergroup          6 2009-12-04 00:49 /user/hadoop/test_file.txt
# 実行
$ bin/hadoop dfs -chmod 777 test_file.txt
# 使用後
$ bin/hadoop dfs -ls test_file.txt
Found 1 items
-rw-rw-rw-   1 hadoop supergroup          6 2009-12-04 00:49 /user/hadoop/test_file.txt
# ファイルにxは付かないらしい(The x permission is never set for files.)
# http://hadoop.apache.org/common/docs/current/hdfs_permissions_guide.html

# ファイルを5つほど足しておく
$ echo test1 > test1.txt
$ echo test2 > test2.txt
$ echo test3 > test3.txt
$ echo test4 > test4.txt
$ echo test5 > test5.txt

# 正規表現を使って5つのファイルをまとめて移す
$ bin/hadoop dfs -put test?.txt .
$ bin/hadoop dfs -ls
Found 7 items
drwxr-xr-x   - hadoop supergroup          0 2009-12-05 10:44 /user/hadoop/hoge_dir
-rw-r--r--   1 hadoop supergroup          6 2009-12-05 11:06 /user/hadoop/test1.txt
-rw-r--r--   1 hadoop supergroup          6 2009-12-05 11:06 /user/hadoop/test2.txt
-rw-r--r--   1 hadoop supergroup          6 2009-12-05 11:06 /user/hadoop/test3.txt
-rw-r--r--   1 hadoop supergroup          6 2009-12-05 11:06 /user/hadoop/test4.txt
-rw-r--r--   1 hadoop supergroup          6 2009-12-05 11:06 /user/hadoop/test5.txt
-rw-r--r--   1 root   supergroup          6 2009-12-05 10:55 /user/hadoop/test_file.txt

# rm : ファイル削除
$ bin/hadoop dfs -rm test_file.txt
Deleted hdfs://localhost:9000/user/hadoop/test_file.txt
$ bin/hadoop dfs -ls
Found 6 items
drwxr-xr-x   - hadoop supergroup          0 2009-12-05 10:44 /user/hadoop/hoge_dir
-rw-r--r--   1 hadoop supergroup          6 2009-12-05 11:06 /user/hadoop/test1.txt
-rw-r--r--   1 hadoop supergroup          6 2009-12-05 11:06 /user/hadoop/test2.txt
-rw-r--r--   1 hadoop supergroup          6 2009-12-05 11:06 /user/hadoop/test3.txt
-rw-r--r--   1 hadoop supergroup          6 2009-12-05 11:06 /user/hadoop/test4.txt
-rw-r--r--   1 hadoop supergroup          6 2009-12-05 11:06 /user/hadoop/test5.txt

# 正規表現を使って削除
$ bin/hadoop dfs -rm test[4-5].txt
Deleted hdfs://localhost:9000/user/hadoop/test4.txt
Deleted hdfs://localhost:9000/user/hadoop/test5.txt
$ bin/hadoop dfs -ls
Found 4 items
drwxr-xr-x   - hadoop supergroup          0 2009-12-05 10:44 /user/hadoop/hoge_dir
-rw-r--r--   1 hadoop supergroup          6 2009-12-05 11:06 /user/hadoop/test1.txt
-rw-r--r--   1 hadoop supergroup          6 2009-12-05 11:06 /user/hadoop/test2.txt
-rw-r--r--   1 hadoop supergroup          6 2009-12-05 11:06 /user/hadoop/test3.txt

# chown / chgrp : オーナーやグループも変えられる(start-allを叩いたユーザであれば)
$ bin/hadoop dfs -chown root test1.txt
$ bin/hadoop dfs -ls test1.txt
Found 4 items
drwxr-xr-x   - hadoop supergroup          0 2009-12-05 10:44 /user/hadoop/hoge_dir
-rw-r--r--   1 root   supergroup          6 2009-12-05 11:06 /user/hadoop/test1.txt
-rw-r--r--   1 hadoop supergroup          6 2009-12-05 11:06 /user/hadoop/test2.txt
-rw-r--r--   1 hadoop supergroup          6 2009-12-05 11:06 /user/hadoop/test3.txt

# -Rオプションでまとめて変更
$ bin/hadoop dfs -chown -R root .
Found 4 items
drwxr-xr-x   - root supergroup          0 2009-12-05 10:44 /user/hadoop/hoge_dir
-rw-r--r--   1 root supergroup          6 2009-12-05 11:06 /user/hadoop/test1.txt
-rw-r--r--   1 root supergroup          6 2009-12-05 11:06 /user/hadoop/test2.txt
-rw-r--r--   1 root supergroup          6 2009-12-05 11:06 /user/hadoop/test3.txt

# グループの変更
$ bin/hadoop dfs -chgrp root test3.txt
$ bin/hadoop dfs -ls
Found 4 items
drwxr-xr-x   - root supergroup          0 2009-12-05 10:44 /user/hadoop/hoge_dir
-rw-r--r--   1 root supergroup          6 2009-12-05 11:06 /user/hadoop/test1.txt
-rw-r--r--   1 root supergroup          6 2009-12-05 11:06 /user/hadoop/test2.txt
-rw-r--r--   1 root root                6 2009-12-05 11:06 /user/hadoop/test3.txt

# オーナーとグループをまとめて変える
$ bin/hadoop dfs -chown -R hadoop:supergroup .
$ bin/hadoop dfs -ls
Found 4 items
drwxr-xr-x   - hadoop supergroup          0 2009-12-05 10:44 /user/hadoop/hoge_dir
-rw-r--r--   1 hadoop supergroup          6 2009-12-05 11:06 /user/hadoop/test1.txt
-rw-r--r--   1 hadoop supergroup          6 2009-12-05 11:06 /user/hadoop/test2.txt
-rw-r--r--   1 hadoop supergroup          6 2009-12-05 11:06 /user/hadoop/test3.txt

# count : ディレクトリ数、ファイル数、コンテントサイズなどを表示
$ bin/hadoop dfs -count .
           2            3                 18 hdfs://localhost:9000/user/hadoop
# ディレクトリ2、ファイル3、18バイト

# サブディレクトリ配下のファイルもカウントされます
# hoge_dir配下にファイルを追加
$ bin/hadoop dfs -put test?.txt ./hoge_dir/
$ bin/hadoop dfs -count .
           2            8                 48 hdfs://localhost:9000/user/hadoop

# test : ファイルの存在チェック
# -eでファイル存在チェック(0:存在, 1:存在しない)
$ bin/hadoop dfs -test -e test1.txt
$ echo $?
0
$ bin/hadoop dfs -test -e testX.txt
$ echo $?
1

# -dでディレクトリ存在チェック
$ bin/hadoop dfs -test -d hoge_dir
$ echo $?
0
$ bin/hadoop dfs -test -d test1.txt
$ echo $?
1

# -zで0byteファイルかチェック
$ touch blank_file.txt
bin/hadoop dfs -put blank_file.txt .
$ bin/hadoop dfs -test -z blank_file.txt
$ echo $?
0
$ bin/hadoop dfs -test -z test1.txt
$ echo $?

# stat : ステータスの表示
$ bin/hadoop dfs -stat test1.txt
2009-12-05 02:06:48

# %n : 名前
$ bin/hadoop dfs -stat %n test1.txt

# %b : ファイルサイズ
bin/hadoop dfs -stat %b test1.txt
6

# %o : ブロックサイズ
$ bin/hadoop dfs -stat %o test1.txt
67108864
# HDFSはブロックサイズが巨大なので、こんなサイズになる

# %y : 最終更新日時
$ bin/hadoop dfs -stat %y test1.txt
2009-12-05 02:06:48

# du : 指定ディレクトリのファイル名とサイズの合計を表示
$ bin/hadoop dfs -du .
Found 5 items
0           hdfs://localhost:9000/user/hadoop/blank_file.txt
30          hdfs://localhost:9000/user/hadoop/hoge_dir
6           hdfs://localhost:9000/user/hadoop/test1.txt
6           hdfs://localhost:9000/user/hadoop/test2.txt
6           hdfs://localhost:9000/user/hadoop/test3.txt

# dus : 指定ディレクトリの使用量を表示
$ bin/hadoop dfs -dus .
hdfs://localhost:9000/user/hadoop       48

# tail : 指定ファイルの後ろ1KBを表示する
$ bin/hadoop dfs -tail test1.txt
test1

# -fもあります
$ bin/hadoop dfs -tail -f test1.txt
test1
# 普通のtailコマンドと同じく、Ctrl+Cで抜けます

# touchz : touchできます
$ bin/hadoop dfs -touchz touch_file.txt
$ bin/hadoop dfs -ls touch_file.txt
Found 1 items
-rw-r--r--   1 hadoop supergroup          0 2009-12-07 01:48 /user/hadoop/touch_file.txt

# copyFromLocal : ローカルのファイルをHDFS上にコピーする
$  bin/hadoop dfs -copyFromLocal test.txt hdfs://localhost:9000/user/hadoop/abc.txt
# putとの違いは、渡せるのはファイルやディレクトリだけというところ(putは標準出力も渡せる)

# copyToLocal : HDFS上のファイルをローカルにコピーする
$ bin/hadoop dfs -copyToLocal abc.txt .
# getとの違いは、コピー先がローカル限定なこと?

# moveFromLocal : ローカルのファイルをHDFS上にmvします
$ echo move > move_file.txt
$  bin/hadoop dfs -moveFromLocal move_file.txt move_file.txt
$ bin/hadoop dfs -ls move_file.txt
Found 1 items
-rw-r--r--   1 hadoop supergroup          0 2009-12-08 22:28 /user/hadoop/move_file.txt

# moveToLocal : 0.20では実装されていません。。。 not implementedと表示されます。
$ bin/hadoop dfs -moveToLocal test.txt test.txt
Option '-moveToLocal' is not implemented yet.

# expunge : trushの中身を空にする?(未調査)
# この辺参照
# http://hadoop.apache.org/common/docs/current/hdfs_design.html#File+Deletes+and+Undeletes
$ bin/hadoop dfs -expunge


# getmerge : ディレクトリ配下のファイルをマージして出力します
# 前準備として、まずマージ用にtest1,test2,test3と出力されたファイルを用意
$ mkdir merge_dir
$ echo test1 > merge_dir/test1.txt
$ echo test2 > merge_dir/test2.txt
$ echo test3 > merge_dir/test3.txt
$ bin/hadoop dfs -put merge_dir merge_dir
# mergeファイル出力先ディレクトリを用紙しておく
$ mkdir out
# getmergeしてみる
$ bin/hadoop dfs -getmerge merge_dir out
$ ls out
merge_dir
$ cat out/merge_dir
test1
test2
test3

# setrep : 複製の数を設定する
# -Rを指定すると、再帰的に配下のファイルを設定出来る
$ bin/hadoop dfs -setrep -w 1 test.txt

# ちなみに、「hadoop fs -ls」のように書いてるサンプルと、「hadoop dfs -ls」と書いてるサンプルが
# あると思いますが、シェルをみる限りでは、どっちも同じFsShellクラスを呼び出してるようです
$ vi bin/hadoop
elif [ "$COMMAND" = "fs" ] ; then
  CLASS=org.apache.hadoop.fs.FsShell
  HADOOP_OPTS="$HADOOP_OPTS $HADOOP_CLIENT_OPTS"
elif [ "$COMMAND" = "dfs" ] ; then
  CLASS=org.apache.hadoop.fs.FsShell
  HADOOP_OPTS="$HADOOP_OPTS $HADOOP_CLIENT_OPTS"
          
戻る    ご意見、ご要望