博客
关于我
【MapReduce】基础案例 ---- Map Join 实现数据合并(缓存表)
阅读量:325 次
发布时间:2019-03-04

本文共 4279 字,大约阅读时间需要 14 分钟。


文章目录


Map Join

① Map Join工作原理

  • 1.使用场景

    Map Join适用于一张表十分小、一张表很大的场景

  • 2.优点

    • 思考:在Reduce端处理过多的表,非常容易产生数据倾斜。怎么办?
      • 在Map端缓存多张表,提前处理业务逻辑,这样增加Map端业务,减少Reduce端数据的压力,尽可能的减少数据倾斜
  • 3.具体办法:采用DistributedCache

    (1)在Mapper的setup阶段,将文件读取到缓存集合中。

    (2)在驱动函数中加载缓存。

// 缓存普通文件到Task运行节点。job.addCacheFile(new URI("file://e:/cache/pd.txt"));


② Map Join 案例

☠ 需求分析

  • Map Join适用于关联表中有小表的情形
    在这里插入图片描述


☠ 代码实现

Mapper阶段

package 第三章_MR框架原理.多种join应用;import org.apache.commons.lang.StringUtils;import org.apache.hadoop.io.IOUtils;import org.apache.hadoop.io.LongWritable;import org.apache.hadoop.io.NullWritable;import org.apache.hadoop.io.Text;import org.apache.hadoop.mapreduce.Mapper;import java.io.BufferedReader;import java.io.FileInputStream;import java.io.IOException;import java.io.InputStreamReader;import java.net.URI;import java.util.HashMap;public class DistributedCacheMapper extends Mapper
{ Text k = new Text(); // 创建集合存储拆分的数据信息 HashMap pdMap = new HashMap
(); /** * 重写setUp方法 * @param context * @throws IOException * @throws InterruptedException */ @Override protected void setup(Context context) throws IOException, InterruptedException { // 1.缓存小表 // 1.1获取要缓存的文件路径 // 1.1.1 首先获取缓存文件 URI[] cacheFiles = context.getCacheFiles(); // 1.1.2 通过缓存文件获取其路径 String path = cacheFiles[0].getPath().toString(); // 1.2 读取文件信息 BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(path),"UTF-8")); String line; while (StringUtils.isNotEmpty(line = reader.readLine())){ //pid pname //01 小米 // 1.3 拆分 String[] fields = line.split("\t"); // 1.4 添加到集合中,将pid作为key,通过pid获取pname,后续写到order表中 pdMap.put(fields[0],fields[1]); } // 1.5 关闭资源 IOUtils.closeStream(reader); } /** * 在map阶段进行join操作 */ @Override protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException { // id pid amount // 1001 01 1 // pid pname // 01 小米 // 1.获取一行数据 String line = value.toString(); // 2.拆分 String[] fields = line.split("\t"); // 3.获取pid,到对应的pdMap中找出pname写入 String pid = fields[1]; String pname = (String) pdMap.get(pid); // 4.拼接 line = line + "\t" + pname; k.set(line); // 5.写出 context.write(k,NullWritable.get()); }}


Driver阶段

package 第三章_MR框架原理.多种join应用;import java.net.URI;import org.apache.hadoop.conf.Configuration;import org.apache.hadoop.fs.Path;import org.apache.hadoop.io.NullWritable;import org.apache.hadoop.io.Text;import org.apache.hadoop.mapreduce.Job;import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;public class DistributedCacheDriver {       public static void main(String[] args) {           Configuration configuration = new Configuration();        Job job = null;        try {               // 1 获取job信息            job = Job.getInstance(configuration);            // 2 设置加载jar包路径            job.setJarByClass(DistributedCacheDriver.class);            // 3 关联map            job.setMapperClass(DistributedCacheMapper.class);            // 4 设置最终输出数据类型            job.setOutputKeyClass(Text.class);            job.setOutputValueClass(NullWritable.class);            // 5 设置输入输出路径            FileInputFormat.setInputPaths(job, new Path("G:\\Projects\\IdeaProject-C\\MapReduce\\src\\main\\java\\第三章_MR框架原理\\多种join应用\\data\\order.txt"));            FileOutputFormat.setOutputPath(job, new Path("G:\\Projects\\IdeaProject-C\\MapReduce\\src\\main\\java\\第三章_MR框架原理\\多种join应用\\cacheoutput"));            // 6 加载缓存数据表            job.addCacheFile(new URI("file:///G:/Projects/IdeaProject-C/MapReduce/src/main/java/第三章_MR框架原理/多种join应用/data/pd.txt"));            // 7 Map端Join的逻辑不需要Reduce阶段,设置reduceTask数量为0            job.setNumReduceTasks(0);            // 8 提交            boolean result = job.waitForCompletion(true);            System.exit(result ? 0 : 1);        } catch (Exception e) {               e.printStackTrace();        }    }}

在这里插入图片描述


☠ 总结

  • 可以明显看出,在Map阶段进行join操作,不需要使用Reduce,合并的操作完全在Mapper阶段完成,充分利用了map阶段的资源,并且有效避免了Reduce阶段的数据倾斜情况。


转载地址:http://hueq.baihongyu.com/

你可能感兴趣的文章
NIFI大数据进阶_FlowFile生成器_GenerateFlowFile处理器_ReplaceText处理器_处理器介绍_处理过程说明---大数据之Nifi工作笔记0019
查看>>
NIFI大数据进阶_FlowFile生成器_GenerateFlowFile处理器_ReplaceText处理器_实际操作---大数据之Nifi工作笔记0020
查看>>
NIFI大数据进阶_Json内容转换为Hive支持的文本格式_实际操作_02---大数据之Nifi工作笔记0032
查看>>
NIFI大数据进阶_Json内容转换为Hive支持的文本格式_操作方法说明_01_EvaluteJsonPath处理器---大数据之Nifi工作笔记0031
查看>>
NIFI大数据进阶_Kafka使用相关说明_实际操作Kafka消费者处理器_来消费kafka数据---大数据之Nifi工作笔记0037
查看>>
NIFI大数据进阶_Kafka使用相关说明_实际操作Kafka生产者---大数据之Nifi工作笔记0036
查看>>
NIFI大数据进阶_NIFI的模板和组的使用-介绍和实际操作_创建组_嵌套组_模板创建下载_导入---大数据之Nifi工作笔记0022
查看>>
NIFI大数据进阶_NIFI监控功能实际操作_Summary查看系统和处理器运行情况_viewDataProvenance查看_---大数据之Nifi工作笔记0026
查看>>
NIFI大数据进阶_NIFI监控的强大功能介绍_处理器面板_进程组面板_summary监控_data_provenance事件源---大数据之Nifi工作笔记0025
查看>>
NIFI大数据进阶_NIFI集群知识点_认识NIFI集群以及集群的组成部分---大数据之Nifi工作笔记0014
查看>>
NIFI大数据进阶_NIFI集群知识点_集群的断开_重连_退役_卸载_总结---大数据之Nifi工作笔记0018
查看>>
NIFI大数据进阶_使用NIFI表达式语言_来获取自定义属性中的数据_NIFI表达式使用体验---大数据之Nifi工作笔记0024
查看>>
NIFI大数据进阶_内嵌ZK模式集群1_搭建过程说明---大数据之Nifi工作笔记0015
查看>>
NIFI大数据进阶_内嵌ZK模式集群2_实际操作搭建NIFI内嵌模式集群---大数据之Nifi工作笔记0016
查看>>
NIFI大数据进阶_外部ZK模式集群1_实际操作搭建NIFI外部ZK模式集群---大数据之Nifi工作笔记0017
查看>>
NIFI大数据进阶_实时同步MySql的数据到Hive中去_可增量同步_实时监控MySql数据库变化_实际操作_03---大数据之Nifi工作笔记0035
查看>>
NIFI大数据进阶_实时同步MySql的数据到Hive中去_可增量同步_实时监控MySql数据库变化_操作方法说明_01---大数据之Nifi工作笔记0033
查看>>
NIFI大数据进阶_实时同步MySql的数据到Hive中去_可增量同步_实时监控MySql数据库变化_操作方法说明_02---大数据之Nifi工作笔记0034
查看>>
NIFI大数据进阶_离线同步MySql数据到HDFS_01_实际操作---大数据之Nifi工作笔记0029
查看>>
NIFI大数据进阶_离线同步MySql数据到HDFS_02_实际操作_splitjson处理器_puthdfs处理器_querydatabasetable处理器---大数据之Nifi工作笔记0030
查看>>