hadoop编程技巧(6)---处理大量的小型数据文件CombineFileInputFormat申请书
代码测试环境:Hadoop2.4
应用场景:当需要处理非常多的小数据文件,这种技术的目的,可以被应用到实现高效的数据处理。
原理:申请书CombineFileInputFormat,能够进行切片合并的时候把多个小的数据文件。因为每个切片将有一个Mapper,当一个Mapper处理的数据比較小的时候,其效率较低。而一般使用Hadoop处理数据时。即默认方式,会把一个输入数据文件当做一个分片。这样当输入文件较小时就会出现效率低下的情况。
实例:
參考前篇blog:hadoop编程小技巧(5)---自己定义输入文件格式类InputFormat。只是这次输入使用两个输入文件,都是小数据量的数据文件。
自己定义输入文件格式:CustomCombineFileInputFormat:
package fz.combineinputformat; import java.io.IOException; import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.InputSplit;
import org.apache.hadoop.mapreduce.RecordReader;
import org.apache.hadoop.mapreduce.TaskAttemptContext;
import org.apache.hadoop.mapreduce.lib.input.CombineFileInputFormat;
import org.apache.hadoop.mapreduce.lib.input.CombineFileRecordReader;
import org.apache.hadoop.mapreduce.lib.input.CombineFileSplit;
/**
* 定义读取类
* @author fansy
*
*/
public class CustomCombineFileInputFormat extends CombineFileInputFormat<Text, Text> { @Override
public RecordReader<Text, Text> createRecordReader(InputSplit split,
TaskAttemptContext context) throws IOException {
// TODO Auto-generated method stub
return new CombineFileRecordReader<Text, Text>((CombineFileSplit)split,context,CustomCombineReader.class);
} }
自己定义记录读取类CustomCombineReader:
package fz.combineinputformat; import java.io.IOException; import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.InputSplit;
import org.apache.hadoop.mapreduce.RecordReader;
import org.apache.hadoop.mapreduce.TaskAttemptContext;
import org.apache.hadoop.mapreduce.lib.input.CombineFileSplit;
import org.apache.hadoop.mapreduce.lib.input.FileSplit;
/**
* 改动初始化函数
* @author fansy
*
*/
public class CustomCombineReader extends RecordReader<Text, Text> { private int index;
private CustomReader in; public CustomCombineReader(CombineFileSplit split,TaskAttemptContext cxt,Integer index){
this.index=index;
this.in= new CustomReader();
}
@Override
public void initialize(InputSplit split, TaskAttemptContext context)
throws IOException, InterruptedException {
CombineFileSplit cfsplit= (CombineFileSplit) split;
FileSplit fileSplit = new FileSplit(cfsplit.getPath(index),cfsplit.getOffset(index),
cfsplit.getLength(),cfsplit.getLocations());
in.initialize(fileSplit, context);
} @Override
public boolean nextKeyValue() throws IOException, InterruptedException {
return in.nextKeyValue();
} @Override
public Text getCurrentKey() throws IOException, InterruptedException {
// TODO Auto-generated method stub
return in.getCurrentKey();
} @Override
public Text getCurrentValue() throws IOException, InterruptedException {
// TODO Auto-generated method stub
return in.getCurrentValue();
} @Override
public float getProgress() throws IOException, InterruptedException {
// TODO Auto-generated method stub
return in.getProgress();
} @Override
public void close() throws IOException {
// TODO Auto-generated method stub
in.close();
} }
能够看到这个类使用了上篇博客的CustomReader类。仅仅是改动了下初始化函数,使得小数据量的文件能够合并到一个分片而已。CustomReader能够參考前篇blog:hadoop编程小技巧(5)---自己定义输入文件格式类InputFormat 。
主类,仅仅需改动(相同參考前篇blog):
job.setInputFormatClass(CustomCombineFileInputFormat.class);
进行了两次实验。第一次使用CombineFileInputFormat读取,第二次使用TextInputFormat读取。
结果查看:
首先能够从终端看出来:
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZmFuc3kxOTkw/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="" />
能够看到相同的两个输入文件,任务096仅仅有一个分片。任务097有两个分片;
同一时候在任务监控界面也能够看到Mapper的个数变化:
总结:CombineFileInputFormat具有非常强的应用价值,针对大量小数据具有非常高的处理效率收益。只是。假设是大数据应用,普通情况下可能输入数据都是非常大的,所以。这样的情况也仅仅是针对一些特殊情况的处理。
分享,成长。快乐
转载请注明blog地址:http://blog.csdn.net/fansy1990
版权声明:本文博主原创文章,博客,未经同意不得转载。
hadoop编程技巧(6)---处理大量的小型数据文件CombineFileInputFormat申请书的更多相关文章
- hadoop编程技巧(8)---Unit Testing (单元测试)
所需的环境: Hadoop相关jar包裹(下载版本的官方网站上可以): 下载junit包裹(新以及). 下载mockito包裹: 下载mrunit包裹: 下载powermock-mockito包裹: ...
- hadoop编程技巧(4)---总体情况key按类别搜索TotalOrderPartitioner
Hadoop代码测试版:Hadoop2.4 原理:携带MR该程序随机抽样提取前的输入数据,样本分类,然后,MR该过程的中间Partition此值用于当样品排序分组数据.这使得可以实现全球排名的目的. ...
- hadoop编程技巧(3)---定义自己的区划类别Partitioner
Hadoop代码测试环境:Hadoop2.4 原则:在Hadoop的MapReduce过程.Mapper阅读过程完成后数据.它将数据发送到Partitioner.由Partitioner每个记录应当采 ...
- BASH的保护性编程技巧
BASH的保护性编程技巧 shell常用逻辑判断 -b file 若文件存在且是一个块特殊文件,则为真 -c file 若文件存在且是一个字符特殊文件,则为真 -d file 若文件存在且是一个目 ...
- js异步编程技巧一
异步回调是js的一大特性,理解好用好这个特性可以写出很高质量的代码.分享一些实际用的一些异步编程技巧. 1.我们有些应用环境是需要等待两个http请求或IO操作返回后进行后续逻辑的处理.而这种情况使用 ...
- EF – 2.EF数据查询基础(上)查询数据的实用编程技巧
目录 5.4.1 查询符合条件的单条记录 EF使用SingleOrDefault()和Find()两个方法查询符合条件的单条记录. 5.4.2 Entity Framework中的内部数据缓存 DbS ...
- VC多文档编程技巧(取消一开始时打开的空白文档)
VC多文档编程技巧(取消一开始时打开的空白文档) http://blog.csdn.net/crazyvoice/article/details/6185461 VC多文档编程技巧(取消一开始时打开的 ...
- java命名规范和编程技巧
一个好的java程序首先命名要规范. 命名规范 定义这个规范的目的是让项目中所有的文档都看起来像一个人写的,增加可读性,方便维护等作用 Package 的命名 Package 的名字应该都是由一个小写 ...
- 无插件Vim编程技巧
无插件Vim编程技巧 http://bbs.byr.cn/#!article/buptAUTA/59钻风 2014-03-24 09:43:46 发表于:vim 相信大家看过<简明Vim教程& ...
随机推荐
- 洛谷 P3871 中位数
->题目链接 题解: 暴力 经鉴定,此题数据水到没朋友. #include<algorithm> #include<iostream> #include<cstdi ...
- Bootstrap相关优质项目学习清单
1:编码规范 by @mdo编写灵活.稳定.高质量的 HTML 和 CSS 代码的规范 http://codeguide.bootcss.com/ 2:快速.可靠.安全的依赖管理工具.Yarn 缓存了 ...
- Satisfying memory ordering requirements between partial reads and non-snoop accesses
A method and apparatus for preserving memory ordering in a cache coherent link based interconnect in ...
- 【HDU】病毒侵袭(AC自己主动机模板题)
AC自己主动机的模板题.因为输入的字符串中的字符不保证全为小写字母.所以范围应该在130之前,而前31位字符是不可能出如今字符串的(不懂得查下ACSII表即可了).所以仅仅须要开的结点数组大小为130 ...
- 关于用strace工具定位vrrpd进程有时会挂死的bug
只做工作总结备忘之用. 正在烧镜像,稍总结一下进来改bug遇到的问题. 一个项目里要用到L3 switch的nat,vrrp功能,但实地测试中偶然出现write file挂死的情况,但不是必现.交付在 ...
- PHP 正则截取符合条件的字符串成为数组
$str2 = '<p>678678<em>111111<img src="http://www.XXX.top/upload/image/20180709/1 ...
- ZOJ 3204 Connect them 继续MST
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=3367 题目大意: 让你求最小生成树,并且按照字典序输出哪些点连接.无解输出-1 ...
- 【2186】Popular Cows(强连通分支及其缩点)
id=2186">[2186]Popular Cows(强联通分支及其缩点) Popular Cows Time Limit: 2000MS Memory Limit: 65536 ...
- 使用LAMP创建基于wordpress的个从博客网站 分类: B3_LINUX 2014-07-15 16:45 800人阅读 评论(0) 收藏
参考: http://blog.csdn.net/ck_boss/article/details/27866117 一.mysql配置 1.安装mysql yum install mysql-serv ...
- 【u012】数字游戏
Time Limit: 1 second Memory Limit: 128 MB [问题描述] 小W发明了一个游戏,他在黑板上写出了一行数字a1,a2,-an,然后给你m个回合的机会,每回合你可以从 ...