Hadoop实战(五) 高阶MapReduce

本章重点概括
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:
    1. 如何给map()的输出打tag,以标记数据来源(不同table)–>mapper:封装记录
    2. 如何在reduce侧实现combine()(实现联结)
  • 使用DTATJOIN软件包:
    1. 三个可供集成和具体化的抽象类: DataJoinMapperBase、DataJoinReducerBase、TaggedMapOutput
    2. 新抽象数据类型TaggedMapOutput来给map()输出打tag ==> TaggedMapOutput是一种用Text标签封装记录的数据类型,具体实现了getTag()和setTag()[子类将实现该方法来处理记录的类型],以及readFields()和write()方法[for输出必须为Writable类型]。
    3. 继承DataJoinReducerBase并实现combine()方法来筛选掉不需要的组合,并将合并结果格式化为合适的输出格式。

基于DistributedCache的复制联结

  • reduce侧联结的改进:效率的提升 –> 在map阶段去除不必要的数据
  • 改进:利用一种频繁出现的数据模式 –> 连接大数据时,往往只有一个数据源较大,第二个数据
    源可能会小几个数量级。
  • 实现: 降较小的数据源赋值到所有mapper –> 复制联结

半联结: map侧过滤后在reduce侧联结

  • 复制连接的限制之一是:其中一个链接表必须小到可以放在内存中。

创建一个Bloom filter

About Bloom filter

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值