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"