hdfs dfs で利用できるサブコマンド(1)

hdfs dfs コマンドで利用できるサブコマンドはHadoopのバージョンの向上とともに増えています。使ったことがないコマンドもあるので、実際にコマンドを実行して結果を見てみました。

コマンドが多いので3回に分けて掲載します。

環境

  • CDH 5.9 (Cloudera Manager 5.9で導入)
    • (Hadoop 2.6.0-cdh5.9.0)
commandコマンド実行例説明
ls$ hdfs dfs -help ls
-ls [-C] [-d] [-h] [-q] [-R] [-t] [-S] [-r] [-u] [ ...] :
List the contents that match the specified file pattern. If path is not
specified, the contents of /user/ will be listed. For a directory a
list of its direct children is returned (unless -d option is specified).

Directory entries are of the form:
permissions - userId groupId sizeOfDirectory(in bytes)
modificationDate(yyyy-MM-dd HH:mm) directoryName

and file entries are of the form:
permissions numberOfReplicas userId groupId sizeOfFile(in bytes)
modificationDate(yyyy-MM-dd HH:mm) fileName

-C Display the paths of files and directories only.
-d Directories are listed as plain files.
-h Formats the sizes of files in a human-readable fashion
rather than a number of bytes.
-q Print ? instead of non-printable characters.
-R Recursively list the contents of directories.
-t Sort files by modification time (most recent first).
-S Sort files by size.
-r Reverse the order of the sort.
-u Use time of last access instead of modification for
display and sorting.
指定したファイルパターンに一致したファイル、ディレクトリ一覧。パスが指定されなかった場合は /user/「現在のユーザー」の内容が表示される。ソートはファイル名順
hdfs dfs -ls$ hdfs dfs -ls
Found 6 items
-rw-r--r-- 1 cloudera cloudera 2559 2016-12-04 04:52 test
drwx------ - cloudera cloudera 0 2016-12-04 05:26 .Trash
-rw-r--r-- 1 cloudera cloudera 479 2016-12-04 04:41 hosts
-rw-r--r-- 1 cloudera cloudera 641020 2016-12-04 04:41 services
-rw-r--r-- 2 cloudera cloudera 12 2016-12-04 05:26 test.txt
drwxr-xr-x - cloudera cloudera 0 2016-12-04 04:55 testdir
ユーザーのホームディレクトリの内容の一覧
hdfs dfs -ls /$ hdfs dfs -ls /
Found 6 items
drwxrwxrwx - hdfs supergroup 0 2016-08-10 14:35 /benchmarks
drwxr-xr-x - hbase supergroup 0 2016-12-04 04:05 /hbase
drwxr-xr-x - solr solr 0 2016-08-10 14:37 /solr
drwxrwxrwt - hdfs supergroup 0 2016-12-04 03:58 /tmp
drwxr-xr-x - hdfs supergroup 0 2016-08-10 14:37 /user
drwxr-xr-x - hdfs supergroup 0 2016-08-10 14:37 /var
ルートディレクトリのファイル、ディレクトリの一覧
hdfs dfs -ls -C
$ hdfs dfs -ls -C /
/benchmarks
/hbase
/solr
/tmp
/user
/var
ファイルとディレクトリのパス名のみを返す
hdfs dfs -ls -d $ hdfs dfs -ls -d /
drwxr-xr-x - hdfs supergroup 0 2016-08-10 14:37 /
ディレクトリエントリの表示
hdfs dfs -ls -h$ hdfs dfs -ls -h /user/cloudera
Found 3 items
-rw-r--r-- 1 cloudera cloudera 2.5 K 2016-12-04 04:52 /user/cloudera/test
-rw-r--r-- 1 cloudera cloudera 479 2016-12-04 04:41 /user/cloudera/hosts
-rw-r--r-- 1 cloudera cloudera 626.0 K 2016-12-04 04:41 /user/cloudera/services
ファイルのサイズを人間に読みやすい形式で表示
hdfs dfs -ls -q $ hdfs dfs -ls -q /user/cloudera
Found 3 items
-rw-r--r-- 1 cloudera cloudera 2559 2016-12-04 04:52 /user/cloudera/?test?
-rw-r--r-- 1 cloudera cloudera 479 2016-12-04 04:41 /user/cloudera/hosts
-rw-r--r-- 1 cloudera cloudera 641020 2016-12-04 04:41 /user/cloudera/services
表示できない文字を ? で表示。(ls -h の出力結果と比較してみるとわかりやすい)
hdfs dfs -ls -q $ hdfs dfs -ls -q /user/cloudera
Found 3 items
-rw-r--r-- 1 cloudera cloudera 2559 2016-12-04 04:52 /user/cloudera/?test?
-rw-r--r-- 1 cloudera cloudera 479 2016-12-04 04:41 /user/cloudera/hosts
-rw-r--r-- 1 cloudera cloudera 641020 2016-12-04 04:41 /user/cloudera/services
表示できない文字を ? で表示。(ls -h の出力結果と比較してみるとわかりやすい)
hdfs dfs -ls -R$ hdfs dfs -ls -R /user/cloudera
-rw-r--r-- 1 cloudera cloudera 2559 2016-12-04 04:52 /user/cloudera/test
-rw-r--r-- 1 cloudera cloudera 479 2016-12-04 04:41 /user/cloudera/hosts
-rw-r--r-- 1 cloudera cloudera 641020 2016-12-04 04:41 /user/cloudera/services
drwxr-xr-x - cloudera cloudera 0 2016-12-04 04:55 /user/cloudera/testdir
-rw-r--r-- 1 cloudera cloudera 370 2016-12-04 04:55 /user/cloudera/testdir/hosts.allow
ディレクトリを再帰的に表示
hdfs dfs -ls -t$ hdfs dfs -ls -t /user/cloudera
Found 4 items
drwxr-xr-x - cloudera cloudera 0 2016-12-04 04:55 /user/cloudera/testdir
-rw-r--r-- 1 cloudera cloudera 2559 2016-12-04 04:52 /user/cloudera/test
-rw-r--r-- 1 cloudera cloudera 641020 2016-12-04 04:41 /user/cloudera/services
-rw-r--r-- 1 cloudera cloudera 479 2016-12-04 04:41 /user/cloudera/hosts
変更時間でソートして表示(最新順)
hdfs dfs -ls -S$ hdfs dfs -ls -S /user/cloudera
Found 4 items
-rw-r--r-- 1 cloudera cloudera 641020 2016-12-04 04:41 /user/cloudera/services
-rw-r--r-- 1 cloudera cloudera 2559 2016-12-04 04:52 /user/cloudera/test
-rw-r--r-- 1 cloudera cloudera 479 2016-12-04 04:41 /user/cloudera/hosts
drwxr-xr-x - cloudera cloudera 0 2016-12-04 04:55 /user/cloudera/testdir
サイズでソートして表示
hdfs dfs -ls -r$ hdfs dfs -ls -r /user/cloudera
Found 4 items
drwxr-xr-x - cloudera cloudera 0 2016-12-04 04:55 /user/cloudera/testdir
-rw-r--r-- 1 cloudera cloudera 641020 2016-12-04 04:41 /user/cloudera/services
-rw-r--r-- 1 cloudera cloudera 479 2016-12-04 04:41 /user/cloudera/hosts
-rw-r--r-- 1 cloudera cloudera 2559 2016-12-04 04:52 /user/cloudera/test
逆順にソートして表示。(他のオプションを指定していないのでファイル名が逆順にソートされている)
hdfs dfs -ls -u$ hdfs dfs -ls -u /user/cloudera
Found 4 items
-rw-r--r-- 1 cloudera cloudera 2559 2016-12-04 04:52 /user/cloudera/test
-rw-r--r-- 1 cloudera cloudera 479 2016-12-04 04:41 /user/cloudera/hosts
-rw-r--r-- 1 cloudera cloudera 641020 2016-12-04 04:41 /user/cloudera/services
drwxr-xr-x - cloudera cloudera 0 1969-12-31 16:00 /user/cloudera/testdir
変更時間ではなく最終アクセス時刻を使用して表示
(ディレクトリの場合1969-12-31 16:00となる?)
put$hdfs dfs -help put
-put [-f] [-p] [-l] ... :
Copy files from the local file system into fs. Copying fails if the file already
exists, unless the -f flag is given.
Flags:

