官方文檔鏈接:http://hadoop.apache.org/docs/r2.6.5/hadoop-project-dist/hadoop-common/FileSystemShell.html#test
HDFS設計的主要目的是對海量數據進行處理,也就是說在其上能夠存儲很大量文件(可以存儲TB級的文件)。HDFS將這些文件分割之后,存儲在不同的DataNode上, HDFS 提供了兩種數據訪問接口:Shell接口和Java API 接口,對HDFS里面的文件進行操作,具體每個Block放在哪台DataNode上面,對於開發者來說是透明(簡而言之就是看不見的)的。
Shell 接口
HDFS 處理文件的命令和 Linux 命令基本相同,這里區分大小寫。下面介紹 HDFS 操作分布式文件系統的命令。
HDFS基本命令:
hadoop fs -cmd
cmd:具體的操作,基本上與UNIX的命令行相同
args:參數
HDFS 資源URI格式:
scheme://authority/path
scheme:協議名,file或hdfs
authority:namenode主機名
path:路徑
示例:hdfs://cloud004:9000/middle/test.txt
假設已經在core-site.xml里配置了fs.default.name=hdfs://cloud004:9000,則僅使用/middle/test.txt即可。
shell 操作單個 HDFS 集群
下面列舉出幾個常用場景下的命令。
1、創建文件夾
HDFS 上的文件目錄結構類似 Linux,根目錄使用 "/" 表示。下面的命令將在 /middle 目錄下建立目錄 weibo
[hadoop@cloud004 hadoop-2.2.0-x64]$ hadoop fs -mkdir /middle/weibo
2、上傳文件 weibo.txt 到 weibo 目錄下。
[hadoop@cloud004 hadoop-2.2.0-x64]$ hadoop fs -put weibo.txt /middle/weibo/
還可以使用 -copyFromLocal 參數。
[hadoop@cloud004 hadoop-2.2.0-x64]$ hadoop fs -copyFromLocal weibo.txt /middle/weibo/
3、查看 weibo.txt 文件內容。
[hadoop@cloud004 hadoop-2.2.0-x64]$ hadoop fs -text /middle/weibo/weibo.txt
還可以用 -cat、-tail 參數查看文件的內容。但是對於壓縮的結果文件只能用 -text 參數來查看,否則是亂碼。
[hadoop@cloud004 hadoop-2.2.0-x64]$ hadoop fs -cat /middle/weibo/weibo.txt [hadoop@cloud004 hadoop-2.2.0-x64]$ hadoop fs -tail /middle/weibo/weibo.txt
4、把 weibo.txt 文件復制到本地。
[hadoop@cloud004 hadoop-2.2.0-x64]$ hadoop fs -get /middle/weibo/weibo.txt
還可以用 -copyToLocal 參數。
[hadoop@cloud004 hadoop-2.2.0-x64]$ hadoop fs -copyToLocal /middle/weibo/weibo.txt
5、刪除 weibo.txt 文件。
[hadoop@cloud004 hadoop-2.2.0-x64]$ hadoop fs -rm /middle/weibo/weibo.txt
刪除/middle/weibo文件夾。
[hadoop@cloud004 hadoop-2.2.0-x64]$ hadoop fs -rmr /middle/weibo
6、顯示 /middle 目錄下的文件。
[hadoop@cloud004 hadoop-2.2.0-x64]$ hadoop fs -ls /middle
shell 操作多個 HDFS 集群
上面我們介紹的是單線程訪問的 HDFS 訪問模型,但是 多個Hadoop 集群需要復制數據該怎么辦呢?幸運的是,Hadoop 有一個有用的 distcp 分布式復制程序,該程序是由 MapReduce 作業來實現的,它是通過集群中並行運行的 map 來完成集群之間大量數據的復制。 下面我們將介紹 distcp 在不同場景下該如何使用。
兩個集群運行相同版本的 Hadoop。
兩個 HDFS 集群之間傳輸數據,默認情況下 distcp 會跳過目標路徑下已經存在的文件。
[hadoop@cloud0042 hadoop-2.2.0-x64]$ hadoop distcp hdfs://cloud004:9000/weather hdfs://cloud0042:9000/middle
這條指令把第一個集群/weather 目錄及其內容復制到第二個集群的/middle 目錄下,所以第二個集群最后的目錄結構為/middle/weather。如果/middle 不存在,則新建一個。 也可以指定多個源路徑,並把所有路徑都復制到目標路徑下。這里的源路徑必須是絕對路徑。
兩個 HDFS 集群之間傳輸數據,覆蓋現有的文件使用overwrite。
[hadoop@cloud0042 hadoop-2.2.0-x64]$ hadoop distcp -overwrite hdfs://cloud004:9000/weather hdfs://cloud0042:9000/middle
兩個 HDFS 集群之間傳輸數據,更新有改動過的文件使用update。
[hadoop@cloud0042 hadoop-2.2.0-x64]$ hadoop distcp -update hdfs://cloud004:9000/weather hdfs://cloud0042:9000/middle
兩個集群運行不同版本的 Hadoop。
不同版本 Hadoop 集群的 RPC 是不兼容的,使用distcp 復制數據並使用 hdfs 協議,會導致復制作業失敗。想要彌補這種情況,可以使用基於只讀 HTTP 協議的 HFTP 文件系統並從源文件系統中讀取數據。 這個作業必須運行在目標集群上,進而實現 hdfs RPC 版本的兼容。
還以兩個 HDFS 集群之間傳輸數據為例。
[hadoop@cloud0042 hadoop-2.2.0-x64]$ hadoop distcp hftp://cloud004:9000/weather hdfs://cloud0042:9000/middle
注意,這里需要在 URI 源中指定 namenode 的 Web 端口。這是由 dfs.http.address 屬性決定的,其默認值為 50070。
如果使用新出的 webhdfs 協議(替代 hftp)后,對源集群和目標集群均可以使用 HTTP 協議進行通信,且不會造成任何不兼容的問題。
[hadoop@cloud0042 hadoop-2.2.0-x64]$ hadoop distcp webhdfs://cloud004:9000/weather webhdfs://cloud0042:9000/middle
Hadoop 管理員其他常見shell操作
掌握了 shell 如何訪問 HDFS,作為 Hadoop 管理員,還需要掌握如下常見命令:
1、查看正在運行的 Job。
[hadoop@cloud004 hadoop-2.2.0-x64]$ hadoop job -list

