Version 1 (modified by jazz, 9 years ago) (diff) |
---|
實作六 Lab6
Hadoop FileSystem API 原始碼觀察
Learn from Apache Hadoop FsShell.java Source Code
替 Hadoop 上補丁的方法
- 在前面的範例中,我們使用 Bash 除錯技巧,得知當我們執行 hadoop fs 時,等同呼叫 FsShell 類別
- 那 FsShell 類別在 Apache Hadoop 中,放在哪裡呢? 我們可以透過 find 指令查出來。
~$ 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 行為模式的目的
- 執行的方式很簡單,請剪貼以下指令:
~$ cd ~/hadoop_labs ~/hadoop_labs$ lab003/FsShell
- 但是背後的意義是什麼呢?首先,讓我們用 diff 觀察一下原始碼做了什麼修改
~$ cd ~/hadoop_labs/lab003/ ~/hadoop_labs/lab003$ diff -Naur ~/hadoop/src/core/org/apache/hadoop/fs/FsShell.java src/FsShell.java
-
FsShell.java
old new 571 571 Path srcPath = new Path(srcf); 572 572 FileSystem srcFs = srcPath.getFileSystem(this.getConf()); 573 573 FileStatus[] srcs = srcFs.globStatus(srcPath); 574 // Add by Jazz 575 System.out.println("srcFs = " + srcFs.getClass().toString()); 576 System.out.println("Uri = " + srcFs.getUri().toString()); 574 577 if (srcs==null || srcs.length==0) { 575 578 throw new FileNotFoundException("Cannot access " + srcf + 576 579 ": No such file or directory."); … … 1786 1789 exitCode = FsShellPermissions.changePermissions(fs, cmd, argv, i, this); 1787 1790 } else if ("-ls".equals(cmd)) { 1788 1791 if (i < argv.length) { 1792 // Add by Jazz 1793 System.out.println("doall("+cmd+","+argv+","+i+")"); 1789 1794 exitCode = doall(cmd, argv, i); 1790 1795 } else { 1796 // Add by Jazz 1797 System.out.println("ls("+Path.CUR_DIR+",false), Path.CUR_DIR = " + Path.CUR_DIR); 1791 1798 exitCode = ls(Path.CUR_DIR, false); 1792 1799 } 1793 1800 } else if ("-lsr".equals(cmd)) {
-
- 至於 ant 的 build.xml 中,有一個比較特殊的語法,在第 42 行使用了 update="true" 這個選項,其意義就是呼叫 jar 的 update (-u) 功能
41 <target name="jar" depends="compile,doc" description="Package the classes into a .jar file"> 42 <jar update="true" destfile="${jarname}" basedir="${bindir}" /> 43 </target>
~/hadoop_labs/lab003$ jar 用法:jar {ctxui}[vfm0Me] [jar 檔案] [清單檔案] [進入點] [-C 目錄] 檔案 ... 選項: -c 建立新的歸檔 -t 列出歸檔的目錄 -x 從歸檔中擷取已命名的 (或所有) 檔案 -u 更新現有歸檔 -v 在標準輸出中產生詳細輸出 -f 指定歸檔檔案名稱 -m 包含指定清單檔案中的清單資訊 -e 為獨立應用程式指定應用程式進入點 已隨附於可執行 jar 檔案中 -0 僅儲存;不使用 ZIP 壓縮方式 -M 不為項目建立清單檔案 -i 為指定的 jar 檔案產生索引資訊 -C 變更至指定目錄並包含後面所列的檔案
- lab003/FsShell 所做的動作:
- 安裝 ant
- 編譯 src/FsShell.java 並使用 jar -u 將產生的 .class 更新到 hadoop-core-$VERSION.jar
- 顯示 hadoop-core-$VERSION.jar 與原始備份 hadoop-core-$VERSION.jar.org 的差異(請觀察日期)
- 採用 HADOOP_CONF_DIR 環境變數切換成單機模式,請留意畫面中出現的 srcFS 內容
- 切換回全分散式模式,請留意畫面中出現的 srcFS 內容
實作習題
<問題 1> 執行 lab003/FsShell,在單機模式時,srcFs 物件是哪一個 Java 類別
(A) org.apache.hadoop.fs.LocalFileSystem (B) org.apache.hadoop.hdfs.DistributedFileSystem (C) org.apache.hadoop.fs.shell.Count (D) org.apache.hadoop.fs.shell.CommandFormat
<問題 2> 執行 lab003/FsShell,在全分散模式時,srcFs 物件是哪一個 Java 類別
(A) org.apache.hadoop.fs.LocalFileSystem (B) org.apache.hadoop.hdfs.DistributedFileSystem (C) org.apache.hadoop.fs.shell.Count (D) org.apache.hadoop.fs.shell.CommandFormat
<問題 3> 從實作中,我們可以觀察到切換不同的設定時,FileSystem 父物件參照(Reference)指向子類別實作,會視 Configuration 而有所不同。請參考提示,並根據 ${HOME}/hadoop/src/core/org/apache/hadoop/fs 目錄的內容,試猜測 Hadoop 1.0.4 支援哪幾種檔案系統: (複選)
<提示> http://answers.oreilly.com/topic/456-get-to-know-hadoop-filesystems/
(A) HDFS (hdfs://namenode:port) (B) Amazon S3 (s3:// , s3n://) (C) KFS (D) Local File System (file:///) (F) FTP (ftp://user:passwd@ftp-server:port) (G) RAMFS (ramfs://) (H) HAR (Hadoop Archive Filesystem, har://underlyingfsscheme-host:port/archivepath or har:///archivepath )