Map端join算法实现,解决Reduce端数据倾斜,负载不均(分布式缓存)
来源:互联网 发布:js 调用软键盘 编辑:程序博客网 时间:2024/04/29 07:52
1.需求:
订单数据表t_order:
关系数据库表-
id
date
pid
amount
1001
20150710
P0001
2
1002
20150710
P0001
3
1002
20150710
P0002
3
抽象成文件数据:1001,20150710,P0001,21002,20150710,P0001,3
1003,20150710,P0002,3
1002,20150710,P0003,3
1002,20150710,P0002,4
。。。。。。
商品信息表t_product:
id
pname
P0001
小米5
P0002
魅族
p0001,小米
p0002,魅族
p0003,oppo
。。。。。。
现在要把2个文件通过pID进行关联,如果按照上一遍文章,在Reduce中做关联那么问题来了,如果小米手机的订单量远远大于魅族手机的订单量,这样就会产生处理小米手机的ReduceTask任务量很大,执行时间久,而处理魅族的ReduceTask任务轻很快就执行完了,出现了负载不均衡,数据倾斜。
2.实现
鉴于是小数据量的表和大数据量的表进行join,可以用分布式缓存把小表缓存到map节点,在map阶段直接使用,与大表进行join,不在reduce阶段进行join,避免数据倾斜,提高并发量和效率。
通过main函数先把缓存文件加载到节点(底层自动分发到map节点--分布式缓存):
job.addCacheFile(“文件路径”);
代码:
package join;import java.io.BufferedReader;import java.io.FileInputStream;import java.io.IOException;import java.io.InputStreamReader;import java.net.URI;import java.util.HashMap;import java.util.Map;import org.apache.commons.lang.StringUtils;import org.apache.hadoop.conf.Configuration;import org.apache.hadoop.fs.Path;import org.apache.hadoop.io.LongWritable;import org.apache.hadoop.io.NullWritable;import org.apache.hadoop.io.Text;import org.apache.hadoop.mapreduce.Job;import org.apache.hadoop.mapreduce.Mapper;import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;public class MapJoin {static class JoinMapper extends Mapper<LongWritable,Text,Text,Text>{Map<String,String> pmap=new HashMap<String,String>();//装产品数据Text k=new Text();/*重写setup方法,看Mapper源码里面有个线程的run方法, 方法执行顺序是setup()-->map(),所以会先加载setup方法 */@Overrideprotected void setup(Context context)throws IOException, InterruptedException {//读取本地缓存中文件的数据BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("product")));String line;//如果读取的一行数据不为空,则把产品数据切分,存储在pmap中while(StringUtils.isNotEmpty(line=br.readLine())){String[] fields = line.split(",");pmap.put(fields[0], fields[1]);//K为商品id,v为商品名}br.close();}//由于已经持有完整的产品信息表,所以直接在map中实现join操作,不需要reduce操作,就不会有数据倾斜@Overrideprotected void map(LongWritable key, Text value,Context context)throws IOException, InterruptedException { String oline = value.toString();//获取订单信息 String[] fields = oline.split(","); String pName = pmap.get(fields[2]);//根据pid获取pName k.set(oline+","+pName);//数据拼接 context.write(k, new Text(""));//输出}}public static void main(String[] args) throws Exception {Configuration conf = new Configuration();Job job = Job.getInstance(conf);job.setJarByClass(MapJoin.class);job.setMapperClass(JoinMapper.class);job.setMapOutputKeyClass(Text.class);job.setOutputValueClass(NullWritable.class);FileInputFormat.setInputPaths(job, new Path(args[0]));//订单文件地址FileOutputFormat.setOutputPath(job, new Path(args[1]));//join后的文件数据地址//指定需要缓存文件到所有mapTask运行节点工作目录job.addCacheFile(new URI(args[2]));//args[2]缓存文件路径可以写死(product)//由于Map就把事情搞定了,所以不需要reduce阶段,reduceTask为0job.setNumReduceTasks(0);boolean res = job.waitForCompletion(true);System.exit(res?0:1);}}
结果:
1001,20150710,P0001,2,小米
。。。。。。
。。。。。。
阅读全文
0 0
- Map端join算法实现,解决Reduce端数据倾斜,负载不均(分布式缓存)
- Map Side Join解决数据倾斜
- reduce端join算法实现
- 第137课: Spark面试经典系列之数据倾斜解决之Map 端Reduce及问题思考
- Map-Reduce实现Join 算法(mapreduce侧连接 maponly 连接 map bloomfilter reduce连接) (join二)
- map端join算法实现
- map-reduce阶段中的数据倾斜问题
- MapReduce中的join算法-reduce端join
- maprecuce系列(4)——reduce端join算法实现
- map端join的实现 ,用来解决小表中数据的读取
- Map/Reduce中Join查询实现
- Map/Reduce中Join查询实现
- Map/Reduce中Join查询实现
- Map/Reduce中Join查询实现
- 分布式计算(Map/Reduce)
- MapReduce实现Reduce端Join操作实例
- MapReduce之Reduce端Join实现
- Mapreduce中的DistributedCache应用-解决join算法中数据倾斜问题
- MapReduce实现QQ好友推荐
- JavaScript的Math对象
- 外部中断与定时器中断实验
- Spring实现控制反转(IOC)的三种方式(三)——自动装配
- 第五周 建立链栈算法库
- Map端join算法实现,解决Reduce端数据倾斜,负载不均(分布式缓存)
- 随机数生成器 (NOI 2012 第一试 第一题)
- 关于静态方法为什么不能被重写的一点思考以及overload的一些坑
- 《深入理解mybatis原理》 MyBatis的架构设计以及实例分析
- java读取二进制文件
- 从服务端架构设计角度,深入理解大型APP架构升级
- 行内元素与块级元素的总结
- 加减乘除,展示特定字符串,点击按钮加一
- Java EE上路之eclipse下载与安装