龐雙玉
摘 要 本文討論JAVA語言中的流機制在HDFS分布式文件系統讀寫操作中的應用,通過對比JAVA中的輸入和輸出流機制和HDFS的讀寫操作,闡述java流思想的本質,以及Java在分布式系統開發中的優越性。
【關鍵詞】Java 分布式系統 數據
1 引言
Apache Hadoop是一個分布式開源的軟件系統框架。它被用于分布文式文件系統和用MAP/REUDUCE機制處理的大數據處理模型中。它包含多個由通用商業硬件組成的計算機集群。Hadoop中所有的模塊設計都基于一個基本的假設即硬件錯誤是普遍發生并且可以自動被處理的。
Hadoop的核心包括分布式的文件系統存儲即HDFS。Hadoop是用Java語言開發的,本文討論Java語言中的流機制在HDFS文件系統設計中的應用。
2 Java語言中的流機制
流是java語言所特有的機制,把數據的存取想象成從一個源源不斷的數據流中讀取,在Java中,創建輸入和輸出流對象時,以要操作的文件對象或者數據源頭作為構造方法參數,將輸入和輸出流與操作對象關聯。
流的一端可以是數據、設備、網絡、內存,根據數據的流向,數據從網絡,設備,內存等到創建好的流,稱為輸入流,數據從創建好的流到網絡,設備,內存等,稱為輸出流。如圖1、圖2所示。
3 Hadoop和HDFS文件系統
Hadoop是Apach公司實現的一個框架,用Java語言開發,從本質上說,hadoop實現了一個分布式集群,這個集群中有一個master節點和多個slave節點,核心機制是Map/Reduce數據處理機制和HDFS文件系統,HDFS是分布式文件系統,它采用數據塊和多節點備份機制,保證了高可靠性和容錯性。
4 對HDFS文件系統的訪問
對HDFS文件系統的訪問,有兩種方式,一種通過java.net.URL訪問,一種是通過FileSystem來訪問。
通過URL訪問代碼:
HDFS的API使用:
public class ExCat {
static{
URL.setURLStreamHandlerFactory(new FsUrlStreamHandlerFactory());
}
public static void main(String[] args) {
InputStream input=null;
try {
input = new URL(args[0]).openStream();
//使用java.net.URL對象打開數據流
IOUtils.copyBytes(input,System.out,4096,false);
//IOUtils類實現字節復制,將URL所在的文件內容輸出到控制臺
} catch (Exception e) {
System.err.println("Error");
}finally{
IOUtils.closeStream(input);
}
}
}
需要注意的是,程序中的static block代碼塊,這個代碼塊的作用是,將URL地址轉換為一個HDFS地址,但是JVM只能調用一次這樣的代碼塊。
通過java文件系統來訪問代碼:
packageTestHdfs;
importjava.io.BufferedInputStream;
importjava.io.FileInputStream;
importjava.io.FileNotFoundException;
importjava.io.InputStream;
importjava.io.OutputStream;
importjava.net.URI;
importorg.apache.hadoop.conf.Configuration;
importorg.apache.hadoop.fs.FSDataOutputStream;
importorg.apache.hadoop.fs.FileSystem;
importorg.apache.hadoop.fs.Path;
importorg.apache.hadoop.io.IOUtils;
public class FileCopyFromLocal {
public static void main(String[] args) throws Exception {
String sr="/usr/local/filecontent/exmple";
//本地路徑文件
String des="hdfs://neusoft-master:9000/data/test";
//HDFS的路徑
InputStream in = new BufferedInputStream(new FileInputStream(sr));
//HDFS讀寫的配置文件
Configuration con = new Configuration();
FileSystemfs = FileSystem.get(URI.create(des),con);
OutputStream out = fs.create(new Path(des));
IOUtils.copyBytes(in, out, 4096, true);
}
}
從上面兩種方式,我們可以看出,對HDFS文件系統的訪問,無論采用以上哪種,都利用java數據流方式來訪問和讀寫數據。流式數據訪問的優點在于,一次寫入,多次去讀取。
5 結論
Hadoop平臺本身就是用java實現的,Java語言跨平臺的天然特性,使其分別適合于分布式開發,java中的流數據訪問機制,正是hadoop中HDFS分布式文件系統數據訪問的思想原型,流數據訪問特別適合于需要持續生成動態數據的場景。流式數據訪問,解決了尋址耗時比較長的問題,更易于實現對數據的動態的處理,并節省機器硬盤空間。
作者單位
深圳技師學院 廣東省深圳市 518000