龐雙玉
摘 要 本文討論JAVA語言中的流機(jī)制在HDFS分布式文件系統(tǒng)讀寫操作中的應(yīng)用,通過對比JAVA中的輸入和輸出流機(jī)制和HDFS的讀寫操作,闡述java流思想的本質(zhì),以及Java在分布式系統(tǒng)開發(fā)中的優(yōu)越性。
【關(guān)鍵詞】Java 分布式系統(tǒng) 數(shù)據(jù)
1 引言
Apache Hadoop是一個(gè)分布式開源的軟件系統(tǒng)框架。它被用于分布文式文件系統(tǒng)和用MAP/REUDUCE機(jī)制處理的大數(shù)據(jù)處理模型中。它包含多個(gè)由通用商業(yè)硬件組成的計(jì)算機(jī)集群。Hadoop中所有的模塊設(shè)計(jì)都基于一個(gè)基本的假設(shè)即硬件錯(cuò)誤是普遍發(fā)生并且可以自動(dòng)被處理的。
Hadoop的核心包括分布式的文件系統(tǒng)存儲(chǔ)即HDFS。Hadoop是用Java語言開發(fā)的,本文討論Java語言中的流機(jī)制在HDFS文件系統(tǒng)設(shè)計(jì)中的應(yīng)用。
2 Java語言中的流機(jī)制
流是java語言所特有的機(jī)制,把數(shù)據(jù)的存取想象成從一個(gè)源源不斷的數(shù)據(jù)流中讀取,在Java中,創(chuàng)建輸入和輸出流對象時(shí),以要操作的文件對象或者數(shù)據(jù)源頭作為構(gòu)造方法參數(shù),將輸入和輸出流與操作對象關(guān)聯(lián)。
流的一端可以是數(shù)據(jù)、設(shè)備、網(wǎng)絡(luò)、內(nèi)存,根據(jù)數(shù)據(jù)的流向,數(shù)據(jù)從網(wǎng)絡(luò),設(shè)備,內(nèi)存等到創(chuàng)建好的流,稱為輸入流,數(shù)據(jù)從創(chuàng)建好的流到網(wǎng)絡(luò),設(shè)備,內(nèi)存等,稱為輸出流。如圖1、圖2所示。
3 Hadoop和HDFS文件系統(tǒng)
Hadoop是Apach公司實(shí)現(xiàn)的一個(gè)框架,用Java語言開發(fā),從本質(zhì)上說,hadoop實(shí)現(xiàn)了一個(gè)分布式集群,這個(gè)集群中有一個(gè)master節(jié)點(diǎn)和多個(gè)slave節(jié)點(diǎn),核心機(jī)制是Map/Reduce數(shù)據(jù)處理機(jī)制和HDFS文件系統(tǒng),HDFS是分布式文件系統(tǒng),它采用數(shù)據(jù)塊和多節(jié)點(diǎn)備份機(jī)制,保證了高可靠性和容錯(cuò)性。
4 對HDFS文件系統(tǒng)的訪問
對HDFS文件系統(tǒng)的訪問,有兩種方式,一種通過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對象打開數(shù)據(jù)流
IOUtils.copyBytes(input,System.out,4096,false);
//IOUtils類實(shí)現(xiàn)字節(jié)復(fù)制,將URL所在的文件內(nèi)容輸出到控制臺(tái)
} catch (Exception e) {
System.err.println("Error");
}finally{
IOUtils.closeStream(input);
}
}
}
需要注意的是,程序中的static block代碼塊,這個(gè)代碼塊的作用是,將URL地址轉(zhuǎn)換為一個(gè)HDFS地址,但是JVM只能調(diào)用一次這樣的代碼塊。
通過java文件系統(tǒng)來訪問代碼:
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文件系統(tǒng)的訪問,無論采用以上哪種,都利用java數(shù)據(jù)流方式來訪問和讀寫數(shù)據(jù)。流式數(shù)據(jù)訪問的優(yōu)點(diǎn)在于,一次寫入,多次去讀取。
5 結(jié)論
Hadoop平臺(tái)本身就是用java實(shí)現(xiàn)的,Java語言跨平臺(tái)的天然特性,使其分別適合于分布式開發(fā),java中的流數(shù)據(jù)訪問機(jī)制,正是hadoop中HDFS分布式文件系統(tǒng)數(shù)據(jù)訪問的思想原型,流數(shù)據(jù)訪問特別適合于需要持續(xù)生成動(dòng)態(tài)數(shù)據(jù)的場景。流式數(shù)據(jù)訪問,解決了尋址耗時(shí)比較長的問題,更易于實(shí)現(xiàn)對數(shù)據(jù)的動(dòng)態(tài)的處理,并節(jié)省機(jī)器硬盤空間。
作者單位
深圳技師學(xué)院 廣東省深圳市 518000