当前位置:网站首页>随着MapReduce job实现去加重,多种输出文件夹
随着MapReduce job实现去加重,多种输出文件夹
2022-07-06 10:19:00 【全栈程序员站长】
大家好,又见面了,我是全栈君。
总结以往的工作中遇到的一个问题。
背景: 操作和维护与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.cn/117394.html原文链接:https://javaforall.cn
边栏推荐
- QT中Model-View-Delegate委托代理机制用法介绍
- Heavy! Ant open source trusted privacy computing framework "argot", flexible assembly of mainstream technologies, developer friendly layered design
- STM32 key state machine 2 - state simplification and long press function addition
- Video fusion cloud platform easycvr adds multi-level grouping, which can flexibly manage access devices
- 2022暑期项目实训(二)
- D binding function
- Getting started with pytest ----- test case rules
- 编译原理——自上而下分析与递归下降分析构造(笔记)
- 2022 Summer Project Training (III)
- Grafana 9.0 正式发布!堪称最强!
猜你喜欢
The easycvr platform reports an error "ID cannot be empty" through the interface editing channel. What is the reason?
Pourquoi Li shufu a - t - il construit son téléphone portable?
Windows connects redis installed on Linux
MS-TCT:Inria&SBU提出用于动作检测的多尺度时间Transformer,效果SOTA!已开源!(CVPR2022)...
C语言通过指针交换两个数
declval(指导函数返回值范例)
Take you through ancient Rome, the meta universe bus is coming # Invisible Cities
C language exchanges two numbers through pointers
重磅硬核 | 一文聊透对象在 JVM 中的内存布局,以及内存对齐和压缩指针的原理及应用
Heavy! Ant open source trusted privacy computing framework "argot", flexible assembly of mainstream technologies, developer friendly layered design
随机推荐
2022 Summer Project Training (III)
Getting started with pytest ----- test case pre post, firmware
Jielizhi obtains the currently used dial information [chapter]
Olivetin can safely run shell commands on Web pages (Part 1)
【Android】Kotlin代码编写规范化文档
Five data structures of redis
Excel usage record
Interview shock 62: what are the precautions for group by?
Jerry's setting currently uses the dial. Switch the dial through this function [chapter]
HMS Core 机器学习服务打造同传翻译新“声”态,AI让国际交流更顺畅
微信小程序中给event对象传递数据
Getting started with pytest ----- allow generate report
高精度运算
容器里用systemctl运行服务报错:Failed to get D-Bus connection: Operation not permitted(解决方法)
Wchars, coding, standards and portability - wchars, encodings, standards and portability
编译原理——预测表C语言实现
使用block实现两个页面之间的传统价值观
Distiller les connaissances du modèle interactif! L'Université de technologie de Chine & meituan propose Virt, qui a à la fois l'efficacité du modèle à deux tours et la performance du modèle interacti
Getting started with pytest ----- test case rules
Kivy tutorial: support Chinese in Kivy to build cross platform applications (tutorial includes source code)