标题hadoop 核心注意事项 小总
一 .maptask的并行机制(逻辑切片)
maptask 的数量取决于 一般取决于 切片的数量。有多少切片就有多少maptask。
maptask 的数量主要取决于三个方面:
1.文件的大小及数量。
2.blocksize的大小
3.以及splip(块) size 大小
时间:是在mr客户端提交程序到yarn之前。
地点:mr程序客户端(main方法)
参与者:输入目录 FileInputFormat.getSplit();
规则是:对待处理的文件卓个遍历 一切片大小(blocksize)对文件进行逻辑切片
split size=blocksize=128m;
默认 :134217728b(128M) 【hadoop 官网说 默认是字节 也可以以 k(kilo),m(兆),g,t,p,e结尾如:128m,521m,1g】(hdfs-default.xml)
举例正常切:
源码中 fileinputformat 中 有一行代码:
Math.max(minSize,math.min(maxsize,blocksize)) 这个很重要
不管如何调整,都不可能跨文件处理数据。卓个遍历
调整方向 :split size= block size ;
特殊情况1:小文件场景
1.txt 12k;
2.txt 10k;
3.txt 15k;
由于 默认规则是卓个遍历 ,这就导致了 会有 三个 split (这样太浪费资源,因为交个一个maptask 就可以了)
解决方案
1.(将小文件合并为一个文件)hdfs 有个追加命令 appendToFile +shell
2.可以使用java程序 以读写流的形式 将文件合并。
3.修改源码(修改默认读取数据组件逻辑)。
特殊情况2:大文件场景
1.txt 1.5t;
2.txt 3t;
如果我们使用默认的切片大小 :128m 我们会切成很多个split (块)
解决方案:
更改默认的blocksize =512m 或者更大
更改的位置:应该在 hdfs-site.xml 中 添加
property>
name>dfs.blocksize</name
value>512m</value
</property
特殊情况3:当使用默认blocksize=128m时且 有个文件1.txt 大小为 129M
按照我们的规则 将会切成 0-128m;128m-129m 俩个块。但是实际中并不是。
因为源码