hadoop
Hdfs

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

More than 1 year has passed since last update.


目的

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


hdfsコマンド

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

https://github.com/apache/hadoop/blob/59d69257a888347f0fb9c51bb000afc986b64f98/hadoop-hdfs-project/hadoop-hdfs/src/main/bin/hdfs


dfs

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

https://github.com/apache/hadoop/blob/b606e025f10daed18b90b45ac00cd0c82e818581/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/fs/FsShell.java#L382


CommandFactory

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

https://github.com/apache/hadoop/blob/b606e025f10daed18b90b45ac00cd0c82e818581/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/fs/FsShell.java#L313


Ls

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

https://github.com/apache/hadoop/blob/b606e025f10daed18b90b45ac00cd0c82e818581/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/fs/shell/Ls.java


Commadn, FsCommand

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


PathData

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

https://github.com/apache/hadoop/blob/b606e025f10daed18b90b45ac00cd0c82e818581/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/fs/shell/PathData.java#L322

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


結果出力

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