Hadoop權威指南:HDFS-寫入數據


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類不允許在文件中定位 不支持在除文件末尾之外的其他位置進行寫入


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM