转载请注明出处:https://www.codelast.com/

假设你的JAVA M-R job的输入文件是大量纯文本文件,而且每个文件都比较小(例如几百K),那么job运行起来之后会占用大量mapper数,导致Hadoop集群资源被过度消耗。这种情况可以通过合并输入文件来避免。

Hadoop本身已经提供了这种支持。方法很简单,大致代码如下:

Job job = Job.getInstance(getConf());
job.setJarByClass(getClass());
job.setInputFormatClass(CombineTextInputFormat.class);
FileInputFormat.addInputPaths(job, "your_input_path");
job.setMapperClass(YourMapper.class);
job.setReducerClass(YourReducer.class);

关键就是要使用 CombineTextInputFormat。
文章来源:https://www.codelast.com/
然后在调用该JAVA程序的shell脚本中,向程序传入参数:

-D mapreduce.input.fileinputformat.split.maxsize=268435456

这设置了每一个split的大小为 268435456 字节(即 256MB,1024*1024*256=268435456)。如果不设置,一般情况下是不行的,因为程序会把所有输入合并到一个split中,如果输入数据量超大,job就跑不动了。

[原创] Java Hadoop job合并输入的小文件(纯文本)

发表评论

电子邮件地址不会被公开。 必填项已用*标注