-p Preserves access and modification times, ownership and the mode.
-f Overwrites the destination if it already exists.
-l Allow DataNode to lazily persist the file to disk. Forces
replication factor of 1. This flag will result in reduced
durability. Use with care.
ローカルファイルシステムからfsにファイルをコピー。 -f フラグを与えない限りファイルが存在している場合はコピーに失敗する
hdfs dfs -put$ hdfs dfs -put test.txt
$ hdfs dfs -put test.txt /tmp
$ hdfs dfs -put test2.txt test3.txt /tmp
ローカルのファイル(群)を宛先先にコピー。宛先を指定しない場合は /user/<ユーザー名> ディレクトリ以下にコピー。
ローカルファイルは複数指定しても良い。
hdfs dfs -put -p$ ls -l test4.txt
-rw-rw-r-- 1 cloudera cloudera 7 Dec 4 05:19 test4.txt
$ hdfs dfs -put -p test4.txt /tmp
$ hdfs dfs -ls /tmp
Found 4 items
-rw-r--r-- 1 cloudera supergroup 12 2016-12-04 05:15 /tmp/test.txt
-rw-r--r-- 1 cloudera supergroup 4 2016-12-04 05:17 /tmp/test2.txt
-rw-r--r-- 1 cloudera supergroup 4 2016-12-04 05:17 /tmp/test3.txt
-rw-rw-r-- 1 cloudera cloudera 7 2016-12-04 05:19 /tmp/test4.txt
アクセス時間、変更時間、所有者、グループを維持。
実行例ではtest4.txtのみ異なることがわかる
hdfs dfs -put -f$ hdfs dfs -put test4.txt /tmp
put: `/tmp/test4.txt': File exists
$ hdfs dfs -put -f test4.txt /tmp
$
ファイルが存在している場合は上書き
hdfs dfs -put -l$ hdfs dfs -put test.txt /tmp
$ hdfs dfs -put -l test2.txt /tmp
$ hdfs dfs -ls /tmp/
Found 2 items
-rw-r--r-- 3 cloudera supergroup 12 2016-12-04 05:26 /tmp/test.txt
-rw-r--r-- 1 cloudera supergroup 4 2016-12-04 05:26 /tmp/test2.txt
複製係数を1に強制し、DataNodeにファイルの永続化をlazyにするようにする。永続性が下がるので注意。
実行例の ls の結果で複製係数が変わっていることがわかる
copyFromLocal$ hdfs dfs -help copyFromLocal
-copyFromLocal [-f] [-p] [-l] ... :
Identical to the -put command.
putと同じ。putが登場する以前は有用ではあったが現在は特に利用する必要はないと思う
get hdfs dfs -help get
-get [-p] [-ignoreCrc] [-crc] ... :
Copy files that match the file pattern to the local name. is kept.
When copying multiple files, the destination must be a directory. Passing -p
preserves access and modification times, ownership and the mode.
ソースのパターンに一致したファイルをローカル(の名前)にコピーする。ソースは維持される。複数のファイルをコピーする場合、宛先はディレクトリでなければならない。-pオプションを渡すと、アクセス時間、変更時間、所有者、属性が維持される。
hdfs dfs -get$ mkdir xxx
$ hdfs dfs -get /tmp/test.txt /tmp/test2.txt xxx
$ ls xxx
test2.txt test.txt
$ hdfs dfs -get /tmp/test2.txt xxx/
get: `xxx/test2.txt': File exists
複数ファイルもOK。
ファイルが存在している場合はエラーになる
hdfs dfs -get -p$ hdfs dfs -ls /tmp
Found 2 items
-rw-r--r-- 1 cloudera supergroup 4 2016-12-04 05:26 /tmp/test2.txt
-rw-rw-r-- 2 cloudera cloudera 7 2016-12-04 05:19 /tmp/test4.txt
$ hdfs dfs -get -p /tmp/test2.txt
get: chown: invalid group: `cloudera:supergroup'
$ hdfs dfs -get -p /tmp/test4.txt
$
パーミッションを維持。ユーザーやグループが一致しないとエラーになる
hdfs dfs -get -ignoreCrc$ hdfs dfs -get -ignoreCrc /tmp/test2.txt
$
ダウンロード時にCRC(チェックサム)を無視
hdfs dfs -get -crchdfs dfs -get -crc /tmp/test2.txt
$
ダウンロード時にCRCをチェック。デフォルト(のはず)
copyToLocal$ hdfs dfs -help copyToLocal
-copyToLocal [-p] [-ignoreCrc] [-crc] ... :
Identical to the -get command.
getと同じ。getが登場する以前は有用ではあったが現在は特に利用する必要はないと思う
getmerge$ hdfs dfs -help getmerge
-getmerge [-nl] :
Get all the files in the directories that match the source file pattern and
merge and sort them to only one file on local fs. is kept.

-nl Add a newline character at the end of each file.
ソースファイルのパスのパターンに一致したディレクトリにあるすべてのファイルを取得し、ローカルファイルシステムの一つのファイルへとまーじ、ソートする
hdfs dfs -getmerge$ hdfs dfs -cat testdir/test.txt
hello world
$ hdfs dfs -cat testdir/test2.txt
aaa
$ hdfs dfs -getmerge testdir localfile
$ cat localfile
hello world
aaa
$
hdfs dfs -getmerge -nl$ hdfs dfs -getmerge -nl testdir localfile2
$ cat localfile2
hello world

aaa

$
各ファイルの最後に改行(New Line)を付与
cat$ hdfs dfs -help cat
-cat [-ignoreCrc] ... :
Fetch all files that match the file pattern and display their content on
stdout.
ソースにマッチしたファイルパターンのすべてのファイルを取得し、その内容を標準出力に表示。
hdfs dfs -cat $ hdfs dfs -cat test.txt
hello world
$ hdfs dfs -cat test4.txt
AAABBB
$ hdfs dfs -cat test.txt test4.txt
hello world
AAABBB
$
一つのファイルおよび複数のファイルを表示する例
hdfs dfs -cat -ignoreCrC$ hdfs dfs -cat -ignoreCrc test.txt
hello world
$
CRCチェックを行わない
tail$ hdfs dfs -help tail
-tail [-f] :
Show the last 1KB of the file.

-f Shows appended data as the file grows.
ファイルの内容の最後の1KBを表示。-fオプションはファイルの追記された内容を表示
hdfs dfs -tail$ hdfs dfs -tail services
l Networks
nimcontroller 48000/tcp # Nimbus Controller
nimcontroller 48000/udp # Nimbus Controller
nimspooler 48001/tcp # Nimbus Spooler
nimspooler 48001/udp # Nimbus Spooler
nimhub 48002/tcp # Nimbus Hub
nimhub 48002/udp # Nimbus Hub
(略)
ファイルの最後を表示(最後の1KB)
hdfs dfs -tail -f$ hdfs dfs -tail -f test.txt
hello world
goodbye
(この状態で別のターミナルから)
$ cat b.txt
Append test
$ hdfs dfs -appendToFile b.txt test.txt
$
(元のターミナルの出力を確認すると追記されている内容が表示される)
$ hdfs dfs -tail -f test.txt
hello world
goodbye
Append test
tail -f オプションの確認
text$ hdfs dfs -help text
-text [-ignoreCrc] ... :
Takes a source file and outputs the file in text format.
The allowed formats are zip and TextRecordInputStream and Avro.
ソースファイルをテキスト形式で出力。
対応しているフォーマットはzip、TextRecordReader、Avro
hdfs dfs -text TODOzipの例
hdfs dfs -text TODOTextRecordInputStreamの例
hdfs dfs -text TODOAvroの例
hdfs dfs -text -ignoreCrcTODO
appendToFile$ hdfs dfs -help appendToFile
-appendToFile ... :
Appends the contents of all the given local files to the given dst file. The dst
file will be created if it does not exist. If is -, then the input is
read from stdin.
与えられたすべてのローカルファイルの内容を、宛先のファイルに追記(アペンド)する。宛先のファイルが存在しない場合は作成される。ローカルソースが - の場合は標準入力から読み込まれる
hdfs dfs -appendToFile$ hdfs dfs -cat test.txt
hello world
$ cat a.txt
goodbye
$ hdfs dfs -appendToFile a.txt test.txt
$ hdfs dfs -cat test.txt
hello world
goodbye
$
ファイルの追記の例
cp$ hdfs dfs -help cp
-cp [-f] [-p | -p[topax]] ... :
Copy files that match the file pattern to a destination. When copying
multiple files, the destination must be a directory. Passing -p preserves status
[topax] (timestamps, ownership, permission, ACLs, XAttr). If -p is specified
with no , then preserves timestamps, ownership, permission. If -pa is
specified, then preserves permission also because ACL is a super-set of
permission. Passing -f overwrites the destination if it already exists. raw
namespace extended attributes are preserved if (1) they are supported (HDFS
only) and, (2) all of the source and target pathnames are in the /.reserved/raw
hierarchy. raw namespace xattr preservation is determined solely by the presence
(or absence) of the /.reserved/raw prefix and not by the -p option.
ソースのパターンに一致したファイルを宛先にコピーする。複数のファイル指定時は、宛先はディレクトリでなければならない。-p はステータス[topax](タイムスタンプ、オーナーシップ、パーミッション、ACL、XAttr)を維持する。
-p のみが指定された場合、タイムスタンプとオーナーシップのみが維持される。
-paが指定された場合、ACLはパーミッションのスーパーセットなのでパーミッションも維持される。
-f は宛先が既に存在している場合上書きする。
以降TODO
raw
namespace extended attributes are preserved if (1) they are supported (HDFS
only) and, (2) all of the source and target pathnames are in the /.reserved/raw
hierarchy. raw namespace xattr preservation is determined solely by the presence
(or absence) of the /.reserved/raw prefix and not by the -p option.
hdfs dfs -cp$ hdfs dfs -cp copytest/test.txt copytest/copied.txt
$ hdfs dfs -ls copytest
Found 2 items
-rw-r--r-- 2 cloudera cloudera 12 2016-12-04 06:47 copytest/copied.txt
-rw-r--r-- 2 cloudera cloudera 12 2016-12-04 06:46 copytest/test.txt
コピー
hdfs dfs -cp -f $ hdfs dfs -cp copytest/test.txt copytest/copied.txt
cp: `copytest/copied.txt': File exists
$ hdfs dfs -cp -f copytest/test.txt copytest/copied.txt
$
強制コピー
hdfs dfs -cp -pTODO
mv$ hdfs dfs -help mv
-mv ... :
Move files that match the specified file pattern to a destination .
When moving multiple files, the destination must be a directory.
ソースのパターンに一致した(HDFS上の)ファイルを宛先に移動する。複数のファイルを移動する際は宛先がディレクトリでなければならない。リネームにも使える
hdfs dfs -mv$ hdfs dfs -mv test4.txt /tmp
$ hdfs dfs -ls
Found 1 items
-rw-r--r-- 2 cloudera cloudera 6 2016-12-04 06:31 aaa
$ hdfs dfs -mv aaa bbb
$ hdfs dfs -ls
Found 1 items
-rw-r--r-- 2 cloudera cloudera 6 2016-12-04 06:31 bbb
$
ファイルの移動とリネーム
moveFromLocalhdfs dfs -help moveFromLocal
-moveFromLocal ... :
Same as -put, except that the source is deleted after it's copied.
putと同じだが、ファイルコピー後にオリジナルが削除される
hdfs dfs -moveFromLocal$ ls
original.txt
$ hdfs dfs -moveFromLocal original.txt /tmp
$ ls
$
ファイル移動の例。オリジナルファイルが削除されている
moveToLocal$ hdfs dfs -help moveToLocal
-moveToLocal :
Not implemented yet
実装中!?
hdfs dfs -moveToLocal hdfs dfs -moveToLocal /tmp/original.txt .
moveToLocal: Option '-moveToLocal' is not implemented yet.
rm$ hdfs dfs -help rm
-rm [-f] [-r|-R] [-skipTrash] ... :
Delete all files that match the specified file pattern. Equivalent to the Unix
command "rm "

