开发者社区> 涂作权> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

MapReduce将小文件合并成大文件,并设置每个切片的大小的案例

简介: 测试代码: package cn.toto.bigdata.combinefile; import java.io.IOException; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.Path; import org.apache.hadoop.io.LongWritable; imp
+关注继续查看

测试代码:

package cn.toto.bigdata.combinefile;

import java.io.IOException;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.NullWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.lib.input.CombineTextInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;

/**
 * 当遇到小文件处理时,每个文件会被当成一个split,那么资源消耗非常大,hadoop支持将小文件合并后当成一个切片处理。(默认)
 */
public class SmallFileCombiner {
	
	static class SmallFileCombinerMapper extends Mapper<LongWritable, Text, Text, NullWritable>{
		NullWritable v = NullWritable.get();
		@Override
		protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
			//通过这种方式相当于是直接把值打印到磁盘文件中。value其实就是每一样的的文件内容
			context.write(value, v);
		}
		
	}
	
	/**
	 * 如果生产环境中,小文件的数量太多,那么累计起来的数量也是很庞大的,那么这时候就要设置切片的大小了。
	 * 
	 * 即使用:CombineTextInputFormat.setMaxInputSplitSize(job, 1024*1024*150);
	 */
	public static void main(String[] args) throws Exception {
		Configuration conf = new Configuration();
		Job job = Job.getInstance(conf);
		
		job.setJarByClass(SmallFileCombiner.class);
		
		job.setMapperClass(SmallFileCombinerMapper.class);
		
		job.setOutputKeyClass(Text.class);
		job.setOutputValueClass(NullWritable.class);
		
		//下面的方式将小文件划分为一个切片。
		job.setInputFormatClass(CombineTextInputFormat.class);
		//如果小文件的总和为224M,将setMaxInputSplitSize中的第二个参数设置成300M的时候,在
		//E:\wordcount\output下只会生成一个part-m-00000这种文件
		//如果将setMaxInputSplitSize中的第二个参数设置成150M的时候,在
		//E:\wordcount\output下会生成part-m-00000 和 part-m-00001 两个文件
		CombineTextInputFormat.setMaxInputSplitSize(job, 1024*1024*150);
		CombineTextInputFormat.setInputPaths(job, new Path("e:/wordcount/input/"));
		FileOutputFormat.setOutputPath(job, new Path("e:/wordcount/output/"));
		
		job.setNumReduceTasks(0);
		
		job.waitForCompletion(true);
	}
}

准备数据:

在E:\wordcount\input目录下准备小文件(总大小为224M),如:


其中文件内容类似:


执行完成程序之后,进入E:\wordcount\output查看内容:



其中part-m-00000的内容如下:







版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
MapReduce框架--InputFormat数据输入--切片优化(11)
MapReduce框架--InputFormat数据输入--切片优化(11)
0 0
Hadoop中的MapReduce框架原理、切片源码断点在哪断并且介绍相关源码、FileInputFormat切片源码解析、总结,那些可以证明你看过切片的源码
Hadoop中的MapReduce框架原理、切片源码断点在哪断并且介绍相关源码、FileInputFormat切片源码解析、总结,那些可以证明你看过切片的源码
0 0
Hadoop中的FileInputFormat切片机制、FileInputFormat切片大小的参数配置、TextInputFormat、CombineTextInputFormat切片机制
Hadoop中的FileInputFormat切片机制、FileInputFormat切片大小的参数配置、TextInputFormat、CombineTextInputFormat切片机制
0 0
Flink1.7.2 Dataset 文件切片计算方式和切片数据读取源码分析
了解读取的文件或目录,具体进行切片拆分的实现 了解任务读取切片中的数据规则
955 0
【转】目录和文件名遍历输出 批处理 batch
TREE 只能输出目录结构,楼主想要的是 文件也一起输出有现成的命令啊 TREE [drive:][path] [/F] [/A]   /F   显示每个文件夹中文件的名称。  /A   使用 ASCII 字符,而不使用扩展字符。
683 0
+关注
涂作权
java,架构,编程语言相关专家
文章
问答
文章排行榜
最热
最新
相关电子书
更多
大批量处理excel文件到ODPS中方案
立即下载
实战-如何基于HBase构建图片视频数据的统一存储检索方案
立即下载
HBase2.0重新定义小对象实时存取
立即下载