[[PageOutline]] ◢ <[wiki:III131019/Lab8 實作八]> | <[wiki:III131019 回課程大綱]> ▲ | <[wiki:III131019/Lab10 實作十]> ◣ = 實作九 Lab9 = {{{ #!html

Hadoop FileSystem API 原始碼觀察
Learn from Apache Hadoop FsShell.java Source Code

}}} {{{ #!text 請先連線至 nodeN.3du.me , N 為您的報名編號 }}} == 替 Hadoop 上補丁的方法 == * 在前面的範例中,我們使用 Bash 除錯技巧,得知當我們執行 hadoop fs 時,等同呼叫 FsShell 類別 * 那 !FsShell 類別在 Apache Hadoop 中,放在哪裡呢? 我們可以透過 find 指令查出來。 {{{ user@node1:~$ find ~/hadoop/src -name "FsShell.java" /home/user/hadoop/src/core/org/apache/hadoop/fs/FsShell.java }}} * 現在,我們知道 !FsShell.java 原始碼的位置,我們想要對它做小幅的修正。 * 下一個範例我們使用了一個 update jar 檔的技巧,直接修改 hadoop-core-$VERSION.jar 壓縮檔中某幾個類別(CLASS)的內容,來達成我們觀察 Hadoop 行為模式的目的 * 執行的方式很簡單,請剪貼以下指令: {{{ user@node1:~$ cd ~/hadoop_labs user@node1:~/hadoop_labs$ lab003/FsShell }}} * 但是背後的意義是什麼呢?首先,讓我們用 diff 觀察一下原始碼做了什麼修改 {{{ user@node1:~$ cd ~/hadoop_labs/lab003/ user@node1:~/hadoop_labs/lab003$ diff -Naur ~/hadoop/src/core/org/apache/hadoop/fs/FsShell.java src/FsShell.java --- /home/user/hadoop/src/core/org/apache/hadoop/fs/FsShell.java 2012-10-03 13:17:16.000000000 +0800 +++ src/FsShell.java 2013-10-19 11:25:16.419320587 +0800 @@ -571,6 +571,9 @@ Path srcPath = new Path(srcf); FileSystem srcFs = srcPath.getFileSystem(this.getConf()); FileStatus[] srcs = srcFs.globStatus(srcPath); + // Add by Jazz + System.out.println("srcFs = " + srcFs.getClass().toString()); + System.out.println("Uri = " + srcFs.getUri().toString()); if (srcs==null || srcs.length==0) { throw new FileNotFoundException("Cannot access " + srcf + ": No such file or directory."); @@ -1786,8 +1789,12 @@ exitCode = FsShellPermissions.changePermissions(fs, cmd, argv, i, this); } else if ("-ls".equals(cmd)) { if (i < argv.length) { + // Add by Jazz + System.out.println("doall("+cmd+","+argv+","+i+")"); exitCode = doall(cmd, argv, i); } else { + // Add by Jazz + System.out.println("ls("+Path.CUR_DIR+",false)"); exitCode = ls(Path.CUR_DIR, false); } } else if ("-lsr".equals(cmd)) { }}} * 至於 ant 的 build.xml 中,有一個比較特殊的語法,是呼叫 jar 的 update (-u) 功能 {{{ user@node1:~/hadoop_labs/lab003$ jar 用法:jar {ctxui}[vfm0Me] [jar 檔案] [清單檔案] [進入點] [-C 目錄] 檔案 ... 選項: -c 建立新的歸檔 -t 列出歸檔的目錄 -x 從歸檔中擷取已命名的 (或所有) 檔案 -u 更新現有歸檔 -v 在標準輸出中產生詳細輸出 -f 指定歸檔檔案名稱 -m 包含指定清單檔案中的清單資訊 -e 為獨立應用程式指定應用程式進入點 已隨附於可執行 jar 檔案中 -0 僅儲存;不使用 ZIP 壓縮方式 -M 不為項目建立清單檔案 -i 為指定的 jar 檔案產生索引資訊 -C 變更至指定目錄並包含後面所列的檔案 }}}