-skipTrash option bypasses trash, if enabled, and immediately deletes
-f If the file does not exist, do not display a diagnostic message or
modify the exit status to reflect an error.
-[rR] Recursively deletes directories
指定したファイルのパターンに一致したファイルすべてを削除する。UNIXのrmコマンドと同等。
hdfs dfs -rm$ hdfs dfs -rm bbb
16/12/04 06:52:13 INFO fs.TrashPolicyDefault: Moved: 'hdfs://quickstart.cloudera:8020/user/cloudera/bbb' to trash at: hdfs://quickstart.cloudera:8020/user/cloudera/.Trash/Current/user/cloudera/bbb
$
ファイルを削除。ゴミ箱機能が有効な場合はゴミ箱に移動する。
hdfs dfs -rm -skipTrash$ hdfs dfs -rm -skipTrash b.txt
Deleted b.txt
$
ファイルを削除(ゴミ箱には移動しない)
hdfs dfs -rm -f$ hdfs dfs -rm xxx
rm: `xxx': No such file or directory
$ hdfs dfs -rm -f xxx
$
ファイルが存在しない場合、エラーを表示しない。
hdfs dfs -r$ hdfs dfs -ls rmtest
Found 3 items
drwxr-xr-x - cloudera cloudera 0 2016-12-04 06:54 rmtest/subdir
-rw-r--r-- 2 cloudera cloudera 12 2016-12-04 06:54 rmtest/test.txt
-rw-r--r-- 2 cloudera cloudera 178 2016-12-04 06:54 rmtest/test.zip
$ hdfs dfs -rm -r -skipTrash rmtest
Deleted rmtest
$
ディレクトリを再帰的に削除。-Rオプションも同じ意味。
mkdir$ hdfs dfs -help mkdir
-mkdir [-p] ... :
Create a directory in specified location.

-p Do not fail if the directory already exists
指定した場所にディレクトリを作成する。
-pオプションはディレクトリが既に存在していてもエラーにならない
hdfs dfs -mkdir $ hdfs dfs -mkdir testdir
$ hdfs dfs -ls
Found 1 items
drwxr-xr-x - cloudera cloudera 0 2016-12-04 06:59 testdir
$
ディレクトリ作成の例
hdfs dfs -mkdir -p$ hdfs dfs -mkdir testdir
mkdir: `testdir': File exists
$ hdfs dfs -mkdir -p testdir
$
既にディレクトリが存在している場合。エラーになRない。(ディレクトリは作成されない)
rmdir$ hdfs dfs -help rmdir
-rmdir [--ignore-fail-on-non-empty] ... :
Removes the directory entry specified by each directory argument, provided it is
empty.
指定されたディレクトリを削除する。ディレクトリが空の場合のみ削除。
hdfs dfs -rmdir xxx$ hdfs dfs -rmdir xxx
$
空のディレクトリの削除
hdfs dfs -rmdir --ignore-fail-on-non-empty $ hdfs dfs -rmdir testdir
rmdir: `testdir': Directory is not empty
$ hdfs dfs -rmdir --ignore-fail-on-non-empty testdir
$
ディレクトリ内にファイルが存在していても削除。
(ソースを読んでいないが事実上rm -r と同じ?)TODO

見やすくまとめた方が良さそうなので、書き直すかも知れません。

Pocket

Leave a Reply

Your email address will not be published. Required fields are marked *

CAPTCHA


日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)