本章重点概括
TODO
链接MapReduce作业
顺序链接
- 这种任务可以手动的逐个执行,但生成自动化执行序列的方式更为便捷。
mapreduce-1 | mapreduce-2 | mapreduce-3 | …
具复杂依赖的作业链接(非线性链接)
- 通过Job和JobControl类来管理依赖
- JobControl类负责管理并监控作业的执行
- JobControl对象使用addJob()方法向其中添加作业
- 为所有作业添加依赖关系,然后调用JobControl的run()方法,生成一个线程来提交作业并监视其执行。
预处理和后处理阶段的链接
- 大量的数据处理任务涉及对及记录的预处理和后处理。
- 为预处理和后处理各自编写一个MR作业并连接的方法十分低效–>因为过程中每一步的中间结果都要占用I/O和存储资源
- 引入ChainMapper&ChainReducer
- Map1 | Map2 | Reduce | Map3 | Map4 ,这里可以将Map2和Reduce视为MR作业的核心,其间进行标准的分区和洗牌,将Map1视为前处理步骤,Map3和Map4作为后处理步骤。可以使用driver设定该序列的构成,需要确保的是任务之间键值的类型匹配。
// Demo usage of ChainMapper&ChainReducer
// 1. init a global JobConf Object job, then set JobName、In/OutputFormat、In/OutputPath
// 2. Use the static function ChainMapper.addMapper to add Map step to job
// 3. JobClient.runJob(job);
Configuration conf = getConf();
JobConf job = new JobConf(conf); // global JobConf Object
job.setJobName("ChainJob");
job.setInputFormat(TextInputFormat.class);
job.setOutputFormat(TextOutputFormat.class);
FileInputFormat.setInputPaths(job, in); // More
FileOutputFormat.setOutputPath(job, out); //More
JobConf map1Conf = new JobConf(false);
// add Map1 step to job
ChainMapper.addMapper(job, Map1.class, LongWritable.class, Text.class, Text.class, Text.class, true, map1Conf); //static function
JobConf map2Conf = new JobConf(false);
// add Map2 step to job
ChainMapper.addMapper(job, Map1.class, LongWritable.class, Text.class, Text.class, Text.class, true, map2Conf); //static function
JobConf reduceConf = new JobConf(false);
// add Reduce step to job
ChainReducer.setReducer(job, Reduce.class, LongWritable.class, Text.class, Text.class, Text.class, true, reduceConf); //static function
//...
JobClient.runJob(job);
联结不同来源的数据
Reduce侧的联结
- 内联结的demo:
- 如何给map()的输出打tag,以标记数据来源(不同table)–>mapper:封装记录
- 如何在reduce侧实现combine()(实现联结)
- 使用DTATJOIN软件包:
- 三个可供集成和具体化的抽象类: DataJoinMapperBase、DataJoinReducerBase、TaggedMapOutput
- 新抽象数据类型TaggedMapOutput来给map()输出打tag ==> TaggedMapOutput是一种用Text标签封装记录的数据类型,具体实现了getTag()和setTag()[子类将实现该方法来处理记录的类型],以及readFields()和write()方法[for输出必须为Writable类型]。
- 继承DataJoinReducerBase并实现combine()方法来筛选掉不需要的组合,并将合并结果格式化为合适的输出格式。
基于DistributedCache的复制联结
- reduce侧联结的改进:效率的提升 –> 在map阶段去除不必要的数据
- 改进:利用一种频繁出现的数据模式 –> 连接大数据时,往往只有一个数据源较大,第二个数据
源可能会小几个数量级。 - 实现: 降较小的数据源赋值到所有mapper –> 复制联结
半联结: map侧过滤后在reduce侧联结
- 复制连接的限制之一是:其中一个链接表必须小到可以放在内存中。
创建一个Bloom filter
About Bloom filter
- https://en.wikipedia.org/wiki/Bloom_filter
- A space-efficient probabilistic data structure, used to test whether an element is a member of a set(测试结果有一定的报错概率).