hadoop-clientまわりのソースコードリーディング


目的

hdfs dfs -ls / を実行した時にどのようなコードが実行されるかコードを追ってみた。

hdfsコマンド

hdfsコマンドは hadoop-hdfs モジュールで管理されている。

dfs

dfs を指定すると、org.apache.hadoop.fs.FsShell が呼び出される。mainメソッドがエントリポイント。

CommandFactory

実行するサブコマンドが決まると、CommandFactoryからそれに対応する実行クラスを取得することができる。

Ls

サブコマンドが ls の場合は、org.apache.hadoop.fs.shell.Ls#run が呼び出される。

Commadn, FsCommand

Ls等のサブコマンドのクラスはFsCommandクラスを、FsCommandクラスはCommandクラスを継承している。Ls#runを呼び出すと、Command#runが起動して、processRawArguments → processArguments → processArgument → processPathArgument → processPaths → processPath と呼び出していく。サブコマンドのクラスは適宜これらのメソッドをオーバーライドする。

PathData

processRawArguments を呼び出す際に、expandArgument を呼び出して引数(文字列)をPathDataに変換する。

この時に、指定されたパスのURLスキームを参照し、適切なFileSystem を取得して、そのパスの情報をPathDataに保存する。

結果出力

LsのprocessPathArgument → processPaths → processPath と遷移し、Ls#processPathでパスの情報を出力して終了。