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的内容如下:







目录
相关文章
|
3月前
|
分布式计算
如何在MapReduce中处理多个输入文件?
如何在MapReduce中处理多个输入文件?
46 0
|
4月前
|
存储 分布式计算 自然语言处理
MapReduce【小文件的优化-Sequence文件】
MapReduce【小文件的优化-Sequence文件】
|
11月前
|
分布式计算 Hadoop 大数据
MapReduce 案例之数据去重
MapReduce 案例之数据去重
149 0
|
9月前
|
存储 分布式计算 资源调度
MapReduce之小文件问题
针对HDFS而言,每一个小文件在namenode中都会占用150字节的内存空间,最终会导致集群中虽然储了很多个文件,但是文件的体积并不大,这样就没有意义了。
92 0
|
11月前
|
分布式计算 资源调度 监控
YARN On Mapreduce搭建与wordCount案例实现
YARN On Mapreduce搭建与wordCount案例实现
|
11月前
|
存储 分布式计算 搜索推荐
MapReduce 案例之倒排索引
MapReduce 案例之倒排索引
116 0
MapReduce 案例之倒排索引
|
11月前
|
分布式计算 数据处理 索引
MapReduce 案例之Top N
MapReduce 案例之Top N
99 0
|
分布式计算 Hadoop
Hadoop学习:MapReduce实现WordCount经典案例
Hadoop学习:MapReduce实现WordCount经典案例
128 0
|
分布式计算 Hadoop
Hadoop学习:MapReduce实现文件的解压缩
Hadoop学习:MapReduce实现文件的解压缩
115 0
|
4月前
|
分布式计算 Hadoop
Hadoop系列 mapreduce 原理分析
Hadoop系列 mapreduce 原理分析
38 1