2、關閉正在運行的 Job。
[hadoop@cloud004 hadoop-2.2.0-x64]$ hadoop job -kill job_1432108212572_0001
3、檢查 HDFS 塊狀態,查看是否損壞。
[hadoop@cloud004 hadoop-2.2.0-x64]$ hadoop fsck /
[hadoop@test jar]$ hadoop fsck / DEPRECATED: Use of this script to execute hdfs command is deprecated. Instead use the hdfs command for it. 18/04/08 19:57:11 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable Connecting to namenode via http://test:50070 FSCK started by hadoop (auth:SIMPLE) from /192.168.80.128 for path / at Sun Apr 08 19:57:19 CST 2018 .. /second/anagram.txt: Under replicated BP-1804412879-192.168.80.128-1522874281586:blk_1073741827_1003. Target Replicas is 3 but found 1 replica(s). .....Status: HEALTHY Total size: 1483101 B Total dirs: 12 Total files: 7 Total symlinks: 0 Total blocks (validated): 6 (avg. block size 247183 B) Minimally replicated blocks: 6 (100.0 %) Over-replicated blocks: 0 (0.0 %) Under-replicated blocks: 1 (16.666666 %) Mis-replicated blocks: 0 (0.0 %) Default replication factor: 1 Average block replication: 1.0 Corrupt blocks: 0 Missing replicas: 2 (25.0 %) Number of data-nodes: 1 Number of racks: 1 FSCK ended at Sun Apr 08 19:57:19 CST 2018 in 80 milliseconds The filesystem under path '/' is HEALTHY
4、檢查 HDFS 塊狀態,並刪除損壞的塊。
[hadoop@cloud004 hadoop-2.2.0-x64]$ hadoop fsck / -delete
5、檢查 HDFS 狀態,包括 DataNode 信息。
[hadoop@cloud004 hadoop-2.2.0-x64]$ hadoop dfsadmin -report
Configured Capacity: 18569568256 (17.29 GB) Present Capacity: 16106115072 (15.00 GB) DFS Remaining: 16104345600 (15.00 GB) DFS Used: 1769472 (1.69 MB) DFS Used%: 0.01% Under replicated blocks: 1 Blocks with corrupt replicas: 0 Missing blocks: 0 ------------------------------------------------- Live datanodes (1): Name: 192.168.80.128:50010 (test) Hostname: test Decommission Status : Normal Configured Capacity: 18569568256 (17.29 GB) DFS Used: 1769472 (1.69 MB) Non DFS Used: 2463453184 (2.29 GB) DFS Remaining: 16104345600 (15.00 GB) DFS Used%: 0.01% DFS Remaining%: 86.72% Configured Cache Capacity: 0 (0 B) Cache Used: 0 (0 B) Cache Remaining: 0 (0 B) Cache Used%: 100.00% Cache Remaining%: 0.00% Xceivers: 1 Last contact: Sun Apr 08 19:58:51 CST 2018
6、Hadoop 進入安全模式。
[hadoop@cloud004 hadoop-2.2.0-x64]$ hadoop dfsadmin -safemode enter
[hadoop@test jar]$ hadoop dfsadmin -safemode enter DEPRECATED: Use of this script to execute hdfs command is deprecated. Instead use the hdfs command for it. 18/04/08 19:59:57 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable Safe mode is ON
7、Hadoop 離開安全模式。
[hadoop@cloud004 hadoop-2.2.0-x64]$ hadoop dfsadmin -safemode leave
[hadoop@test jar]$ hdfs dfsadmin -safemode leave 18/04/08 20:00:59 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable Safe mode is OFF
8、平衡集群中的文件
[hadoop@cloud004 hadoop-2.2.0-x64]$ sbin/start-balancer.sh
Java API接口
HDFS提供了Java API接口對HDFS進行操作。如果以下程序在 Hadoop 集群上運行, Path 中的路徑可以寫為相對路徑,比如 "/middle/weibo"; 如果以下程序在本地 Eclipse 上面測試,Path 中的路徑需要寫為絕對路徑,比如"hdfs://cloud004:9000/middle/weibo"。
1、獲取 HDFS 文件系統
public static FileSystem getFileSystem() throws IOException, URISyntaxException{ //1、獲取配置文件 Configuration conf = new Configuration(); // FileSystem fs = FileSystem.get(conf);//集群環境下直接獲取默認文件系統 //2、指定的文件系統地址 URI path = new URI("hdfs://test:9000"); //3、返回指定的文件系統地址 ------本地測試使用此方法 FileSystem fs = FileSystem.get(path, conf); //4、此處關閉文件系統流會報錯,導致之后的操作無法進行 /** * fs.close(); * Exception in thread "main" java.io.IOException: Filesystem closed at org.apache.hadoop.hdfs.DFSClient.checkOpen(DFSClient.java:795) at org.apache.hadoop.hdfs.DFSClient.primitiveMkdir(DFSClient.java:2743) at org.apache.hadoop.hdfs.DFSClient.mkdirs(DFSClient.java:2724) at org.apache.hadoop.hdfs.DistributedFileSystem$17.doCall(DistributedFileSystem.java:870) at org.apache.hadoop.hdfs.DistributedFileSystem$17.doCall(DistributedFileSystem.java:866) at org.apache.hadoop.fs.FileSystemLinkResolver.resolve(FileSystemLinkResolver.java:81) at org.apache.hadoop.hdfs.DistributedFileSystem.mkdirsInternal(DistributedFileSystem.java:866) at org.apache.hadoop.hdfs.DistributedFileSystem.mkdirs(DistributedFileSystem.java:859) at org.apache.hadoop.fs.FileSystem.mkdirs(FileSystem.java:1817) at com.dajiangtai.hdfsJavaAPI.FileTest.mkdir(FileTest.java:33) at com.dajiangtai.hdfsJavaAPI.FileTest.main(FileTest.java:46) * * */ return fs; }
如果放到 hadoop 集群上面運行,獲取文件系統可以直接使用 FileSystem.get(conf)。
2、創建文件目錄
//創建文件目錄 public static void mkdir() throws IOException, URISyntaxException{ //1、調用剛剛獲得的HDFS文件系統,返回文件系統對象 FileSystem fs = getFileSystem(); //2、指定創建的文件系統路徑 fs.mkdirs(new Path("hdfs://test:9000/filetest")); //3、關閉文件流--------此處不關閉流的情況下,創建文件會正常運行,且不報錯 fs.close(); }
3、刪除文件或文件目錄
//刪除文件或者文件目錄 public static void rmdir() throws Exception { //返回FileSystem對象 FileSystem fs = getFileSystem(); //刪除文件或者文件目錄 delete(Path f) 此方法已經棄用 fs.delete(new Path("hdfs://cloud004:9000/middle/weibo"),true); //釋放資源 fs.close(); }
4、獲取目錄下的所有文件
//獲取目錄下的所有文件 public static void getAllFile() throws IOException, URISyntaxException{ //1、獲取文件系統對象 FileSystem fs = getFileSystem(); //2、獲取該目錄下的文件名稱---FileStatus獲取文件的元數據 FileStatus[] listStatus = fs.listStatus(new Path("hdfs://test:9000/filetest/")); //3.獲取文件的path路徑 Path[] stat2Paths = FileUtil.stat2Paths(listStatus); //4、循環遍歷路徑,輸出結果 for(Path path: stat2Paths){ System.out.println(path); } fs.close(); /**打印結果 * hdfs://test:9000/filetest/file0.txt hdfs://test:9000/filetest/file1.txt hdfs://test:9000/filetest/file2.txt hdfs://test:9000/filetest/file3.txt hdfs://test:9000/filetest/file4.txt hdfs://test:9000/filetest/file5.txt * */ }
5、文件上傳至 HDFS
//上傳文件到hdfs public static void copyToHdfs() throws IOException, URISyntaxException{ //1、獲取文件系統對象 FileSystem fs = getFileSystem(); /* * Exception in thread "main" java.io.FileNotFoundException: File does not exist: /home/hadoop/app/hadoop-2.6.0/filetest/copyToHdfs.txt * * Exception in thread "main" java.lang.IllegalArgumentException: Pathname /C:/Users/yizhijing/Desktop/llllllll/file1.txt from C:/Users/yizhijing/Desktop/llllllll/file1.txt is not a valid DFS filename. * */ //本地文件路徑,並且集群中同文件目錄下不存在同名文件的情況下 //2、獲取本地文件路徑------在windows環境下就是wondows路徑,在Linux環境下就是linux路徑eg:/home/hadoop/app/hadoop-2.6.0/filetest/file.txt Path path = new Path("D://file.txt"); //3、獲取集群文件路徑 Path path2 = new Path("hdfs://test:9000/filetest"); //4、調用文件系統的方法上傳文件 fs.copyFromLocalFile(path, path2); //5、關閉文件流 fs.close(); }
6、從 HDFS 下載文件
//從hdfs下載文件到到本地windows系統 public static void copyToLocal() throws IOException, URISyntaxException{ //1、獲取文件系統對象 FileSystem fs = getFileSystem(); //2、指定下載的hdfs文件路徑 Path path = new Path("hdfs://test:9000/filetest/file.txt"); //3、指定本地接收的文件路徑 Path path2 = new Path("F://軟件all/微信/WeChat Files/WeChat Files/l1067021152/Files"); //4、調用文件系統的下載文件系統方法 fs.copyToLocalFile(path, path2); //5、關閉文件流 fs.close(); }
7、獲取 HDFS 集群節點信息
//獲取hdfs節點信息 public static void getNodeMessage() throws IOException, URISyntaxException{ //1、獲取文件系統對象 FileSystem fs = getFileSystem(); //2、獲取分布式文件系統對象 DistributedFileSystem hdfs = (DistributedFileSystem)fs; //3、獲取分布式系統所有節點信息 DatanodeInfo[] dataNodeStats = hdfs.getDataNodeStats(); //4、打印節點 for(int i = 0;i<dataNodeStats.length;i++){ System.out.println("datanode_"+i+"name:"+dataNodeStats[i].getHostName()); } }
8、查找某個文件在 HDFS 集群的位置
//查詢某個文件在集群中的位置信息 public static void getFileMessage() throws IOException, URISyntaxException{ //1、獲取分布式文件系統 FileSystem fs = getFileSystem(); //2、獲取某文件的路徑 Path path = new Path("hdfs://test:9000/filetest/file.txt"); //3、獲取某文件的目錄 FileStatus fileStatus = fs.getFileStatus(path); //4、獲取文件塊位置列表 BlockLocation[] fileBlockLocations = fs.getFileBlockLocations(fileStatus, 0, fileStatus.getLen()); //5、循環輸出塊信息 for (int i = 0; i < fileBlockLocations.length; i++) { String[] hosts = fileBlockLocations[i].getHosts(); System.out.println("block"+i+"location"+hosts[0]); } }
上述 Java API對 HDFS 的操作方法,完整代碼如下所示:
import java.io.IOException; import java.net.URI; import java.net.URISyntaxException; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.BlockLocation; import org.apache.hadoop.fs.FileStatus; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.FileUtil; import org.apache.hadoop.fs.Path; import org.apache.hadoop.hdfs.DistributedFileSystem; import org.apache.hadoop.hdfs.protocol.DatanodeInfo; public class FileTest { //獲取HDFS文件系統 public static FileSystem getFileSystem() throws IOException, URISyntaxException{ //1、獲取配置文件 Configuration conf = new Configuration(); // FileSystem fs = FileSystem.get(conf);//集群環境下直接獲取默認文件系統 //2、指定的文件系統地址 URI path = new URI("hdfs://test:9000"); //3、返回指定的文件系統地址 ------本地測試使用此方法 FileSystem fs = FileSystem.get(path, conf); /** * fs.close(); * Exception in thread "main" java.io.IOException: Filesystem closed at org.apache.hadoop.hdfs.DFSClient.checkOpen(DFSClient.java:795) at org.apache.hadoop.hdfs.DFSClient.primitiveMkdir(DFSClient.java:2743) at org.apache.hadoop.hdfs.DFSClient.mkdirs(DFSClient.java:2724) at org.apache.hadoop.hdfs.DistributedFileSystem$17.doCall(DistributedFileSystem.java:870) at org.apache.hadoop.hdfs.DistributedFileSystem$17.doCall(DistributedFileSystem.java:866) at org.apache.hadoop.fs.FileSystemLinkResolver.resolve(FileSystemLinkResolver.java:81) at org.apache.hadoop.hdfs.DistributedFileSystem.mkdirsInternal(DistributedFileSystem.java:866) at org.apache.hadoop.hdfs.DistributedFileSystem.mkdirs(DistributedFileSystem.java:859) at org.apache.hadoop.fs.FileSystem.mkdirs(FileSystem.java:1817) at com.dajiangtai.hdfsJavaAPI.FileTest.mkdir(FileTest.java:33) at com.dajiangtai.hdfsJavaAPI.FileTest.main(FileTest.java:46) * * */ return fs; } //創建文件目錄 public static void mkdir() throws IOException, URISyntaxException{ //1、調用剛剛獲得的HDFS文件系統,返回文件系統對象 FileSystem fs = getFileSystem(); //2、指定創建的文件系統路徑 fs.mkdirs(new Path("hdfs://test:9000/filetest")); for(int i=0;i<6;i++){ Path path = new Path("hdfs://test:9000/filetest/file"+i+".txt"); fs.create(path); } //3、關閉文件流 fs.close(); } //刪除文件操作 public static void rmFile() throws IOException, URISyntaxException{ //1、獲取文件系統對象 FileSystem fs = getFileSystem(); //刪除指定的文件系統路徑 fs.delete(new Path("hdfs://test:9000/filetest"),true); //3、關閉文件流 fs.close(); } //獲取目錄下的所有文件 public static void getAllFile() throws IOException, URISyntaxException{ //1、獲取文件系統對象 FileSystem fs = getFileSystem(); //2、獲取該目錄下的文件名稱---FileStatus獲取文件的元數據 FileStatus[] listStatus = fs.listStatus(new Path("hdfs://test:9000/filetest/")); //3.獲取文件的path路徑 Path[] stat2Paths = FileUtil.stat2Paths(listStatus); //4、循環遍歷路徑,輸出結果 for(Path path: stat2Paths){ System.out.println(path); } fs.close(); /**打印結果 * hdfs://test:9000/filetest/file0.txt hdfs://test:9000/filetest/file1.txt hdfs://test:9000/filetest/file2.txt hdfs://test:9000/filetest/file3.txt hdfs://test:9000/filetest/file4.txt hdfs://test:9000/filetest/file5.txt * */ } //上傳文件到hdfs public static void copyToHdfs() throws IOException, URISyntaxException{ //1、獲取文件系統對象 FileSystem fs = getFileSystem(); /* * Exception in thread "main" java.io.FileNotFoundException: File does not exist: /home/hadoop/app/hadoop-2.6.0/filetest/copyToHdfs.txt * * Exception in thread "main" java.lang.IllegalArgumentException: Pathname /C:/Users/yizhijing/Desktop/llllllll/file1.txt from C:/Users/yizhijing/Desktop/llllllll/file1.txt is not a valid DFS filename. * */ //本地文件路徑,並且集群中同文件目錄下不存在同名文件的情況下 //2、獲取本地文件路徑 Path path = new Path("D://file.txt"); //3、獲取集群文件路徑 Path path2 = new Path("hdfs://test:9000/filetest"); //4、調用文件系統的方法上傳文件 fs.copyFromLocalFile(path, path2); //5、關閉文件流 fs.close(); } //從hdfs下載文件到到本地windows系統 public static void copyToLocal() throws IOException, URISyntaxException{ //1、獲取文件系統對象 FileSystem fs = getFileSystem(); //2、指定下載的hdfs文件路徑 Path path = new Path("hdfs://test:9000/filetest/file.txt"); //3、指定本地接收的文件路徑 Path path2 = new Path("F://軟件all/微信/WeChat Files/WeChat Files/l1067021152/Files"); //4、調用文件系統的下載文件系統方法 fs.copyToLocalFile(path, path2); //5、關閉文件流 fs.close(); } //獲取hdfs節點信息 public static void getNodeMessage() throws IOException, URISyntaxException{ //1、獲取文件系統對象 FileSystem fs = getFileSystem(); //2、獲取分布式文件系統對象 DistributedFileSystem hdfs = (DistributedFileSystem)fs; //3、獲取分布式系統所有節點信息 DatanodeInfo[] dataNodeStats = hdfs.getDataNodeStats(); //4、打印節點 for(int i = 0;i<dataNodeStats.length;i++){ System.out.println("datanode_"+i+"name:"+dataNodeStats[i].getHostName()); } } //查詢某個文件在集群中的位置信息 public static void getFileMessage() throws IOException, URISyntaxException{ //1、獲取分布式文件系統 FileSystem fs = getFileSystem(); //2、獲取某文件的路徑 Path path = new Path("hdfs://test:9000/filetest/file.txt"); //3、獲取某文件的目錄 FileStatus fileStatus = fs.getFileStatus(path); //4、獲取文件塊位置列表 BlockLocation[] fileBlockLocations = fs.getFileBlockLocations(fileStatus, 0, fileStatus.getLen()); //5、循環輸出塊信息 for (int i = 0; i < fileBlockLocations.length; i++) { String[] hosts = fileBlockLocations[i].getHosts(); System.out.println("block"+i+"location"+hosts[0]); } } public static void main(String[] args) throws IOException, URISyntaxException { // getFileSystem(); // mkdir(); // rmFile(); // getAllFile(); // copyToHdfs(); // copyToLocal(); // getNodeMessage(); getFileMessage(); } }
運行程序
以上 Java API 操作 HDFS 的各種方法,在本地測試完成后,可以根據自己實際情況,稍加修改Path路徑就可以直接放到 Hadoop 環境下運行。大致需要以下幾步:
第一步:我們使用 myEclipse 將 FileTest.java 類打包為 FileTest.jar。因為這里不涉及第三方 jar 包,而且 Hadoop 集群上面已經存在 hadoop 所需要的jar包,所以我們只需要打包 FileTest.java 即可。
FileTest.jar
第二步:在hadoop用戶下,通過 xshell 客戶端,將 test.jar 上傳至 hadoop服務器本地目錄/home/hadoop/app/hadoop-2.6.0/filetest/的下面。
[hadoop@test djt]$ ls FileTest.jar
第3步:我們需要切換到 hadoop 的安裝目錄bin下來運行 FileTest.jar 文件,否則無法找到需要的 jar包來執行程序。
[hadoop@testhadoop-2.2.0-x64]$ hadoop jar /home/hadoop/djt/FileTest.jar 包名.類名

