MapReduce作為第一代的大數據計算引擎,其經典地位至今仍然得到認可,MapReduce之後的Spark計算引擎,本質上來說,依然是借用了MapReduce的核心思想。今天的大數據技術分享,我們就主要來講講MapReduce計算前的準備階段,也就是Split分片階段。通常來說,MapReduce運行可以分為4個階段,分別是Split階段—Map階段 —Shuffle階段 —Reduce階段。Split是正式計算前的重要準備階段。
1、Split輸入分片的概念所謂輸入分片,並不是真的把原來的一個大文件,比如說10MB的文件,切分成10個1MB的小文件,這裡的分片不是物理分片,而是邏輯分片。所謂邏輯分片就是根據文件的字節索引進行分割,比如0~1MB位置定義為第一個分片,1MB~2MB定義為為第二個分片,依次類推……而原來的大文件還是原來的大文件,不會受到影響,因此,輸入分片(input split)存儲的並非數據本身,而是一個分片長度和一個記錄數據的位置的數組。2、分片數量與Map Task數量的關係?Map Task的個數等於split的個數。Mapreduce在處理大文件的時候,會根據一定的規則,把大文件劃分成多個分片,這樣能夠提高map的並行度。劃分出來的就是InputSplit,每個map處理一個InputSplit,因此,有多少個InputSplit,就有多少個map task。3、由誰來劃分分片?主要是InputFormat類來負責劃分Split。InputFormat類有2個重要的作用:1)將輸入的數據切分為多個邏輯上的InputSplit,其中每一個InputSplit作為一個map的輸入。2)提供一個RecordReader,用於將InputSplit的內容轉換為可以作為map輸入的k,v鍵值對。FileInputFormat是InputFormat的子類,是使用比較廣泛的類,輸入格式如果是hdfs上的文件,基本上用的都是FileInputFormat的子類,如TextInputFormat用來處理普通的文件,SequceFileInputFormat用來處理Sequce格式文件。FileInputFormat類中的getSplits(JobContext job)方法是劃分split的主要邏輯。4、分片的大小由誰來決定?每個輸入分片的大小是固定的,默認情況下,輸入片(InputSplit)的大小與數據塊(Block)的大小是相同的。Hadoop 2.x默認的block大小是128MB,Hadoop 1.x默認的block大小是64MB,可以在hdfs-site.xml中設置dfs.block.size,注意單位是byte。分片大小範圍可以在mapred-site.xml中設置,最小分片大小:mapred.max.split.size,minSplitSize大小默認為1B,maxSplitSize大小默認為Long.MAX_VALUE = 92233720368547758075、默認分片大小與Block分塊大小是相同的原因?Hadoop在存儲有輸入數據(HDFS中的數據)的節點上運行map任務,可以獲得高性能,這就是所謂的數據本地化。所以最佳分片的大小應該與HDFS上的塊大小一樣,因為如果分片跨越2個數據塊,對於任何一個HDFS節點(Hadoop系統保證一個塊存儲在一個datanode上,基本不可能同時存儲這2個數據塊),分片中的另外一塊數據就需要通過網絡傳輸到map任務節點,與使用本地數據運行map任務相比,效率則更低。優點就是可以實現分塊優化,減少網絡傳輸數據,使用本地數據運行map任務。關於大數據技術,MapReduce分片階段,以上就為大家做了詳細的介紹了。MapReduce作為大數據計算的代表性框架,理解和掌握MapReduce實際的程序執行,也是非常有必要的。