既然Hive的底層是MR,那為什麼MR的Reduce個數要等於分割槽數,而Hive卻沒有這個限制?

時間 2021-06-21 15:05:47

1樓:mediocre

MR確實有這個限制,也不能說限制,這個是由其執行原理決定的,自然而然的。因為MR分割槽之後,規定每個分割槽都由乙個reduce task來處理,所以當然,有多少分割槽就有多少個reduce。

至於Hive,其分割槽的概念和MR中分割槽的概念是不同的。hive的分割槽指的是根據乙個或多個分割槽字段,手動指定分割槽,每增加乙個分割槽就是增加乙個資料夾,資料夾的名字就是分割槽字段=分割槽值,比如分割槽欄位為month,給表手動增加乙個分割槽為month=202106,那麼hdfs上會增加乙個名稱為 「month=202106」的資料夾,其內會存放屬於該分割槽的表資料。而MR的分割槽概念,是在執行MR job時,手動設定分割槽個數(預設分割槽個數是1),然後根據分割槽方法計算出Map task的輸出結果屬於哪個分割槽,預設的分割槽方式是根據其key的hash值 & 2147483647,然後對分割槽個數取餘數,計算出其屬於哪個分割槽。

當然也可以自定義分割槽方法。

以下是MR的預設分割槽方法的原始碼:

public int getPartition(K key, V value, int numReduceTasks)

然後Map task的輸出結果輸出到自己對應的分割槽中,之後程式會給每乙個分割槽指定乙個reduce task,對分割槽中的資料執行reduce業務邏輯方法,最後將計算結果輸出到檔案,有幾個reduce task,就生成幾個輸出檔案。

最後,hive中,和MR的分割槽概念相對應的,也可以說是相同的,是hive的分桶(bucket)。

既然看過的書會忘,那為什要讀?

鯨落 因為書可以給予我們思考的能力,看一本書實際上是在跟隨作者的思路進行一場思維的探索,事實上我們的大腦給予我們遺忘的能力不僅僅是一種缺陷,這種所謂的缺陷使我們不會被具體的內容所限制,而是可以具備更抽象的思考能力,使我們可以可以舉一反三。 陳什麼 吃過的食物最後也會排洩出來,為什麼人還是需要進食?無...

若底層員工犯錯要怪他的上司管理不好,那為什麼不怪上司的上司沒有管理好上司導致上司沒有管理好底層員工?

一燈小師 責任!不能單說怪!承擔責任不一樣!具體問題具體分析!因上司決策造成犯錯,比如用人不當造成犯錯 一人犯錯,團隊都有責任,才有利於團隊建設,但至於怎麼處理,要看公司文化,追責可根據管理需要靈活處理! Rollin 凡事都有乙個限度,一直地追溯下去多數時候並沒有意義 然而,這個不是不能做,而是願...

既然《英雄聯盟》排位比賽能夠ban英雄,那為什麼不能ban裝備呢?如果這樣,會出現哪些有趣的事?

朱超毅 ban大面具不想讓你拿提莫,那豈不是要近戰上單?果斷ban黑切。那就把三項ban了 九頭蛇也禁了。那豈不是冰拳無敵?ban了。那把冰錘禁了吧,嗯。打野 BAN了吸血鬼節杖ADC還用玩?LOL大件定義也比較模糊,像滿級眼石算不算大件?滿級鞋子呢?所以BAN裝備,基本也不可能,不然很多裝備太強,...