Hadoop: the definitive guide 第三版 拾遗 第四章 之MapFile

本文转自:http://blog.csdn.net/hadoop_


MapFile即是已经排好序的SequenceFile,已加入用于搜索键的索引。

MapFile是排序后的SequenceFile,通过观察其目录结构可以看到MapFile由两部分组成,分别是data和index。即:

集群上文件:“hdfs://master:9000/mapfile/numbers.map/data”

                    “hdfs://master:9000/mapfile/numbers.map/index”

data即数据文件中包含所有需要存储的key-value对,按key的顺序排列。

index作为文件的数据索引,主要记录了每个Record的key值,以及该Record在文件中的偏移位置。在MapFile被访问的时候,索引文件会被加载到内存,通过索引映射关系可迅速定位到指定Record所在文件位置,因此,相对SequenceFile而言,MapFile的检索效率是高效的,缺点是会消耗一部分内存来存储index数据。
需注意的是,MapFile并不会把所有Record都记录到index中去,默认情况下每隔128条记录存储一个索引映射。当然,记录间隔可人为修改,通过MapFIle.Writer的setIndexInterval()方法,或修改io.map.index.interval属性;
另外,与SequenceFile不同的是,MapFile的KeyClass一定要实现WritableComparable接口,即Key值是可比较的。

下面给出MapFile的重建索引代码:

[java]  view plain copy
  1. package com.tht.hadoopIO;  
  2.   
  3. //cc MapFileFixer Re-creates the index for a MapFile  
  4. import java.net.URI;  
  5.   
  6. import org.apache.hadoop.conf.Configuration;  
  7. import org.apache.hadoop.fs.FileSystem;  
  8. import org.apache.hadoop.fs.Path;  
  9. import org.apache.hadoop.io.MapFile;  
  10. import org.apache.hadoop.io.SequenceFile;  
  11.   
  12. //vv MapFileFixer  
  13. public class MapFileFixer {  
  14.   
  15.     public static void main(String[] args) throws Exception {  
  16. //      String mapUri = args[0];  
  17.         String mapUri = "hdfs://master:9000/mapfile/numbers.map";  
  18.           
  19.         Configuration conf = new Configuration();  
  20.   
  21.         FileSystem fs = FileSystem.get(URI.create(mapUri), conf);  
  22.         Path map = new Path(mapUri);  
  23.         Path mapData = new Path(map, MapFile.DATA_FILE_NAME);  
  24.   
  25.         // Get key and value types from data sequence file  
  26.         SequenceFile.Reader reader = new SequenceFile.Reader(fs, mapData, conf);  
  27.         Class keyClass = reader.getKeyClass();  
  28.         Class valueClass = reader.getValueClass();  
  29.         reader.close();  
  30.   
  31.         // Create the map file index file  
  32.         long entries = MapFile.fix(fs, map, keyClass, valueClass, false, conf);  
  33.         System.out.printf("Created MapFile %s with %d entries\n", map, entries);  
  34.     }  
  35. }  
  36. // ^^ MapFileFixer  
在"hdfs://master:9000/mapfile/number.map/"下的"index"文件损坏,或没有时,可以用此方法来重建。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值