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读取。

结果查看:

首先可以从终端看出来:

可以看到同样的两个输入文件,任务096只有一个分片,任务097有两个分片;

同时在任务监控界面也可以看到Mapper的个数变化:

总结:CombineFileInputFormat具有很强的应用价值,针对大量小数据具有很高的处理效率收益。不过,如果是大数据应用,一般情况下可能输入数据都是很大的,所以,这种情况也只是针对一些特殊情况的处理。

分享,成长,快乐

转载请注明blog地址:http://blog.csdn.net/fansy1990

hadoop编程小技巧(6)---处理大量小数据文件CombineFileInputFormat应用

时间: 2024-10-24 15:04:44

hadoop编程小技巧(6)---处理大量小数据文件CombineFileInputFormat应用的相关文章

hadoop编程技巧(6)---处理大量的小型数据文件CombineFileInputFormat申请书

代码测试环境:Hadoop2.4 应用场景:当需要处理非常多的小数据文件,这种技术的目的,可以被应用到实现高效的数据处理. 原理:申请书CombineFileInputFormat,能够进行切片合并的时候把多个小的数据文件.因为每个切片将有一个Mapper,当一个Mapper处理的数据比較小的时候,其效率较低.而一般使用Hadoop处理数据时.即默认方式,会把一个输入数据文件当做一个分片.这样当输入文件较小时就会出现效率低下的情况. 实例: 參考前篇blog:hadoop编程小技巧(5)---自

iOS开发——小技巧:Mac开源小软件PushMeBaby,还要啥后端,测试APP推送只靠Xcode!

PushMeBaby是一个github的开源Mac小软件,地址:https://github.com/stefanhafeneger/PushMeBaby,它非常简单,编译的时候带上APP的推送证书(生产环境还是开发环境视你情况而定),然后加上想要推送到的设备的deviceToken即可,实测推送即时性极佳. 这是程序主界面: 只用轻轻一点Push,消息就推送到设备了,简直就是傻瓜级良心应用,必须为作者点32个赞! 这里谈谈程序编译过程中需要注意的,从github上拖下来之后,command+b

Cocos2dx 小技巧(一)预定义文件路径

我们的主题是:有些技巧你不知道不要紧,但知道后会很牛逼. 假设在项目工程的Resource有好多个目录,如image,fonts,Menu,InterfaceUI,等等,而我要创建的几个精灵对应的图片分别在这几个目录里,如: auto sprite = Sprite::create("image/sp.png"); 但要命的是我记忆力不好(假的),忘了图片都分别在哪个目录里,这时候就要跑到目录里去搜索下,这样是不是很麻烦?(说不麻烦的现在就给我出去!out!). 现在有一种办法可以从根

小技巧--解决eclipse导入的jar文件后,无法使用默认包中的方法问题

问题:我已经导入了stdlib的jar文件,但是由于包是(default package)所以无法使用包中的方法 解决方法: 1.新建一个项目 2.新建一个文件夹 3.打开项目,新建一个包,然后导入jar文件中的class文件 右键新建的包(file)选择import,在General中选择现成的文件(Archive File)Archive--档案 选择jar包中所有的文件 最后一步就是要把这些文件导入到一个新的jar文件中 这样eclipse导入我们自己打的包时,就不会出现包名为defaul

给大家分享12个或许能在实际工作中帮助你解决一些问题的JavaScript的小技巧

使用!!操作符转换布尔值 有时候我们需要对一个变量查检其是否存在或者检查值是否有一个有效值,如果存在就返回true值.为了做这样的验证,我们可以使用!!操作符来实现是非常的方便与简单.对于变量可以使用!!variable做检测,只要变量的值为:0.null." ".undefined或者NaN都将返回的是false,反之返回的是true.比如下面的示例: 01 function Account(cash) { 02 this.cash = cash; 03 this.hasMoney

AOPR小技巧解释

Advanced Office Password Recovery是一款操作十分简单的Office密码破解软件,主界面层次十分清楚让人一目了然.本文将介绍AOPR的几个使用小技巧,让用户在破解文件密码时如虎添翼. 图示AOPR的几个使用小技巧 1.初学者往往不知道从哪里开始使用Advanced Office Password Recovery,用户可以从工具栏单击"打开文件-"按钮或者依次选择"文件"->"打开文件-"菜单项,浏览并选择需要

12个非常实用的JavaScript小技巧

在这篇文章中将给大家分享12个有关于JavaScript的小技巧.这些小技巧可能在你的实际工作中或许能帮助你解决一些问题. 使用!!操作符转换布尔值 有时候我们需要对一个变量查检其是否存在或者检查值是否有一个有效值,如果存在就返回true值.为了做这样的验证,我们可以使用!!操作符来实现是非常的方便与简单.对于变量可以使用!!variable做检测,只要变量的值为:0.null." ".undefined或者NaN都将返回的是false,反之返回的是true.比如下面的示例: func

整理:Android Studio的常用快捷键、常用小技巧

[快捷键] 15.Ctrl+Alt+空格 代码提示 1.Alt+Enter 错误提示 3.Ctrl+Alt+L 格式化 1.Ctrl+D 复制当前行到下一行 6.Shift+F6 重命名 10.Ctrl+F 查找元素  --->Ctrl+R 替换元素 2.Ctrl+Alt+T 把代码包在一起(加try catch等) 4.Alt+↑或↓ 在方法间移动 5.Alt+←或→ 切换已打开的文件视图 7.Ctrl+F12 显示当前文件的结构 8.Alt+Enter 快速修复 9.Ctrl+Shjft+N

前端知识:12个非常实用的JavaScript小技巧

在这篇文章中将给大家分享12个有关于JavaScript的小技巧.这些小技巧可能在你的实际工作中或许能帮助你解决一些问题. 使用!!操作符转换布尔值 有时候我们需要对一个变量查检其是否存在或者检查值是否有一个有效值,如果存在就返回true值.为了做这样的验证,我们可以使用!!操作符来实现是非常的方便与简单.对于变量可以使用!!variable做检测,只要变量的值为:0.null." ".undefined或者NaN都将返回的是false,反之返回的是true.比如下面的示例: func