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 694118297@qq.com
 * @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就行了。
注意:这里面关键点就是要开启缓存。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值