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类不允许在文件中定位 不支持在除文件末尾之外的其他位置进行写入

posted @ 2016-08-02 21:12  bovenson  阅读(5317)  评论(0编辑  收藏  举报