Hadoop_FileInputFormat分片


Hadoop學習筆記總結

01. InputFormat和OutFormat

1. 整個MapReduce組件

InputFormat類和OutFormat類都是抽象類。
可以實現文件系統的讀寫,數據庫的讀寫,服務器端的讀寫。
這樣的設計,具有高內聚、低耦合的特點。

2. 提交任務時,獲取split切片信息的流程

  1. JobSubmitter初始化submitterJobDir資源提交路徑,是提交到HDFS保存文件路徑,一些Jar包和配置文件:

  2. 接下來,是JobSubmitter中將切片信息寫入submitJobDir目錄。
    int maps = writeSplits(job, submitJobDir);

  3. writeSplits方法中,首先會通過反射拿到用戶設置的InputFormat子類的實例(默認為TextInputFormat類),然后調用FileInputFormat的getSplit方法(父類公共方法)再獲得切片的信息,封裝到InputSplit中,返回List

     InputFormat<?, ?> input =
       ReflectionUtils.newInstance(job.getInputFormatClass(), conf);
     List<InputSplit> splits = input.getSplits(job);
    
  4. 最后將切片描述信息寫到submitterJobDir資源提交路徑中。

     JobSplitWriter.createSplitFiles(jobSubmitDir, conf, jobSubmitDir.getFileSystem(conf), array);
    
  5. InputSplit包含block塊所在位置主機,路徑,偏移量等信息。分片數據不包含數據本身,而是指向數據的引用。

  6. input.getSplits()方法解析

    由FileInputFormat類中getSplits方法決定。
    計算公式:

     //computeSplitSize中
     minSize=max{getFormatMinSplitSize(),mapred.min.split.size} (getFormatMinSplitSize()大小默認為1B)
     maxSize=mapred.max.split.size(不在配置文件中指定時大小為Long.MAX_VALUE)
     //blockSize是默認的配置大小:128MB
    
     //分片大小的計算公式
     splitSize=max{minSize,min{maxSize,blockSize}}
    

默認情況下,minSize < blockSize < maxSize
所以,默認不在配置文件配置split最大值和最小值,分片大小就是blockSize,128MB。

公式的含義:取分片大小不大於block,並且不小於在mapred.min.split.size配置中定義的最小Size。

舉例說明如何控制分片大小:

3. 為什么Hadoop不擅長小文件

邏輯上,FileInputFormat生成的分塊是一個文件或者該文件的一部分,如果是很多小文件,就生成了很多的邏輯block。默認情況下,一個分片就是一個block,因而,會有很多個map任務,每次map操作都有很多額外的開銷。

因此,運行大量小文件的任務,會增加運行作業的額外開銷;浪費NameNode內存。

解決:CombineFileInputFormat

參考《Hadoop權威指南》
初接觸,記下學習筆記,還有很多問題,望指導,謝謝。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM