我要進大廠之大資料MapReduce知識點 2

2021-10-10 17:29:59 字數 4040 閱讀 1855

今天老劉分享的是mapreduce知識點的第二部分,在第一部分中基本把mapreduce的工作流程講述清楚了,現在就是對mapreduce零零散散的知識點進行總結,這次的內容大綱如下圖:

第6點:自定義分割槽

分割槽原理

mapreduce有自帶的預設分割槽器hashpartitioner,關鍵方法是利用getpartition()返回當前鍵值對的分割槽索引。

詳細流程就是① 在環形緩衝區溢位寫磁碟前,會將每個鍵值對kv,作為getpartition()的引數輸入;

② 然後就會對鍵值對中的key求hash值,與max_value按位與,再模上reduce task的個數,這裡老劉假設reduce task的個數為4,那麼map任務溢位的檔案就會有4個分割槽,分割槽的index分別為0,1,2,3,那getpartition()的輸出結果就是0,1,2,3。

③ 根據計算結果,就會決定出當前鍵值對kv,落入哪個分割槽,如果是0,就會落入到溢位檔案的0分割槽裡面。

④ 最後就會被相應的reduce通過http獲得。

那講完這個,就要說說自定義分割槽,為什麼會有自定義分割槽?

因為mr用的是預設hashpartition分割槽,但是當前業務邏輯,不適用於hashpartition分割槽,就需要自己設計自定義分割槽。

這裡就舉個例子,自定義分割槽,使得檔案中,分別以dear、bear、river、car為鍵的鍵值對,分別落到index是0、1、2、3的分割槽中。

咱們先來分析分析它的邏輯,由於是自定義分割槽嘛!就需要自定義分割槽類,然後用這個類實現partitioner介面,以及在getpartition()中實現分割槽邏輯,最後就是在main()中設定reduce個數為4,大致就是這樣。

下面分享出關鍵**:

public

class

custompartitioner

extends

partitioner

public

intgetpartition

(text text, intwritable intwritable,

int i)

}

那麼自定義分割槽就說完了,大家可以總結總結,自定義分割槽的步驟。

第7點:自定義combiner

仔細看這張圖的紅色標記處,combine操作就發生在這個地方,它會把兩個(dear,1)變為1個(dear,2)。

為什麼要進行combine操作?

我們假設map中(dear, 1)有1億個,按原思路,map端需要儲存1億個(dear, 1),然後將1億個(dear, 1)通過網路被reduce獲得,然後再在reduce端進行彙總,這樣做map端本地磁碟io、資料從map端到reduce端傳輸的網路io比較大,網路開銷太大了。

所以我們就會需要想辦法,能不能在reduce1從map1拉取1億個(dear, 1)之前,在map端就提前先做下reduce彙總,得到結果(dear, 100000000),然後再將這個結果(乙個鍵值對)傳輸到reduce1呢?那當然是可以的,這個操作就是combine操作。

combine操作具體流程如下:

當每個map任務的環形緩衝區添滿80%,開始溢寫磁碟檔案。

在這個過程中會進行分割槽,每個分區內按鍵排序,如果設定了combine的話,就會繼續進行combine操作,如果設定map輸出壓縮的話,就會進行壓縮。

在合併溢寫檔案時,如果至少有3個溢寫檔案,並且設定了map端combine的話,會在合併的過程中觸發combine操作;

但是若只有2個或1個溢寫檔案,則不觸發combine操作(因為combine操作,本質上是乙個reduce,需要啟動jvm虛擬機器,有一定的開銷)

combine本質上也是reduce;因為自定義的combine類繼承自reducer父類

mr**如下:

//在main()中進行設定

job.

setcombinerclass

(wordcountreduce.

class

)

第8點:mr壓縮為什麼會有mr壓縮?

在mr中,為了減少磁碟io及網路io,可考慮在map端、reduce端設定壓縮功能。

那麼如何設定壓縮功能呢?只需在main方法中,給configuration物件增加如下設定即可:

//開啟map輸出進行壓縮的功能

configuration.

set(

"mapreduce.map.output.compress"

,"true");

//設定map輸出的壓縮演算法是:bzip2codec,它是hadoop預設支援的壓縮演算法,且支援切分

configuration.

set(

"mapreduce.map.output.compress.codec"

,"org.apache.hadoop.io.compress.bzip2codec");

//開啟job輸出壓縮功能

configuration.

set(

"mapreduce.output.fileoutputformat.compress"

,"true");

//指定job輸出使用的壓縮演算法

configuration.

set(

"mapreduce.output.fileoutputformat.compress.codec"

,"org.apache.hadoop.io.compress.bzip2codec"

);

那mr壓縮就差不多就講完了,大家可以繼續總結總結。

第9點:自定義inputformat

老劉主要講講inputformat的流程,老劉之前在mapreduce的第一篇文章中講過,假設mr的輸入檔案有三個block:block1,block2,block3,每乙個block對應乙個split分片,每乙個split對應乙個map任務(map task)。

但是呢,沒有講如何把檔案進行切分之類的問題,就直接給出來了,下面就是講講這些內容。

先說一點,mapreduce任務的輸入檔案一般是儲存在hdfs裡面,我們主要看map任務是如何從hdfs讀取分片資料的部分。

這裡會涉及三個關鍵的類:

① inputformat輸入格式類

② inputsplit輸入分片類:getsplit(),inputformat輸入格式類將輸入檔案分成乙個個分片inputsplit;每個map任務對應乙個split分片。

③ recordreader記錄讀取器類:createrecordreader(),recordreader(記錄讀取器)讀取分片資料,一行記錄生成乙個鍵值對;傳入map任務的map()方法,呼叫map()。

再說說為什麼需要自定義inputformat?

無論hdfs還是mapreduce,處理小檔案都有損效率,實踐中,又難免面臨處理大量小檔案的場景,那這個時候就需要採取一些解決辦法。

小檔案的優化無非以下幾種方式:

① 在資料採集的時候,就將小檔案或小批資料合成大檔案再上傳hdfs(sequencefile方案)。

② 在業務處理之前,在hdfs上使用mapreduce程式對小檔案進行合併;可使用自定義inputformat實現。

③ 在mapreduce處理時,可採用combinefileinputformat提高效率。

大資料學習知識點

檔案儲存 hadoop hdfs tachyon kfs 離線計算 hadoop mapreduce spark 流式 實時計算 storm spark streaming s4 heron k v nosql 資料庫 hbase redis mongodb 資源管理 yarn mesos 日誌收集...

我目前要學習的vue知識點

就是api goodsdatil?user adk id 008這樣的形式去獲取後端資料 主要是使用props vue.js 兄弟元件傳值 vue動態元件兄弟間傳值 vue元件之間互相傳值 兄弟元件通訊 vue.js中兄弟元件之間互相傳值 分為for迴圈陣列和物件 vue去哪兒網教程裡 9 1 vu...

大資料 YARN知識點簡介

系列文章 大資料 hadoop知識點簡介 大資料 yarn知識點簡介 大資料 spark知識點簡介 mapreduce 1.x存在的問題 主節點jobtracker帶多個幹活的從節點tasktracker,典型的一對多架構。客戶端先提交mapreduce作業到jobtracker,然後jobtrac...