FsShellクラス活用
FsShellとは
hadoop fs [-options]
このコマンド実行時に、呼ばれるクラス。
プログラム上から、このクラスを呼ぶ事ができれば、引数のオプションで、実行できる事が、そのまま実行できる。
呼び方
上のコマンドを呼ぶ際に、呼ばれるmainメソッドは、下記の様な実装になっている。
public static void main(String argv[]) throws Exception { FsShell shell = new FsShell(); int res; try { res = ToolRunner.run(shell, argv); } finally { shell.close(); } System.exit(res); }
main()メソッドをそのまま読んでも良いとは思うが、失敗するとexitしてしまう為、プログラム中から呼ぶのには抵抗がある。
なので、この中身を借りパクして
public static int execFsShell(String[] args) throws Exception { FsShell shell = new FsShell(); int res; try { res = ToolRunner.run(shell, args); } finally { shell.close(); } return res; }
こんな感じにすればいいんじゃね?
使用例
FS上のワーキングディレクトリ内のinputフォルダの中身を標準出力に表示。
public static void main(String[] args) throws Exception { List<String> list = new ArrayList<String>(); list.add("-ls"); list.add("input"); execFsShell(list.toArray(new String[]{})); }
fsのオプション
MapReduceの結果をマージして取得する-getmergeとかは、FileSystemクラスのメソッドに同等の機能を持つ物が無いので、結構重宝する。
Usage: java FsShell [-ls <path>] [-lsr <path>] [-df [<path>]] [-du <path>] [-dus <path>] [-count[-q] <path>] [-mv <src> <dst>] [-cp <src> <dst>] [-rm [-skipTrash] <path>] [-rmr [-skipTrash] <path>] [-expunge] [-put <localsrc> ... <dst>] [-copyFromLocal <localsrc> ... <dst>] [-moveFromLocal <localsrc> ... <dst>] [-get [-ignoreCrc] [-crc] <src> <localdst>] [-getmerge <src> <localdst> [addnl]] [-cat <src>] [-text <src>] [-copyToLocal [-ignoreCrc] [-crc] <src> <localdst>] [-moveToLocal [-crc] <src> <localdst>] [-mkdir <path>] [-setrep [-R] [-w] <rep> <path/file>] [-touchz <path>] [-test -[ezd] <path>] [-stat [format] <path>] [-tail [-f] <file>] [-chmod [-R] <MODE[,MODE]... | OCTALMODE> PATH...] [-chown [-R] [OWNER][:[GROUP]] PATH...] [-chgrp [-R] GROUP PATH...] [-help [cmd]]