mr spark storm 都是分佈式計算框架,他們之間不是誰替換誰的問題,是誰適合作什麼的問題。
mr特色,移動計算,而不移動數據。 把咱們的計算程序下發到不一樣的機器上面運行,可是不移動數據。
每個split 是由一個map線程,仍是map進程進行處理? 確定的是,他們之間是併發的。
mr的shuffle階段,是比較難於理解的,不太便於咱們去控制他,咱們只能經過程序,控制其中的一部分。shuffle階段,大多數都是有MR框架自動完成的。
溢寫到磁盤中:map執行完成,結果確定是放在內存中的。 因此達到必定數量以後,就須要溢寫到磁盤中。在這以前,須要進行分區(partition)和把當前這個map的輸出數據進行排序(sotred)
因此說,寫到磁盤中的數據已經分好區了,而且已經排好序了。這都是在map任務所在節點的本地執行的。 其中partition暫時沒有體現出做用。而是在fetch的過程當中提現出來的。是按照什麼
進行分區的呢?是看partition是怎麼寫的。partition能夠由程序員本身寫。按照程序員本身的規則實現。也能夠不寫,有默認的分區規則。默認分區規則是hash模運算(1,獲取hash值
,是一個int。2,把這個int值對reduce的個數取模),默認的partition是有可能產生數據傾斜的。好比有兩個reduce,沒全部map產生的全部結果取模的時候,打個比方,
共有10個map結果,有9個都會1,只有1個爲0,這就產生了數據傾斜。
mr如何解決數據傾斜問題和負載均衡。就是經過partition來實現的。若是發現數據傾斜問題,修改咱們的partition算法就能夠了。
排序,排序的關鍵是如何比較兩個對象,mr本身也有自帶的排序規則。默認的是按照對象所對應的ascii碼值來排序的,或者說就是按照字典排序
分區不是馬上把數據都分開,而是打一個標號,標註,你是 1區的,你是2區的。在數據傳輸的 時候纔會真正的分開,就是fetch階段
merge ondisk每次溢寫,都會產生一個文件,注意,不是追加,因此溢寫次數越多,產生的文件數越多,怎麼辦呢,須要和並,和併成爲一個大一點的文件,和並也有規則,默認按照
hash值和並。你的鍵的hash進行合併,鍵相同,就進行合併。合併規則也能夠自定義。是combiner,就是每次合併,都會執行combiner的代碼。 目的是加快拷貝速度,由於文件數量越少,拷貝越快。
溢寫的時候,map任務可能尚未執行完,故可能一次map任務會有屢次的溢寫。因此會產生多個文件
把map結果的機器上把分給我這個reduce數據拷貝過來,拷貝是根據partition的結果來拷貝的。因爲是從多個map的節點上拷貝數據,因此會有多個小文件,此時又會進行一次合併,此次
合併不能人爲控制。此次合併,只要是key相同的都會進行合併,這個相同的key,可能來自於不一樣的map task。合併完成以後,相同key的數據都會在一塊兒。分別傳給reduce執行,這個
不是併發的,可是兩個reduce是併發的。
比較會調用屢次。
先partition,後入 memory buffer
partition是對map的每一個結果的分區規則的運算
大數據的兩個方向:
1.大數據變成和運維方向
2.數據建模方向,必須是統計學和數據學出來的人。
程序員