随着MapReduce job实现去加重,多种输出文件夹

随着MapReduce job实现去加重,多种输出文件夹

大家好,又见面了,我是全栈君,今天给大家准备了Idea注册码。

总结以往的工作中遇到的一个问题。

背景:

操作和维护与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<Text> 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<Text, BytesRefArrayWritable> {
	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原则。

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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/117394.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Java二维数组排序

    Java二维数组排序Java二维数组排序

    2022年4月29日
    48
  • 官场之风流人生简介

    官场之风流人生简介简介  平民子弟意外身亡,突然成为官场豪门子弟的他,  是换一种人生,还是继续风流放纵的生涯?  纯真的妹妹、冷艳的女上司、受伤的旧情人,  本该是两个人的人生线索,从此都交错在他一人的身上…女性主角千娇百媚  说起更俗的都市文,就不得不提及女性角色,新书《官场之风流人生》的几个女性觉得就设置的很有感觉哦,小黎(妹控啊),陈丹(堂嫂),周裕(丈夫瘫痪的美女秘书长,这个

    2022年4月29日
    62
  • Java学习:assert(断言)的使用——测试程序和AssertionError错误事件

    Java学习:assert(断言)的使用——测试程序和AssertionError错误事件assert是在J2SE1.4中引入的新特性,assertion就是在代码中包括的布尔型状态,程序员认为这个状态是true。一般来说assert在开发的时候是检查程序的安全性的,在发布的时候通常都不使用assert。在1.4中添加了assert关键字

    2025年9月17日
    4
  • 颜色空间RGB与HSV(HSL)的转换

    颜色空间RGB与HSV(HSL)的转换

    2021年12月16日
    56
  • Python字符串比较

    Python字符串比较InthistutorialwearegoingtoseedifferentmethodsbywhichwecancomparestringsinPython.Wewillalsoseesometrickycaseswhenthepythonstringcomparisoncanfailandgoldenrulestoget…

    2022年6月18日
    40
  • JMH使用指南[通俗易懂]

    JMH使用指南[通俗易懂]关于JMH,可以直接查看官网地址http://openjdk.java.net/projects/code-tools/jmh/本博客内容来自我正在撰写的新书《Java性能优化(暂定名)》,也欢迎购买经典书《SpringBoot2实战权威指南》1.3JMH1.3.1使用JMH通过手工编写一个性能压测程序有较多的问题不同需要性能比较方法放到一个虚拟机里调用,有可能会互相…

    2022年7月11日
    24

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号