最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

hadoop map-reduce中的文件并發(fā)操作

 更新時間:2014年04月26日 12:24:38   作者:  
hadoop mapreduce最主要的應(yīng)用是基于鍵值對的數(shù)據(jù)的運算,過濾,提取。但除此之外,我們可以順帶利用mapreduce高并發(fā)的特性做一些用常用方法難以處理的問題,比如大量數(shù)據(jù),大量文件的并發(fā)讀寫

這樣的操作在map端或者reduce端均可。下面以一個實際業(yè)務(wù)場景中的例子來簡要說明。

問題簡要描述:

假如reduce輸入的key是Text(String),value是BytesWritable(byte[]),不同key的種類為100萬個,value的大小平均為30k左右,每個key大概對應(yīng) 100個value,要求對每一個key建立兩個文件,一個用來不斷添加value中的二進制數(shù)據(jù),一個用來記錄各個value在文件中的位置索引。(大量的小文件會影響HDFS的性能,所以最好對這些小文件進行拼接)

當(dāng)文件數(shù)量較小時,可以考慮使用MultipleOutput來進行key-value的分流,可以按照key的不同,將其輸出到不同的文件或者目錄中。但是reduce的數(shù)量只能為1,不然每個reduce都會生成相同的目錄或者文件,不能達到最終的目的。此外最重要的是,操作系統(tǒng)對每個進程打開的文件數(shù)量的限制,默認為1024,集群的各個datanode可能會配置更高的值,但最多在幾萬左右,仍然是一個限制因素。不能滿足百萬文件的需求。

reduce的主要目的是用來歸并key-value并輸出到HDFS上,我們當(dāng)然也可以在reduce中進行其他的操作,比如文件讀寫。因為默認的partitioner保證同一個key的數(shù)據(jù)肯定會在同一個reduce中,所以在每個reduce中只用打開兩個文件進行讀寫即可(一個索引文件,一個數(shù)據(jù)文件)。并發(fā)度由reduce數(shù)量決定,將reduce數(shù)量設(shè)為256,那我們就可以同時處理256個key的數(shù)據(jù)(partioner保證了不同reduce處理的key不同,不會引起文件讀寫沖突)。這樣的并發(fā)度的效率是很客觀的,可以在較短的時間內(nèi)完成需求。

思路是這樣,但同時由于hdfs的特性以及hadoop的任務(wù)調(diào)度,在文件讀寫過程中,仍有可能會出現(xiàn)很多問題,下面簡要說些一些常見的會碰到的問題。

1.org.apache.hadoop.hdfs.protocol.AlreadyBeingCreatedException異常

這可能是最經(jīng)常碰到的一個問題。可能的原因如下:

(1)文件流沖突。

一般創(chuàng)建文件時都會打開一個供寫入的文件流。而我們希望是追加,所以如果使用了錯誤的API ,就有可能引起上述問題。以FileSystem類為例,如果使用create()方法之后再調(diào)用append()方法,就會拋出上述異常。所以最好使用createNewFile方法,只創(chuàng)建文件,不打開流。

(2)mapreduce推測執(zhí)行機制

mapreduce 為了提高效率,會在一個任務(wù)啟動之后,同時啟動一些相同的任務(wù)(attempt),其中有一個attempt成功完成之后,視為整個task完成,其結(jié)果 作為最終結(jié)果,并且殺掉那些較慢的attempt。集群一般會開啟此選項以優(yōu)化性能(以空間換時間)。但在本問題環(huán)境下推測執(zhí)行卻不太合適。因為我們一般希望一個task 用來處理一個文件,但如果啟動推測執(zhí)行,會有幾個attempt同時試圖操作同一個文件,就會引發(fā)異常。所以最好關(guān)掉此選項,將 mapred.reduce.max.attempts 設(shè)為1,或者將mapred.reduce.tasks.speculative.execution設(shè)為false.

但此時仍有可能會出現(xiàn)問題。因為如果一個task的唯一attempt出現(xiàn)問題,在被kill掉之后,task仍會另起一個attempt,此時因為前一個attempt異常終止,仍有可能會影響到新起的attempt的文件操作,引發(fā)異常。所以最安全的方法是,借鑒推測執(zhí)行的機制(每個attempt各自生成自己的結(jié)果,最終選擇一個作為最終結(jié)果),以每個attempt的id號為后綴附加到所操作的文件上,同時捕獲所有文件操作的異常并處理,這樣可避免文件的讀寫沖突。Context可以用來獲取運行時的一些上下文信息,可以很容易得到attempt的id號。注意,此時如果開啟推測執(zhí)行也可以,但是會生成很多相同的文件(每個attempt一份),仍然不是最好的解決方法。

同時,我們可以利用reduce的輸出來記錄運行“不正常的” key.這些task大多數(shù)是attempt_0被殺掉而重啟了一個attempt_1,所以下面的文件一般為兩份??梢詫@些情況的key輸出(文件異?;蛘遖ttemptID > 0),并進行一些后續(xù)處理,比如文件重命名,或者緊對這些key重新寫入。因為此種情況的key一般只占極少數(shù),所以并不影響總體的效率。

2.文件異常處理

