mapreduce的map端的分布式缓存

mapreduce的map端的分布式缓存

必要性:

  • 有的时候我们需要完成一些类似于数据库的两表join的效果,这个时候就能够通过将其中的一个表提前加载到map中来,这个时候有了将一张表的数据缓存到内存中来,方便map的快速读取。这里有两种方法可以实现这个效果,下面就一个一个讲解。
  • 注意:想要将表缓存进内存中,那么表的大小不能够超过缓存的大小,否则就会造成数据溢出,影响数据的准确性。

步骤:

1.开启缓存代码段如下

  • 代码1:
job.addCacheFile(new URI("file:///E:/Test-workspace/test/input/ss.txt"));
  • 说明:
    • 这一句代码的作用是运行程序的时候先将“file:///E:/Test-workspace/test/input/ss.txt”这个文件缓存到内存中‘。
    • map读取数据的时候直接在缓存中找这个数据就行了。

2.map中读取数据代码如下

  • 代码2:
/**
 * @description
 * @author: LuoDeSong [email protected]
 * @create: 2019-06-21 09:29:10
 **/
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;
		//将所有的数据都读出来然后装载到map中去
        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就行了。

注意:这里面关键点就是要开启缓存。

你可能感兴趣的:(大数据,MapReduce)