Web 界面查看 Nodes 信息
成功啟動后,可以訪問 Web 界面:? 查看 NameNode 和 Datanode 信息,還可以在線查看 HDFS 中的文件。
(6)運行 Hadoop 偽分布式實例(grep 例子)
①創建實例目錄 user/hadoop 上面的單機模式,grep 例子讀取的是本地數據,偽分布式讀取的則是 HDFS 上的數據。 要使用 HDFS,首先需要在 HDFS 中創建用戶目錄:
?./bin/hdfs dfs -mkdir -p /user/hadoop
接著將 ./etc/hadoop 中的 xml 文件作為輸入文件復制到分布式文件系統中,即將 /usr/local/hadoop/etc/hadoop 復制到分布式文件系統中的 /user/hadoop/input 中。
我們使用的是 hadoop 用戶,并且已創建相應的用戶目錄 /user/hadoop ,因此在命令中就可 以使用相對路徑如 input,其對應的絕對路徑就是 /user/hadoop/input
②創建實例目錄 user/hadoop/input,并復制所有的.xml 文件
?./bin/hdfs dfs -mkdir input ./bin/hdfs dfs -put ./etc/hadoop/*.xml input?
復制完成后,可以通過如下命令查看文件列表:
./bin/hdfs dfs -ls input
偽分布式運行 MapReduce 作業的方式跟單機模式相同,區別在于偽分布式讀取的是 HDFS 中的文件(可以將單機步驟中創建的本地 input 文件夾,輸出結果 output 文件夾都刪掉來 驗證這一點)。
③運行實例
./bin/hadoop jar ./share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar grep input output 'dfs[a-z.]+'
查看運行結果的命令(查看的是位于 HDFS 中的輸出結果):
?./bin/hdfs dfs -cat output/*?
結果如下,注意到剛才我們已經更改了配置文件,所以運行結果不同。
④下載文件 我們也可以將運行結果取回到本地:
?rm -r ./output ? ?# 先刪除本地的 output 文件夾(如果存在)
?./bin/hdfs dfs -get output ./output ? ? # 將 HDFS 上的 output 文件夾拷貝到本機?
?cat ./output/*?
Hadoop 運 行 程 序 時 , 輸 出 目 錄 不 能 存 在 , 否 則 會 提 示 錯 誤
? ? org.apache.hadoop.mapred.FileAlreadyExistsException: Output directory
? ? hdfs://localhost:9000/user/hadoop/output already exists
,因此若要再次執行,需要執行如 下命令刪除 output 文件夾:
?./bin/hdfs dfs -rm -r output ? ?# 刪除 output 文件夾?
錯誤:運行程序時,輸出目錄不能存在
運行 Hadoop 程序時,為了防止覆蓋結果,程序指定的輸出目錄(如 output) 不能存在,否則會提示錯誤,因此運行前需要先刪除輸出目錄。在實際開發應 用程序時,可考慮在程序中加上如下代碼,能在每次運行時自動刪除輸出目 錄,避免繁瑣的命令行操作:
Configuration conf = new Configuration();?
Job job = new Job(conf);?
/* 刪除輸出目錄 */?
Path outputPath = new Path(args[1]); outputPath.getFileSystem(conf).delete(outputPath, true);?
Configuration conf = new Configuration();?
Job job = new Job(conf);?
/* 刪除輸出目錄 */?
Path outputPath = new Path(args[1]); outputPath.getFileSystem(conf).delete(outputPath, true);?
?