『壹』 MapRece如何保證結果文件中key的唯一性
MapRece極大地方便了編程人員在不會分布式並行編程的情況下,將自己的程序運行在分布式系統上。MapRece保證結果文件中key的唯一性的方法為:
1、打開Hadoop集群,打開主機master的終端,輸入【ifconfig】命令查看主機IP地址。
注意事項:
MapRece藉助於函數式程序設計語言Lisp的設計思想,提供了一種簡便的並行程序設計方法,用Map和Rece兩個函數編程實現基本的並行計算任務,提供了抽象的操作和並行編程介面,以簡單方便地完成大規模數據的編程和計算處理。
『貳』 maprece 的map輸出文件在哪
map任務的輸出結果不寫入HDFS,而是寫入執行map的本地硬碟上,為什麼呢?因為map的輸出是中間結果,所謂中間結果,就是要經過rece之後才會是最終結果,而且整個maprece執行完之後,這個結果就要被幹掉了。所以,把它放在HDFS中並實現備份,這就有點大題小做了。當你執行maprece的時候,你可以在shell中用命令 df -lh 來查看硬碟的使用率,要想辦法把這個使用率控制在90%以內。
『叄』 如何在Hadoop上編寫MapRece程序
用戶配置並將一個Hadoop作業提到Hadoop框架中,Hadoop框架會把這個作業分解成一系列map tasks 和rece tasks。Hadoop框架負責task分發和執行,結果收集和作業進度監控。
下圖給出了一個作業從開始執行到結束所經歷的階段和每個階段被誰控制(用戶 or Hadoop框架)。
3. 分布式緩存
Haoop中自帶了一個分布式緩存,即DistributedCache對象,方便map task之間或者rece task之間共享一些信息,比如某些實際應用中,所有map task要讀取同一個配置文件或者字典,則可將該配置文件或者字典放到分布式緩存中。
4.多語言編寫MapRece作業
Hadoop採用java編寫,因而Hadoop天生支持java語言編寫作業,但在實際應用中,有時候,因要用到非java的第三方庫或者其他原因,要採用C/C++或者其他語言編寫MapRece作業,這時候可能要用到Hadoop提供的一些工具。
『肆』 maprece 輸入和輸出有多個目錄
1.MapRece多路徑輸入
1.1FileInputFormat.addInputPath(s)
FileInputFormat.addInputPath()是我們最常用的設置MapRece輸入路徑的方法了。其實,FileInputFormat有兩個這樣的方法:
[html] view plain
static void addInputPath(Job job, Path path)
static void addInputPaths(Job job, String commaSeperatedPaths)
addInputPath()只能指定一個路徑,如果要想添加多個路徑需要多次調用該方法:
[java] view plain
FileInputFormat.addInputPath(job, new Path(args[0]));
FileInputFormat.addInputPath(job, new Path(args[1]));
FileInputFormat.addInputPath(job, new Path(args[2]));
addInputPaths()可以指定多條路徑,而這多條路徑是用「,」分隔的一個字元串:
[java] view plain
String paths = strings[0] + "," + strings[1];
FileInputFormat.addInputPaths(job, paths);
『伍』 Hive常用運算元實現原理簡述--MapRece版
Hive中的常用運算元包括distinct、join、group by、order by、distribute by、sort by、count等,這些操作符在SQL中使用起來很方便,能快速達到我們想要的效果,但是這些運算元在底層是怎麼實現的呢?
order by很容易想到執行原理,在一個rece中將所有記錄按值排序即可。因此order by在數據量大的情況下執行時間非常長,容易out of memory,非特殊業務需求一般不使用。distribute by也比較明顯,根據hash值將distribute的值分發到不同的rece。sort by是小號的order by,只負責將本recer中的值排序,達到局部有序的效果。sort by和distribute by配合使用風味更佳,二者可以合並簡寫為cluster by。count則更加明晰,在combiner或recer處按相同鍵累加值就能得到。
比較復雜的是distinct、join、group by,本文重點討論這三個運算元在MapRece引擎中的大致實現原理。班門弄斧,拋磚引玉。
map階段,將group by後的欄位組合作為key,如果group by單欄位那麼key就一個。將group by之後要進行的聚合操作欄位作為值,如要進行count,則value是1;如要sum另一個欄位,則value就是該欄位。
shuffle階段,按照key的不同分發到不同的recer。注意此時可能因為key分布不均勻而出現數據傾斜的問題。
rece階段,將相同key的值累加或作其他需要的聚合操作,得到結果。
對group by的過程講解的比較清楚的是這篇文章 http://www.mamicode.com/info-detail-2292193.html 圖文並茂,很生動。
實例如下圖,對應語句是 select rank, isonline, count(*) from city group by rank, isonline;
如果group by出現數據傾斜,除去替換key為隨機數、提前挑出大數量級key值等通用調優方法,適用於group by的特殊方法有以下幾種:
(1)set hive.map.aggr=true,即開啟map端的combiner,減少傳到recer的數據量,同時需設置參數hive.groupby.mapaggr.checkinterval 規定在 map 端進行聚合操作的條目數目。
(2)設置mapred.rece.tasks為較大數量,降低每個recer處理的數據量。
(3)set hive.groupby.skewindata=true,該參數可自動進行負載均衡。生成的查詢計劃會有兩個 MR Job。第一個 MR Job 中,Map 的輸出結果集合會隨機分布到Rece 中,每個 Rece 做部分聚合操作,並輸出結果,這樣處理的結果是相同的 Group By Key有可能被分發到不同的 Rece 中,從而達到負載均衡的目的;第二個 MR Job 再根據預處理的數據結果按照 Group ByKey 分布到 Rece 中(這個過程可以保證相同的 Group By Key 被分布到同一個 Rece中),最後完成最終的聚合操作。
Hive中有兩種join方式:map join和common join
如果不顯式指定map side join,或者沒有達到觸發自動map join的條件,那麼會進行rece端的join,即common join,這種join包含map、shuffle、rece三個步驟。
(1)Map階段
讀取源表的數據,Map輸出時候以Join on條件中的列為key,如果Join有多個關聯鍵,則以這些關聯鍵的組合作為key。Map輸出的value為join之後所關心的(select或者where中需要用到的)列;同時在value中還會包含表的Tag信息,用於標明此value對應哪個表。然後按照key進行排序。
(2)Shuffle階段
根據key的值進行hash,並將key/value按照hash值推送至不同的rece中,這樣確保兩個表中相同的key位於同一個rece中
(3)Rece階段
根據key的值完成join操作,期間通過Tag來識別不同表中的數據。
以下面的SQL為例,可用下圖所示過程大致表達其join原理。
SELECT u.name, o.orderid FROM user u JOIN order o ON u.uid = o.uid;
關聯欄位是uid,因此以uid為map階段的輸出key,value為選取的欄位name和標記源表的tag。shuffle階段將相同key的鍵值對發到一起,rece階段將不同源表、同一key值的記錄拼接起來,可能存在一對多的情況。
如果指定使用map join的方式,或者join的其中一張表小於某個體積(默認25MB),則會使用map join來執行。具體小表有多小,由參數 hive.mapjoin.smalltable.filesize 來決定。
Hive0.7之前,需要使用hint提示 /*+ mapjoin(table) */才會執行MapJoin,否則執行Common Join,但在0.7版本之後,默認自動會轉換Map Join,由參數 hive.auto.convert.join 來控制,默認為true。
以下圖為例說明map join如何執行,該圖來自 http://lxw1234.com/archives/2015/06/313.htm ,博主是一個水平深厚又樂於分享的前輩,圖片水印上也有其網址。
yarn會啟動一個Local Task(在客戶端本地執行的Task)--Task A,負責掃描小表b的數據,將其轉換成一個HashTable的數據結構,並寫入本地的文件中,之後將該文件載入到DistributeCache中。
接下來是Task B,該任務是一個沒有Rece的MR,啟動MapTasks掃描大表a,在Map階段,根據a的每一條記錄去和DistributeCache中b表對應的HashTable關聯,並直接輸出結果。
由於MapJoin沒有Rece,所以由Map直接輸出結果文件,有多少個Map Task,就有多少個結果文件。
distinct一般和group by同時出現。
當distinct一個欄位時,將group by的欄位和distinct的欄位組合在一起作為map輸出的key,value設置為1,同時將group by的欄位定為分區鍵,這可以確保相同group by欄位的記錄都分到同一個recer,並且map的輸入天然就是按照組合key排好序的。根據分區鍵將記錄分發到rece端後,按順序取出組合鍵中的distinct欄位,這時distinct欄位也是排好序的。依次遍歷distinct欄位,每找到一個不同值,計數器就自增1,即可得到count distinct結果。例如下面的SQL語句,過程可以下圖示意。
我暫時沒有理解這是怎麼實現的,別人寫的也沒有看明白。有善良的學富五車的大佬指點一下嗎?
『陸』 如何自定義一個hadoop maprecer中recer輸出的時候以csv文件輸出。
設定輸出分隔符為「,」,並且multipleoutputtformat自定義輸出文件名為*.csv就可以了
『柒』 maprece 輸出的文件名可以自己定義嗎
當然可以,通過它的API就可以知道了,有機會搭上環境試下就知道了~