inputformat的兩種功能:數據切分功能(data splits)、記錄讀取器(record reader),理論上來講,一個split和一個block的大小是一致的。java
map是一個進程,把split中的數據讀到內存,達到百分之80的時候,開始往磁盤上寫數據(小數據,命名爲spill.n),在讀數據的同時,還會作一次sort,把相同key的數據排到一個區間,最後把不少個小份數據「歸併排序」成一個大份數據。多線程
paritition(shuffling):每個map處理後產生的不一樣key和value,把key作hash給reduce這個過程叫作parttition。 併發
兩個進程:jobtracker tasktracker線程
這個圖是有6個map,2個reduce,8個進程。爲何mapreduce採用多進程的併發方式,而不是多線程的併發方式?首先這個多進程併發方式的模型, 每個進程,每個任務去佔用資源去進行控制,由於這個進程空間是獨享的,有什麼優點呢?方便對每一個任務進行資源的控制和調配,那選擇進程,缺點是,進程相比線程來講,它會消耗更多的啓動時間,也就是說進程的一個啓動時間要比線程的時間慢好多, 由於這個因素,直接致使mapreduce不適合運行一些低延時類型的做業,因此以前說mapreduce有一個很大的缺點,就是時效性不高,因此mapreduce只適合作一些批量操做,適合一些高吞吐,離線的狀況下。orm
hdfs:數據源存在這,數據源都是以file的方式表示的,當你提交了一個文件,這個文件會被切分紅一些小的文件,hdfs是一個文件系統,那麼就會有一個數據單位,這個數據單位就是block,默認是64M,默認備份3個,存在不一樣的機器上。 經過非java方式開發的代碼,讀取的數據都是fextfile明文類型的,這個類型的優勢是可讀性好,缺點是這種類型數據不壓縮,浪費空間,會致使磁盤開銷比較大。blog
shuffle:包含不少環節,partion,sort,spill,meger,combiner,copy,memery,disk。 排序