Hadoop權威指南:HDFS-寫入數據
FileSystem類有一系列的新建文件的方法.最簡單的方法是給准備建的文件指定一個Path對象,然后返回一個用於寫入數據的輸出流:
public FSDataOutputStream create(Path f) throws IOException
此方法有多個重載版本, 指定是否需要覆蓋現有文件,文件備份數量,寫入文件時所用緩沖區大小,文件塊大小及文件權限.
creata()方法能夠為需要寫入且當前不存在的文件創建父目錄.- 調用
exists()方法檢查目錄是否存在 - 還有一個重載方法
Progressable用於傳遞回調接口,可以把數據寫入進度通知給應用
package org.apache.hadoop.util;
public interface Progressable {
public void progress();
}
-
append()方法在一個已有文件末尾追加數據public FSDataOutputStream append(Path f) throws IOException
將本地文件復制到Hadoop文件系統
代碼
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;
import java.io.*;
import java.net.URI;
public class FileCopyWithProgress {
public static void main(String[] args) throws IOException {
String localSrc = args[0];
String dst = args[1];
InputStream in = new BufferedInputStream(new FileInputStream(localSrc));
Configuration conf = new Configuration();
FileSystem fs = FileSystem.get(URI.create(dst), conf);
OutputStream out = fs.create(new Path(dst), new Progressable() {
@Override
public void progress() {
System.out.print(".");
}
});
IOUtils.copyBytes(in, out, 4096, true);
}
}
編譯
javac FileCopyWithProgress
運行
hadoop FileCopyWithProgress localfile.tar hdfs://localhost:9000/user/hadoop/hdfsfile.tar
FSDataOutputStream對象
FileSystem實例的create()方法返回FSDataOutputStream對象,與FSDataInputStream類相似,也有一個查詢文件當前位置的方法
package org.apache.hadoop.fs
public class FSDataOutputStream extends DataOutputStream implements Syncable {
public long getPos() throws IOExcepiton {
// implementation elided
}
// implementation elided
}
FSDataOutputStream類不允許在文件中定位 不支持在除文件末尾之外的其他位置進行寫入
