hadoop應知應會

2021-09-24 03:28:49 字數 2482 閱讀 5191

combiner和partition的作用

1.conbiner就相當於是本地reduce,輸入的資料型別和輸出的資料型別一致,

在邏輯上不能影響最終的結果輸出,例如求和,最大值不會影響,但是求平均值就有影響了

combiner存在的意義在於當網路io成為瓶頸的時候可以使用combiner,此時會減少map與reduce之間資料量的傳輸,他的原理在於在map端把同乙個key的鍵值對合併在一起,計算規則與reduce一樣,所以combine又稱為本地reduce

在**使用combiner

map輸出資料根據分割槽排序完成之後,在寫入檔案之前進行一次combine操作(前提是作業中設定了這個操作)

如果map輸出比較大,溢位檔案大於3(此值可以通過屬性min.num.spills.for.combine配置),在merge的過程(多個spill檔案合併為乙個大檔案)中前還會執行combiner操作;

partition的作用

在將map()函式處理後得到的(key,value)對寫入到緩衝區之前,需要先進行分割槽操作,這樣就能把map任務處理的結果傳送給指定的reducer去執行,從而達到負載均衡,避免資料傾斜。mapreduce提供預設的分割槽類(hashpartitioner),其核心**如下

public class hashpartitionerextends partitioner to partition. */

public int getpartition(k key, v value,

​ int numreducetasks) {

​ return (key.hashcode() & integer.max_value) % numreducetasks;

mapreduce:實現join的幾種方法

reduce side join

reduce side join是一種最簡單的join方式,其主要思想如下:

在map階段,map函式同時讀取兩個檔案file1和file2,為了區分兩種**的key/value資料對,對每條資料打乙個標籤》 (tag),比如:tag=0表示來自檔案file1,tag=2表示來自檔案file2。即:map階段的主要任務是對不同檔案中的資料打標籤。> 在reduce階段,reduce函式獲取key相同的來自file1和file2檔案的value list, 然後對於同乙個key,對file1和file2中的資料進行join(笛卡爾乘積)。即:reduce階段進行實際的連線操作。

map side join

之所以存在reduce side join,是因為在map階段不能獲取所有需要的join欄位,即:同乙個key對應的字段可能位於不同map中。reduce side join是非常低效的,因為shuffle階段要進行大量的資料傳輸。 map side join是針對以下場景進行的優化:兩個待連線表中,有乙個表非常大,而另乙個表非常小,以至於小表可以直接存放到記憶體中。這樣,我們可以將小表複製多 份,讓每個map task記憶體中存在乙份(比如存放到hash table中),然後只掃瞄大表:對於大表中的每一條記錄key/value,在hash table中查詢是否有相同的key的記錄,如果有,則連線後輸出即可,在對多個表join連線操作時,將小表放在join的左邊,大表放在jion的右邊,在執行這樣的join連線時小表中的資料會被快取到記憶體當中,這樣可以有效減少發生記憶體溢位錯誤的機率

設定引數

hive.map.aggr = true

hive.groupby.skewindata=true 還有其他引數

sql語言調節

比如: group by維度過小時:採用sum() group by的方式來替換count(distinct)完成計算

streamtable

在多表級聯時,一般大表都寫在最後,因為寫在最後的表預設使用stream形式載入,其他表的結果快取在記憶體中。

可以使用/*+ streamtable(a) */ 來標示具體哪個表使用stream形式。在表關聯時,使用該標識來指出大表,能避免資料表過大導致占用記憶體過多而產生的問題。

```select /*+ streamtable(a) */ a.val, b.val, c.val from a join b on (a.key = b.key1) join c on (c.key = b.key1)``

semijoin

semijoin,也叫半連線,是從分布式資料庫中借鑑過來的方法。它的產生動機是:對於reduce side join,跨機器的資料傳輸量非常大,這成了join操作的乙個瓶頸,如果能夠在map端過濾掉不會參加join操作的資料,則可以大大節省網路io。

實現方法很簡單:選取乙個小表,假設是file1,將其參與join的key抽取出來,儲存到檔案file3中,file3檔案一般很小,可以放到

記憶體中。在map階段,使用distributedcache將file3複製到各個tasktracker上,然後將file2中不在file3中的 key對應的記錄過濾掉,剩下的reduce階段的工作與reduce side join相同。

ceph應知應會

建立pool ceph osd pool create volumes 64 建立rbd rbdcreate size 12gwyl pool test列出rbd rbd ls p test demo wyl檢視rbd具體資訊 rbd image test demo info rbd image d...

運維之應知應會

資料安全 懷丟失 不洩露 業務7 24小時執行 永不停機 業務服務效率高 使用者體驗好 boss不是老闆的意思,是業務運營支撐系統 boss,business operation support system 通常分為四個部分 計費及結算系統 營業與賬務系統 客戶服務系統和決策支援系統。說白了,移動...

Babel 配置工程師應知應會

對比上述兩種 polyfill 方案,寫庫用 transform runtime,寫應用就 babel polyfill 基本都是使用preset env 幾個 stage,一般來說到stage 2就可以了。這個 env 和上面那個不同.這裡的 env 是指,乙個 babel 檔案針對不同環境 讀取...