TextInputFormat会创建RecordReader去读取数据,通过getCurrentKey、getCurrentValue、nextKeyValue等方法来读取;读取的结果要形成key value的形式
以wordcount为例,
1.客户端运行类似如下代码:
hadoop jar wordcount.jar cn.xx.xx.MainClass /input/ /output/
2.FileInputStream首先要计算切片大小(FileInputFormat是一个抽象类,它继承了InputFormat这个接口,真正干活的是它下面的实现类,默认是TextInputFormat;TextInputFormat是读取文件的,并且默认是一行一行读取;其实FileInputFormat下还有很多实现类,可以实现读取字节,读取数据库,多行读取等功能;);计算公式是:
Math.max(minSize, Math.min(maxSize, blockSize));源代码见下图:
默认情况下,每个片的大小就是块的大小;这样设计是有原因的,如果一个片定义的大于一个块,则检索数据时要去其它datanode节点获取数据,造成多余的网络io,影响性能