Hadoop API的讀取資料 - twilighthook/BigDataNote GitHub Wiki

Hadoop API讀取資料 code

1. 用HADOOP URL讀取檔案

要讀取Hadoop資料可以藉由java.net.URL開啟一個資料流。

InputStream in = null;
try {
	in = new URL("hdfs://host/path").openStream();
	//process
} catch (Exception e) {
	e.printStackTrace();
} finally {
	IOUtils.closeStream(in);
}

而要讓JAVA可以辨識hdfs的路徑,要呼叫URL的setURLStreamHandlerFactory靜態方法,並傳入FsUrlStreamHandlerFactory的實例作為參數。 再藉由IOUtils讀取並輸出檔案。

public class URLCat {

	static {
		URL.setURLStreamHandlerFactory(new FsUrlStreamHandlerFactory());
	}

	public static void main(String[] args) {
		InputStream in = null;
		try {
			in = new URL(args[0]).openStream();
			IOUtils.copyBytes(in, System.out, 4096, false);
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			IOUtils.closeStream(in);
		}
	}

}

2. 用FileSystem API讀取資料

FileSystem是通用的API,在這邊實作會需要一個Configuration來取得客戶端或伺服端的設定,例如hadoop裡的core-site.xml設定。

public class FileSystemCat {

	public static void main(String[] args) throws IOException {
		String uri = args[0];
		Configuration conf = new Configuration();
		FileSystem fs = FileSystem.get(URI.create(uri), conf);
		InputStream in = null;
		try {
			in = fs.open(new Path(uri));
			IOUtils.copyBytes(in, System.out, 4096, false);
		}catch (Exception e) {
			e.printStackTrace();
		}finally {
			IOUtils.closeStream(in);
		}
	}
	
}

3. 利用seek()來移動標頭位置

try {
	in = fs.open(new Path(uri));
	IOUtils.copyBytes(in, System.out, 4096, false);
	in.seek(0);
	IOUtils.copyBytes(in, System.out, 4096, false);
}

在code的部分將改寫成上述程式碼,可以將讀取標頭移至最前面,再次的讀取檔案。