東莞建筑公司排行榜windows優(yōu)化大師和360哪個好
文章目錄
- 一、實驗目標
- 二、實驗要求
- 三、實驗內(nèi)容
- 四、實驗步驟
一、實驗目標
- 熟練掌握hadoop操作指令及HDFS命令行接口
- 掌握HDFS原理
- 熟練掌握HDFS的API使用方法
- 掌握單個本地文件寫入到HDFS文件的方法
- 掌握多個本地文件批量寫入到HDFS文件的方法
二、實驗要求
- 給出主要實驗步驟成功的效果截圖。
- 要求分別在本地和集群測試,給出測試效果截圖。
- 對本次實驗工作進行全面的總結。
- 完成實驗內(nèi)容后,實驗報告文件名顯示學號姓名信息。
三、實驗內(nèi)容
-
使用FileSystem將單個本地文件寫入到HDFS中當前不存在的文件,實現(xiàn)效果參考下圖:
-
使用FileSystem將本地文件追加到HDFS中當前存在的文件中,實現(xiàn)效果參考下圖:
四、實驗步驟
- 使用FileSystem將單個本地文件寫入到HDFS中當前不存在的文件
程序設計
package hadoop;import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.net.URI;import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataOutputStream;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IOUtils;public class WJW {public static void main(String[] args) {// TODO Auto-generated method stubargs = new String[2];args[0] = "/home/zkpk/experiment/wjw01.txt";args[1] = "hdfs://master:9000/wjw02.txt";Configuration conf = new Configuration();BufferedInputStream in = null;FileSystem fs = null;FSDataOutputStream out = null;try{in = new BufferedInputStream(new FileInputStream(args[0]));fs = FileSystem.get(URI.create(args[1]), conf);out = fs.create(new Path(args[1]));IOUtils.copyBytes(in, out, 4096, false);}catch(FileNotFoundException e){e.printStackTrace();}catch(IOException e){e.printStackTrace();}finally{IOUtils.closeStream(in);IOUtils.closeStream(out);if(fs != null){try{fs.close();}catch(IOException e){e.printStackTrace();}}}}}
程序分析
該代碼實現(xiàn)了將本地文件上傳到Hadoop分布式文件系統(tǒng)HDFS中的功能。代碼結構簡單明了,主要包括以下幾個步驟:
-
定義參數(shù)args,參數(shù)args[0]表示本地文件路徑,參數(shù)args[1]表示HDFS文件路徑。
-
創(chuàng)建Configuration對象,用于讀取Hadoop配置信息。
-
創(chuàng)建BufferedInputStream流,讀取本地文件。
-
使用FileSystem.get()方法獲取Hadoop分布式文件系統(tǒng)實例。
-
調(diào)用fs.create()方法,創(chuàng)建HDFS文件,并返回FSDataOutputStream對象用于向HDFS文件寫入數(shù)據(jù)。
-
調(diào)用IOUtils.copyBytes()方法,將本地文件數(shù)據(jù)復制到HDFS文件中。
-
關閉流和Hadoop分布式文件系統(tǒng)實例。
該代碼主要涉及以下幾個重要知識點:
-
Configuration對象:該對象用于讀取Hadoop配置信息,如HDFS的地址、端口等信息。
-
FileSystem對象:該對象用于操作Hadoop分布式文件系統(tǒng),如創(chuàng)建文件、刪除文件、讀取文件等操作。
-
BufferedInputStream流:該流用于讀取本地文件數(shù)據(jù)。
-
FSDataOutputStream對象:該對象用于向HDFS文件寫入數(shù)據(jù)。
-
IOUtils.copyBytes()方法:該方法用于將輸入流中的數(shù)據(jù)復制到輸出流中。
總體來說,該代碼實現(xiàn)了將本地文件上傳到HDFS的功能,但還有一些需要改進的地方。例如,可以添加參數(shù)校驗功能,防止空指針異常;可以添加日志輸出功能,方便查看程序運行情況。
運行結果
- 使用FileSystem將本地文件追加到HDFS中當前存在的文件中
程序設計
package hadoop;import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.net.URI;import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataOutputStream;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IOUtils;public class WJW01 {public static void main(String[] args) {// TODO Auto-generated method stubargs = new String[2];args[0] = "/home/zkpk/experiment/wjw01.txt";args[1] = "hdfs://master:9000/wjw02.txt";Configuration conf = new Configuration();conf.set("fs.client.block.write.replace-datanode-on-failure.enable", "true");conf.set("fs.client.block.write.replace-datanode-on-failure.policy", "Never");BufferedInputStream in = null;FileSystem fs = null;FSDataOutputStream out = null;try{in = new BufferedInputStream(new FileInputStream(args[0]));fs = FileSystem.get(URI.create(args[1]), conf);out = fs.append(new Path(args[1]));IOUtils.copyBytes(in, out, 4096, false);}catch(FileNotFoundException e){e.printStackTrace();}catch(IOException e){e.printStackTrace();}finally{IOUtils.closeStream(in);IOUtils.closeStream(out);if(fs != null){try{fs.close();}catch(IOException e){e.printStackTrace();}}}}}
程序分析
該代碼實現(xiàn)了將本地文件追加上傳到Hadoop分布式文件系統(tǒng)HDFS中的功能。代碼結構與上傳文件功能類似,主要包括以下幾個步驟:
-
定義參數(shù)args,參數(shù)args[0]表示本地文件路徑,參數(shù)args[1]表示HDFS文件路徑。
-
創(chuàng)建Configuration對象,用于讀取Hadoop配置信息。
-
設置配置信息:設置“fs.client.block.write.replace-datanode-on-failure.enable”為“true”,表示在數(shù)據(jù)節(jié)點故障時啟用塊寫入數(shù)據(jù)節(jié)點更換機制;設置“fs.client.block.write.replace-datanode-on-failure.policy”為“Never”,表示塊寫入數(shù)據(jù)節(jié)點故障時不替換數(shù)據(jù)節(jié)點。
-
創(chuàng)建BufferedInputStream流,讀取本地文件。
-
使用FileSystem.get()方法獲取Hadoop分布式文件系統(tǒng)實例。
-
調(diào)用fs.append()方法,獲取FSDataOutputStream對象用于向HDFS文件追加數(shù)據(jù)。
-
調(diào)用IOUtils.copyBytes()方法,將本地文件數(shù)據(jù)復制追加到HDFS文件中。
-
關閉流和Hadoop分布式文件系統(tǒng)實例。
需要注意的是,該代碼使用了追加上傳文件的方式,因此可以將本地文件的數(shù)據(jù)追加到HDFS文件的末尾,而不會影響原有的HDFS文件數(shù)據(jù)。同時,設置數(shù)據(jù)節(jié)點更換機制可以提高系統(tǒng)的可靠性和穩(wěn)定性,避免數(shù)據(jù)節(jié)點故障導致數(shù)據(jù)丟失的情況。
總體來說,該代碼實現(xiàn)了將本地文件追加上傳到HDFS的功能,并且考慮了系統(tǒng)的可靠性和穩(wěn)定性問題。但是,同樣需要注意代碼中的參數(shù)校驗和日志輸出等問題,以提高代碼的健壯性和可維護性。
運行結果