Hadoop 学习番外篇3-小文件处理

2019-05-05  本文已影响0人  Kean_L_C

代码见:https://github.com/JNUpython/hadoop_spark/tree/master/src/main/java/org/shangu/serialization

image.png

小文件hdfs存储

每个文件都会占用一个block(默认yarn block_size=128mb),文件多直接导致namenode资源耗尽, image.png

小文件切片

小文件分块和切片是两个完全不同概念:前者为物理过程,将数据存储在磁盘上;后者为数据读取逻辑处理过程,读取数据作为maptask的输入,因此切片数量直接对应maptask开启的数量。
如果直接采用下面代码读取数据:

FileInputFormat.setInputPaths(job, new Path(args[0]));

因为数据切片,不考虑数据整体大小而是分文件单独考虑那么直接采用该方法就会有4个切片,即多少个小文件对应多少个切片,实际根本不要这么多task,maptask启动也是很费时间。

[INFO ] 2019-05-05 11:39:27,437 method:org.apache.hadoop.mapreduce.JobSubmitter.submitJobInternal(JobSubmitter.java:198)
number of splits:4

上面是利用 FileInputFormat 提交job信息输出 切片数量为4, 对用4个maptask

小文件切片:CombineTextInputFormat

FileInputFormat运行之前设置:4mb

        job.setInputFormatClass(CombineTextInputFormat.class);
        CombineTextInputFormat.setMaxInputSplitSize(job, 4194304);

        FileInputFormat.setInputPaths(job, new Path(args[0]));
        FileOutputFormat.setOutputPath(job, new Path(args[1]));

切片数量变为1

[INFO ] 2019-05-05 11:53:15,298 method:org.apache.hadoop.mapreduce.JobSubmitter.submitJobInternal(JobSubmitter.java:198)
number of splits:1
上一篇下一篇

猜你喜欢

热点阅读