写在前面

本文隶属于专栏《1000个问题搞定大数据技术体系》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢!

本专栏目录结构和文献引用请见1000个问题搞定大数据技术体系

解答

MapFile 概述

MapFile 是排过序的 SequenceFile,由两部分构成,分别是 data 和 index。

index 作为文件的数据索引,主要记录了每个 Record 的 key 值,以及该 Record 在文件中的偏移位置。

在 MapFile 被访问的时候,索引文件会先被加载到内存,通过 index 映射关系可迅速定位到指定 Record 所在文件位置。

因此,相对于 SequenceFile 而言, MapFile 的检索效率更高,缺点是会消耗一部分内存来存储 index数据。

MapFile 写操作实现步骤

  1. 设置 Configuration
  2. 获取 FileSystem
  3. 设置文件输出路径
  4. MapFile.Writer()创建 MapFile.Writer写入
  5. 调用 MapFile.Writer.append追加写入
  6. 关闭流

代码示例

package com.shockang.study.bigdata.hdfs.mapfile;

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.io.MapFile;
import org.apache.hadoop.io.Text;

import java.net.URI;

public class MapFileWriter {
    private static final Configuration configuration = new Configuration();
    private static final String url = "hdfs://node1:8020";

    public static void main(String[] args) throws Exception {
        FileSystem fs = FileSystem.get(URI.create(url), configuration);
        Path outPath = new Path("MyMapFile.map");

        Text key = new Text();
        key.set("MyMapKey");
        Text value = new Text();
        value.set("MyMapValue");

        MapFile.Writer writer = new MapFile.Writer(configuration, fs, outPath.toString(), Text.class, Text.class);
        writer.append(key, value);
        IOUtils.closeStream(writer);
    }
}

MapFile 读操作实现步骤

  1. 设置 Configuration
  2. 获取 FileSystem
  3. 设置文件输入路径
  4. MapFile.Reader() 创建读取类 MapFile.Reader
  5. 获取 Key 与 Value 的 class
  6. 读取
  7. 关闭流

代码示例

package com.shockang.study.bigdata.hdfs.mapfile;

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.io.MapFile;
import org.apache.hadoop.io.Writable;
import org.apache.hadoop.io.WritableComparable;
import org.apache.hadoop.util.ReflectionUtils;

import java.net.URI;

public class MapFileReader {
    private static final Configuration conf = new Configuration();
    private static final String url = "hdfs://node1:8020";

    public static void main(String[] args) throws Exception {
        FileSystem fs = FileSystem.get(URI.create(url), conf);
        Path inPath = new Path("MyMapFile.map");
        MapFile.Reader reader = new MapFile.Reader(fs, inPath.toString(), conf);
        Writable keyClass = (Writable) ReflectionUtils.newInstance(reader.getKeyClass(), conf);
        Writable valueClass = (Writable) ReflectionUtils.newInstance(reader.getValueClass(), conf);
        while (reader.next((WritableComparable) keyClass, valueClass)) {
            System.out.println(keyClass);
            System.out.println(valueClass);
        }
        IOUtils.closeStream(reader);
    }
}
上一篇 下一篇