Hadoop分布式文件系统——HDFS的读写

        HDFS是运行在通用硬件平台上的可容错分布式文件系统。它优化了大文件的流式读取模式,适用于那些高吞吐并且对延迟性要求相对比较低的场景。它还通过文件“一次写入,多次读取”的简单策略保证了数据的一致性。HDFS亦使用了“块复制”的概念,让数据在集群的节点间进行复制,每个数据块复制的份数由“复制因子”决定。
        HDFS包含三个服务:
                A、NameNode:保存着集群中所有数据块位置的一个目录。
                B、Secondary NameNode:周期性同步NameNode的块索引数据。在同步处理中,Secondary NameNode下载NameNode的image文件和editlogs,并对它们做本地归并,最后再将归并完的image文件发回给NameNode。Secondary NameNode并不是NameNode的热备份,当NameNode故障的时候它并不能工作。
                C、DataNode:管理着从NameNode分配过来的数据块。它并不能感知集群中其他DataNode的存在,只和NameNode进行交互。
    一、HDFS的读写操作:

public class HdfsWriter extends Configured implements Tool {

    /* (non-Javadoc)
     * @see org.apache.hadoop.util.Tool#run(java.lang.String[])
     */
    @Override
    public int run(String[] arg0) throws Exception {
        String localInputPath = arg0[0];
        Path outputPath = new Path(arg0[1]);
        Configuration conf = getConf();
        FileSystem fs = FileSystem.get(conf);
        OutputStream os = fs.create(outputPath);
        InputStream is = new BufferedInputStream(new FileInputStream(localInputPath));
        IOUtils.copyBytes(is, os, conf);
        return 0;
    }

    public static void main(String[] args) {
        try {
            int returnCode = ToolRunner.run(new HdfsWriter(), args);
            System.exit(returnCode);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}
public class HdfsReader extends Configured implements Tool {

    /* (non-Javadoc)
     * @see org.apache.hadoop.util.Tool#run(java.lang.String[])
     */
    @Override
    public int run(String[] as) throws Exception {
        Path inputPath = new Path(as[0]);
        String localOutputPath = as[1];
        Configuration conf = getConf();
        FileSystem fs = FileSystem.get(conf);
        OutputStream os = new BufferedOutputStream(new FileOutputStream(localOutputPath));
        InputStream is = fs.open(inputPath);
        IOUtils.copyBytes(is, os, conf);
        return 0;
    }

    public static void main(String[] args) throws Exception {
        int returnCode = ToolRunner.run(new HdfsReader(), args);
        System.exit(returnCode);
    }

}

    二、读写原理:FileSystem是一个抽象类,代表一个通用文件系统。调用FileSystem.get()方法时,会将Hadoop配置中的fs.default.name参数(形式:hdfs://)作为URI,选择初始化一个正确的文件系统。create()方法返回JAVA I/O的OutputStream对象,open()方法返回JAVA I/O的InputStream对象。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章