srotByKey為什麼會觸發job

2021-09-01 11:33:26 字數 1926 閱讀 4999

大家都只知道srotbykey是乙個transformation運算元,而transformation型別的運算元是不觸發job的,但是有心的人會注意到,在我們呼叫sortbykey這個運算元時 ,可以從ui介面看到,sortbykey竟然會觸發job

其實sortbykey 在執行時會對分割槽中的資料進行取樣,把取樣的資料再進行收集(collect),那麼此時就會觸發乙個job,具體的原因可以往下看原始碼

以下是原始碼分析

如果又**寫錯了歡迎糾正

參考文章

可以先大概的跟一邊**

(1)呼叫sortbykey時,會new乙個rangepartitioner類

(2)點進rangepartitioner中,會初始化乙個rangebounds的陣列

再裡面呼叫了sketch方法(在類中,在方法外,相當於是構造方法中的)

(3)點進sketch方法中,這裡呼叫了乙個collect方法,點進這個collect方法中,可以發現是rdd的方法,會呼叫runjob

上面是大概看了一遍,有興趣的可以再向下看原始碼的分析

def sortbykey

(ascending: boolean =

true

, numpartitions: int = self.partitions.length)

:rdd[(

k,v)

]= self.withscope

這裡直接取了一部分**,是在new rangepartitioner 初始化時會執行的

class

rangepartitioner[k

: ordering : classtag,v]

( partitions: int,

rdd:

rdd[_ <

: product2[k,

v]],

private

var ascending: boolean =

true

)extends

partitioner

else

else

else}}

if(imbalancedpartitions.nonempty)

rangepartitioner.

determinebounds

(candidates, partitions)

}}

sketch方法:

def sketch[

k: classtag]

( rdd:

rdd[k]

, samplesizeperpartition: int)

:(long, array[

(int, long, array[k]

)])=

.collect()

//先收集每個分割槽的樣本的,collect方法會產生乙個job ,這裡是把取到的樣本後得到的rdd進行收集,點進collect方法會發現有乙個runjob

val numitems = sketched.

map(_._2)

.sum // 這個numitems應該是總共的樣本數

(numitems, sketched)

//最後把樣本數,乙個收集好的樣本array[key]型別返回

}

激勵為什麼會失效

摘要 不是注重用外部的力量來激勵員工,而是要用認可和獎勵點燃員工的心中之火。點評 著名的調查公司sirota survey intelligence的一項大型調查表明,大約85 的公司的員工,在入職的時候都是情緒高漲,但是在工作6個月之後,熱情會急劇下降,並在以後的工作中會持續下降。也許正因為這個現...

員工為什麼會離職

網上摘抄的,說得很確切,有參考學習價值,馬雲說 員工的離職原因,只有兩點最真實 1 錢,沒給到位。2 心,委屈了。這些歸根到底就一條 幹得不爽。員工臨走還費盡心思找靠譜的理由,就是為給你留面子,不想說穿你的管理有多爛 他對你已失望透頂。仔細想想,真是人性本善。作為管理者,定要樂於反省。帶團隊,你得問...

員工為什麼會離職?

網上摘抄的,說得很確切,有參考學習價值,馬雲說 員工的離職原因,只有兩點最真實 1 錢,沒給到位。2 心,委屈了。這些歸根到底就一條 幹得不爽。員工臨走還費盡心思找靠譜的理由,就是為給你留面子,不想說穿你的管理有多爛 他對你已失望透頂。仔細想想,真是人性本善。作為管理者,定要樂於反省。帶團隊,你得問...