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


相关推荐

  • PyCharm安装torch等

    PyCharm安装torch等pipinstalltorchpipinstalltorchvi

    2022年8月27日
    2
  • MBUS系列产品特点(科慧铭远)[通俗易懂]

    MBUS系列产品特点(科慧铭远)[通俗易懂]     北京科慧铭远自控技术有限公司联合国际标准化组织、计量中心、热力集团、清华大学检测与电子技术研究所,成立国内首家M-BUS通信设备检测中心,对于M-BUS主站、从站的通信设备全方位的检测其是否符合国际和国内标准,并予以认证。北京科慧铭远自控技术有限公司有着在M-BUS领域最全面的的研发和生产能力,获得国际标准化组织的认可,产品在欧洲、亚洲、中国获得全面应用。其生产的MBUS设备的主要…

    2022年10月10日
    0
  • DP和HDMI区别「建议收藏」

    转自:https://www.toutiao.com/i6877677362054595080在目前市面上显示器接口中,VGA和DVI已经逐渐退出了历史舞台,Type-C还算是小众,而DP(DisplayPort)与HDMI则成为了主流产品的标配,目前的主流级显卡也是以这两个输出接口为主,而新的问题也随之诞生了:当这两个接口都可以使用的时候,选择哪个会更好?对于大部分普通的消费者来说,显示器能跟主机正常连接就行,随便哪个接口都无所谓,反正能正常使用,但是对于DIY玩家来说,这个问题就显得非常重要

    2022年4月16日
    163
  • 一篇文章,Vue快速入门!!!

    一篇文章,Vue快速入门!!!①Vue概述及第一个Vue程序(HelloWorld)1.1什么是MVVMMVVM(Model-View-ViewModel)是一种软件设计模式,由微软WPF(用于替代WinForm,以前就是用这个技术开发桌面应用程序的)和Silverlight(类似于JavaApplet,简单点说就是在浏览器上运行WPF)的架构师KenCooper和TedPeters开发,是一种简化用户界面的事件驱动编程方式。由JohnGossman(同样也是WPF和Sliverlight的架构师)与2005年在他的

    2022年5月4日
    50
  • oracle用户修改密码sql_oracle数据库管理员密码忘记

    oracle用户修改密码sql_oracle数据库管理员密码忘记修改oracle数据库用户名称和密码(Linux为例),有需要的朋友可以参考下。一、修改前准备工作:使用ssh工具以root身份连接服务器,然后切换到oracle用户:su-oracle(回车)使用sqlplus连接数据库:sqlplus/nolog(回车)以管理员身份登录sys用户:connsys/sysassysdba(回车)数据库连接成功,至此准备工作完成。二、修改用户名称。数据…

    2022年7月28日
    15
  • oracle修改用户名密码语句_oracle修改数据库用户名

    oracle修改用户名密码语句_oracle修改数据库用户名oracle修改用户名,密码首先我们打开命令行,cmd,进入oracle的后台管理界面,当然,还有很多其他的方式可以进入oracle后台管理界面,比如使用PL/SQL界面化工具,或者使用oracle自带的SQL工具。打开命令窗口,登录oracle后台管理界面:具体命令为在运行处输入cmd,在弹出的命令提示窗口输入setoracle_sid=数据库名称,输入sqlplus进入ora…

    2022年7月28日
    5

发表回复

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

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