Hadoop-寫入資料的幾種方式

不挑食的程式猿發表於2016-03-24

create(新建)

import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URI;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IOUtils;
import org.apache.hadoop.util.Progressable;

public class FileCopyShowProgress {
	
	public static void main(String[] args) throws Exception{
		String inPath="D:\\file1.txt";//本地路徑
		String outPath="hdfs://master:9000/input/file1.txt";//hdfs的路徑
		InputStream in =new BufferedInputStream(new FileInputStream(inPath));
		Configuration conf=new Configuration();
                //create在寫入檔案時會自動產生所有的父目錄
		FileSystem fs=FileSystem.get(URI.create(outPath),conf);
		OutputStream out =fs.create(new Path(outPath),new Progressable() {
			
			@Override
			public void progress() {
				System.out.print(".");
			}
		});
		IOUtils.copyBytes(in, out, 4096,true);
	}
	
}

FSDataOutputStream不允許定位,因為HDFS只允許對一個開啟的檔案順序寫入,或向一個已有檔案新增(換句話說,不支援除尾部的其他位置的寫入)。

OutputStream out =fs.create(new Path(outPath),new Progressable() {
//替換為
FSDataOutputStream out =fs.create(new Path(outPath),new Progressable() {

相關文章