随着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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • mysql5.7安装及配置超详细教程_mysql安装教程 linux

    mysql5.7安装及配置超详细教程_mysql安装教程 linuxMySQL5.7.35安装教程下载工具官网下载下载在下图中选择你自己需要的版本即可第二种下载方式如下图所示下载下载完成后对工具包进行解压,我解压的在D盘解压好过后在里面新建my.ini文件(如果你不知道怎么创建my.ini文件请看)右击新建文本文档创建文本文档过后进行重命名讲文本文档的后缀名改为ini如图操作再将新建的文本文档改名为my.ini编辑my.ini文件将下面的代码复制进去记得更改里面【basedir】【datadir】的路径为你自己的安装路径[mysqld]#

    2022年8月22日
    13
  • sstream头文件

    sstream头文件之前的sscanf和sprintfsscanf函数原型为intsscanf(constchar*str,constchar*format,…),将参数str的字符串根据参数format字符串来转换并格式化数据,转换后的结果存于对应的参数内;#include<iostream>#include<cstdio>usingnamespacestd;i…

    2022年6月4日
    52
  • c语言的条件运算符,条件运算符c语言[通俗易懂]

    c语言的条件运算符,条件运算符c语言[通俗易懂]C语言中条件运算符是什么意思C语言中条件运算符是什么意思?:是什么意思怎么利用呢举例说明条件运算符(?:)是一个三目运算符,即有三个操作数。使用条件运算符(?:)可以实现Ifelse的功能,其一般形式为:表达式1?表达式2:表达式3例如条件语句:if(a>b)max=a;elsemax=b;可用条件表达式写为max=(a>b)?a:b;执…

    2022年10月3日
    2
  • 〖EXP〗NSA MS17010永恒之蓝一键工具

    〖EXP〗NSA MS17010永恒之蓝一键工具漏洞简介永恒之蓝是指2017年4月14日晚,黑客团体ShadowBrokers(影子经纪人)公布一大批网络攻击工具,其中包含“永恒之蓝”工具,“永恒之蓝”利用Windows系统的SMB漏洞可以获取系统最高权限。5月12日,不法分子通过改造“永恒之蓝”制作了wannacry勒索病毒,英国、俄罗斯、整个欧洲以及中国国内多个高校校内网、大型企业内网和政府机构专网中招,被勒索支付高额赎金才能解密恢复文件。漏洞检测无损检测,不会对目标造成任何危害,大家无需担心Ladon192.168.1.8MS1701

    2022年4月27日
    68
  • 解决笛卡尔积

    解决笛卡尔积消除笛卡尔乘积最根本的原因不是在于连接,而是在于唯一ID,就像学号,一个学生就只有一个学号,学号就是这个学生的唯一标识码。左连接只是以左边的表为基准,左边的ID和右边ID都是唯一,就不会产生笛卡尔现象,如果右边有两个ID对应左边一个ID,就算你是左连接,一样会产生1对多的现象…

    2022年7月11日
    25
  • 什么是SpringApplication[通俗易懂]

    什么是SpringApplication[通俗易懂]SpringApplication什么是SpringApplication在spring的官方文档里面没有给出确切的定义,文档中说,SpringApplication是一个类,然后提供一些便利的功能来引导spring程序的启动,在main的方法里面启动likethis:…

    2025年10月16日
    3

发表回复

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

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