博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
随着MapReduce job实现去加重,多种输出文件夹
阅读量:5879 次
发布时间:2019-06-19

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

总结以往的工作中遇到的一个问题。
背景:
操作和维护与scribe从apacheserver一再被推到日志记录,所以在这里ETL处理正在进行的重。有根据业务的输出类型是用于多文件夹一个需求。方便挂分区,使用回。
这两种需求都没有问题分开处理,一个mapreduce里完毕,须要一点技巧。
1、map输入数据,经过一系列处理。输出时:
if(ttype.equals("other")){        	file = (result.toString().hashCode() & 0x7FFFFFFF)%400;        }else if(ttype.equals("client")){        	file = (result.toString().hashCode() & 0x7FFFFFFF)%260;        }else{        	file = (result.toString().hashCode()& 0x7FFFFFFF)%60;        }        tp = new TextPair(ttype+"_"+file, result.toString());                context.write(tp, valuet);
 valuet是空的,什么都没有。

 我这里有三个类型。other,client,wap,分别代表日志来源平台。要按他们分文件夹输出。
 result就是整条记录。

file得到的是终于输出文件名称,hash。位操作,取模是为了输出均衡。

 map的输出结构<key,value> =(ttype+"_"+file,result.toString())
 这样做的目的是:保证同样的记录得到同样的key,同一时候还要保存类型。partition要按textPair的left,也就是这个key,
 保证了后面要写到同一个输出文件的全部记录都到同一个reduce里去。一个reduce能够写多个输出文件。可是一个输出文件不能来自多个reduce,原因非常明了。
 这种话大概400+260+60=720个输出文件,每一个文件数据量大概差点儿相同,job的reduce数我这里设置的240,这个数连同取模400,260,60都是依据我的数据量来定的,来尽量避免reduce的数据倾斜。

 
 
2、reduce方法去重:
 

public void reduce(TextPair key, Iterable
values, Context context) throws IOException, InterruptedException { rcfileCols = getRcfileCols(key.getSecond().toString().split("\001")); context.write(key.getFirst(), rcfileCols); }
    
  不用迭代,对同样的key组。仅仅输出一次。注意这里job用到的比較器,一定不能是FirstComparator,而是整个textpair对的比較。(先比較left。再比較right)
  
  我的程序里输出文件格式是rcfile。
  
3、多文件夹输出:
job.setOutputFormatClass(WapApacheMutiOutputFormat.class);   public class WapApacheMutiOutputFormat extends RCFileMultipleOutputFormat
{ Random r = new Random(); protected String generateFileNameForKeyValue(Text key, BytesRefArrayWritable value, Configuration conf) { String typedir = key.toString().split("_")[0]; return typedir+"/"+key.toString(); }}
这里的RCFileMultipleOutputFormat是自己继承自FileOutputFormat 自己写的。主要实现了recordWriter。
终于输出去重的,分文件夹的数据文件。
理解的关键,主要是partition key设计。reduce原则。

版权声明:本文博客原创文章,博客,未经同意,不得转载。

你可能感兴趣的文章
《JavaScript开发框架权威指南》——1.7 创建Bower包
查看>>
《树莓派实战秘籍》——1.7 技巧07使用过压获得更高的性能
查看>>
我的 10 年自学编程之路
查看>>
Visual C# 2010入门经典》一1.4 编写第一个程序
查看>>
《HTML5 canvas开发详解(第2版)》——2.6 在画布上合成
查看>>
《OpenGL ES 3.x游戏开发(下卷)》一2.4 展翅飞翔的雄鹰
查看>>
《敏捷制造——敏捷集成基础结构设计》——2.2 敏捷企业集成基础结构建模技术...
查看>>
史上最复杂的验证邮件地址的正则表达式
查看>>
《Unity 4 3D开发实战详解》一导读
查看>>
工行数据中心高级经理 李雁南:接口冒烟测试方法
查看>>
GraphQL-Java用来向前端返回json数据
查看>>
Cloud and the Era of AR/VR Technology: What's Next
查看>>
我们为什么需要Greenplum?
查看>>
jsoup (网页获取与解析)
查看>>
【玩转数据系列十】利用阿里云机器学习在深度学习框架下实现智能图片分类...
查看>>
解决之道:从互联网安全到IoT安全,如何关上潘多拉魔盒?
查看>>
Activity过渡动画
查看>>
Android 四种常见的线程池
查看>>
【阿里云资讯】阿里云Serverless产品函数服务(Function Compute)预计年底发布
查看>>
Spark Shuffle Write阶段磁盘文件分析
查看>>