最好能將mapreduce中的所有文件操作都設(shè)置好異常處理。不然一個文件異常就有可能會使整個job失敗。所以從效率來講,最好是在文件發(fā)生異常時將其key作為reduce的輸出以進行記錄。因為同時mapreduce會重啟一個task attempts重新進行文件讀寫,可保證我們得到最終的數(shù)據(jù),最后所需的只是對那些異常的key進行一些簡單的文件重命名操作即可。

3.多目錄以及文件拼接

如果我們將key的種類設(shè)為1000萬,上述方法會生成太多的小文件從而影響hdfs的性能,另外,因為所有文件都在同一個目錄下,會導(dǎo)致同一個目錄下文件數(shù)目過多而影響訪問效率。

在創(chuàng)建文件的同時建立多個子目錄,一個有用的方法是以reduce的taskid來建立子目錄。這樣有多少個reduce就可以建立多少個子目錄,不會有文件沖突。同一個reduce處理的key都會在同一個目錄下。

文件拼接要考慮的一個索引的問題。為了將文件索引建立的盡量簡單,應(yīng)該盡量保證同一個key的所有數(shù)據(jù)都在同一個大文件中。這可以利用key的hashCode來實現(xiàn)。如果我們想在每個目錄下建立1000個文件,只需將hashCode對1000取余即可。

相關(guān)文章

  • hive數(shù)據(jù)倉庫新增字段方法

    hive數(shù)據(jù)倉庫新增字段方法

    這篇文章主要為大家介紹了hive中新增字段的方法示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-06-06
  • 詳解關(guān)于Dbeaver的常用操作

    詳解關(guān)于Dbeaver的常用操作

    這篇文章主要介紹了詳解關(guān)于Dbeaver的常用操作,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • SQL知識點之列轉(zhuǎn)行Unpivot函數(shù)

    SQL知識點之列轉(zhuǎn)行Unpivot函數(shù)

    這篇文章主要給大家介紹了關(guān)于SQL知識點之列轉(zhuǎn)行Unpivot函數(shù)的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家學(xué)習(xí)或者使用SQL具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • 淺談為什么數(shù)據(jù)庫字段建議設(shè)置為NOT NULL

    淺談為什么數(shù)據(jù)庫字段建議設(shè)置為NOT NULL

    本文主要介紹了MySQL數(shù)據(jù)庫中將字段設(shè)置為NOT NULL的性能和優(yōu)缺點,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-12-12
  • SQL注入之基于布爾的盲注詳解

    SQL注入之基于布爾的盲注詳解

    首先說明的盲注是注入的一種,指的是在不知道數(shù)據(jù)庫返回值的情況下對數(shù)據(jù)中的內(nèi)容進行猜測,實施SQL注入。盲注一般分為布爾盲注和基于時間的盲注。這篇文章主要講解的是基于布爾的盲注。下面來一起看看吧。
    2016-09-09
  • SQL注入的實現(xiàn)以及防范示例詳解

    SQL注入的實現(xiàn)以及防范示例詳解

    SQL注入是比較常見的網(wǎng)絡(luò)攻擊方式之一,它不是利用操作系統(tǒng)的BUG來實現(xiàn)攻擊,而是針對程序員編寫時的疏忽,這篇文章主要給大家介紹了關(guān)于SQL注入的實現(xiàn)以及防范的相關(guān)資料,需要的朋友可以參考下
    2021-06-06
  • 如何自己動手寫SQL執(zhí)行引擎

    如何自己動手寫SQL執(zhí)行引擎

    本文主要介紹了如何自己動手寫SQL執(zhí)行引擎,感興趣的同學(xué),可以參考下。
    2021-06-06
  • 達夢數(shù)據(jù)庫如何設(shè)置自增主鍵的方法及注意事項

    達夢數(shù)據(jù)庫如何設(shè)置自增主鍵的方法及注意事項

    這篇文章主要介紹了達夢數(shù)據(jù)庫如何設(shè)置自增主鍵的方法及注意事項的相關(guān)資料,在達夢數(shù)據(jù)庫中實現(xiàn)自增字段通常需要使用序列(sequence)和觸發(fā)器(trigger),需要的朋友可以參考下
    2024-09-09
  • SQLite 創(chuàng)建數(shù)據(jù)庫實例操作

    SQLite 創(chuàng)建數(shù)據(jù)庫實例操作

    這篇文章主要介紹了SQLite 創(chuàng)建數(shù)據(jù)庫實例操作,本文通過實例代碼給大家介紹的非常詳細,感興趣的朋友跟隨小編一起看看吧
    2024-05-05
  • 如何解決Navicat已經(jīng)成功連接,密碼忘記的問題

    如何解決Navicat已經(jīng)成功連接,密碼忘記的問題

    這篇文章主要介紹了如何解決Navicat已經(jīng)成功連接,密碼忘記的問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-07-07

最新評論

自贡市| 大丰市| 甘孜| 富顺县| 玉树县| 龙南县| 山阴县| 利辛县| 遂溪县| 赤城县| 平顶山市| 天津市| 西青区| 承德县| 嵊泗县| 青神县| 南雄市| 吉水县| 乌什县| 望谟县| 三门峡市| 浑源县| 雷波县| 临澧县| 邵阳市| 明水县| 宣汉县| 襄汾县| 石首市| 大埔区| 梁河县| 渝中区| 且末县| 双辽市| 兴和县| 淮南市| 绵阳市| 三河市| 屏南县| 枣庄市| 阳西县|