本文主要是介绍一篇文章搞懂HDFS MapFile是什么,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
写在前面
本文隶属于专栏《1000个问题搞定大数据技术体系》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢!
本专栏目录结构和文献引用请见1000个问题搞定大数据技术体系
解答
MapFile 概述
MapFile 是排过序的 SequenceFile,由两部分构成,分别是 data 和 index。
index 作为文件的数据索引,主要记录了每个 Record 的 key 值,以及该 Record 在文件中的偏移位置。
在 MapFile 被访问的时候,索引文件会先被加载到内存,通过 index 映射关系可迅速定位到指定 Record 所在文件位置。
因此,相对于 SequenceFile 而言, MapFile 的检索效率更高,缺点是会消耗一部分内存来存储 index数据。
MapFile 写操作实现步骤
- 设置 Configuration
- 获取 FileSystem
- 设置文件输出路径
- MapFile.Writer()创建 MapFile.Writer写入
- 调用 MapFile.Writer.append追加写入
- 关闭流
代码示例
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 读操作实现步骤
- 设置 Configuration
- 获取 FileSystem
- 设置文件输入路径
- MapFile.Reader() 创建读取类 MapFile.Reader
- 获取 Key 与 Value 的 class
- 读取
- 关闭流
代码示例
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);}
}
这篇关于一篇文章搞懂HDFS MapFile是什么的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!