mapreduce的map端的分布式缓存
必要性:
- 有的时候我们需要完成一些类似于数据库的两表join的效果,这个时候就能够通过将其中的一个表提前加载到map中来,这个时候有了将一张表的数据缓存到内存中来,方便map的快速读取。这里有两种方法可以实现这个效果,下面就一个一个讲解。
- 注意:想要将表缓存进内存中,那么表的大小不能够超过缓存的大小,否则就会造成数据溢出,影响数据的准确性。
步骤:
1.开启缓存代码段如下
job.addCacheFile(new URI("file:///E:/Test-workspace/test/input/ss.txt"));
- 说明:
- 这一句代码的作用是运行程序的时候先将“file:///E:/Test-workspace/test/input/ss.txt”这个文件缓存到内存中‘。
- map读取数据的时候直接在缓存中找这个数据就行了。
2.map中读取数据代码如下
public class CacheMap extends Mapper<LongWritable, Text, Text, Text> {
HashMap<String, String> pdMap = new HashMap<String, String>();
@Override
protected void setup(Context context) throws IOException {
BufferedReader bufferedReader = null;
bufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream("ss.txt")));
String line = null;
while ((line = bufferedReader.readLine()) != null) {
String[] strings = line.split(",");
pdMap.put(strings[0], strings[1]);
}
bufferedReader.close();
}
@Override
protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
String[] split = value.toString().split(",");
String depat = pdMap.get(split[2]);
String info = value.toString() + "," + depat;
context.write(new Text(""), new Text(info));
}
}
- 说明
- 首先要做的是定义一个map来存储小表的信息,这其中的下表就是部门对应的信息;
- 在setup方法中提前读取出来存储在缓存中的小表信息,然后存储在前面准备的map中;因为setup的执行是在所有的map方法之前,也就是初始化的时候。
- 在map方法中执行数据逻辑的代码,每次读取出来一条数据后就去map中匹配出该条数据在map中村的需要装载的数据,然后装载在自己的数据上输出到reduce就行了。
注意:这里面关键点就是要开启缓存。