99999久久久久久亚洲,欧美人与禽猛交狂配,高清日韩av在线影院,一个人在线高清免费观看,啦啦啦在线视频免费观看www

熱線電話:13121318867

登錄
首頁(yè)精彩閱讀Hadoop之HDFS與小文件
Hadoop之HDFS與小文件
2017-05-24
收藏

HadoopHDFS與小文件

Hadoop有一個(gè)名為“HDFS”的分布式文件系統(tǒng),它的設(shè)計(jì)目的是提供一個(gè)高容錯(cuò),且能部署在廉價(jià)硬件的分布式系統(tǒng);它的設(shè)計(jì)參照了Google的GFS(Google分布式文件系統(tǒng));它能支持高吞吐量,適合大規(guī)模數(shù)據(jù)集應(yīng)用。

HDFS上的文件被劃分為以固定塊大小的多個(gè)分塊(默認(rèn)為64MB,如此大是為了最小化尋址開銷),每個(gè)塊作一個(gè)獨(dú)立的存儲(chǔ)單元。

這樣做有兩個(gè)好處:第一可以存儲(chǔ)容量大于單一磁盤容量的文件;第二大大簡(jiǎn)化了存儲(chǔ)子系統(tǒng)的設(shè)計(jì)(只需要管理塊,而且塊的元數(shù)據(jù)并不需要與塊一同存儲(chǔ))。將每個(gè)塊復(fù)制到少數(shù)幾個(gè)獨(dú)立的機(jī)器上(默認(rèn)為3個(gè)),可以確保在塊、磁盤或機(jī)器發(fā)生故障后數(shù)據(jù)不會(huì)丟失(即發(fā)現(xiàn)一個(gè)塊不可用,系統(tǒng)會(huì)從其他地方讀取另一個(gè)復(fù)本,同時(shí)重新復(fù)制該復(fù)本到一臺(tái)正常的機(jī)器上)。下圖展示了這些特性。

HDFS集群由一個(gè)NameNode(管理者)和多個(gè)dataNode(工作者)組成。HDFS解決了單點(diǎn)問題,HDFS集群的管理者是非常重要。NameNode管理文件系統(tǒng)的命名空間,它維護(hù)著文件系統(tǒng)樹及整顆樹內(nèi)所有的文件和目錄,同時(shí)也記錄著每個(gè)文件中各個(gè)塊到DataNode。同時(shí),NameNode(管理者)包含主要節(jié)點(diǎn)(Primary)和備份節(jié)點(diǎn)(Stand by),如果Primary出現(xiàn)問題,Stand By可自動(dòng)接替Primary繼續(xù)工作。DataNode主要負(fù)責(zé)響應(yīng)文件系統(tǒng)客戶端發(fā)出的讀寫請(qǐng)求,同時(shí)還將在NameNode的指導(dǎo)下負(fù)責(zé)執(zhí)行文件的創(chuàng)建、刪除以及復(fù)制。

Hadoop的MapReduce(分布式計(jì)算模型)處理框架正是基于HDFS構(gòu)建,它充分利用集群的并行優(yōu)勢(shì)來處理存儲(chǔ)在HDFS上的數(shù)據(jù)文件。一個(gè)MapReduce任務(wù)在集群上以任務(wù)跟蹤(TaskTracker)執(zhí)行。每個(gè)TaskTracker被Job監(jiān)控,當(dāng)發(fā)現(xiàn)一個(gè)TaskTracker執(zhí)行失敗是,JobTracker就會(huì)將該任務(wù)分配到其他機(jī)器上運(yùn)行。

在運(yùn)行MapReduce作業(yè)經(jīng)常會(huì)遇到各種問題,為了能進(jìn)行必要的優(yōu)化,理解HDFS原理還是很有必要的。下面介紹比較常見的一種情況:小文件如何拖累MapReduce作業(yè)及可采取的優(yōu)化措施。

在MapReduce作業(yè)中,Hadoop將其輸入數(shù)據(jù)劃分成等長(zhǎng)的小數(shù)據(jù)塊,稱為輸入分片。Hadoop為每個(gè)分片構(gòu)建一個(gè)map任務(wù),或者說每一個(gè)map操作只處理一個(gè)輸入分片。每個(gè)分片被劃分為若干個(gè)記錄,每條記錄就是一個(gè)鍵值對(duì),map一個(gè)接一個(gè)地處理記錄。輸入分片包括自己的大小和存儲(chǔ)位置,存儲(chǔ)位置供MapReduce系統(tǒng)將map任務(wù)盡量放在分片附近,分片大小用于排序分片,以便優(yōu)先處理最大的分片,從而最小化作業(yè)運(yùn)行時(shí)間。

在一般的MapReduce作業(yè)中,使用最多的輸入數(shù)據(jù)格式通常是存儲(chǔ)在HDFS上的文件。Hadoop自帶的FileInputFormat類是所有使用文件作為其數(shù)據(jù)源實(shí)現(xiàn)的基類。它提供兩個(gè)功能:一個(gè)用于指出作業(yè)的輸入文件位置;一個(gè)是輸入文件生成分片的實(shí)現(xiàn)代碼段。

一個(gè)文件如果大于HDFS的塊大小,那么它會(huì)被分割成多個(gè)塊,存儲(chǔ)在不同的位置。如果分片的大小大于HDFS的塊大小,那么一個(gè)分片就會(huì)從不同位置讀取,需要通過網(wǎng)絡(luò)傳輸?shù)絤ap任務(wù)節(jié)點(diǎn),與使用本地?cái)?shù)據(jù)運(yùn)行整個(gè)map任務(wù)相比,這種方法效率更低。另一方面,如果分片切分得太小,那么管理分片的總時(shí)間和構(gòu)建map任務(wù)的總時(shí)間將決定作業(yè)的整個(gè)執(zhí)行時(shí)間。因此,對(duì)于大多數(shù)作業(yè)來說,一個(gè)合理的分片大小趨向于HDFS的一個(gè)塊的大小,即64MB。


數(shù)據(jù)分析咨詢請(qǐng)掃描二維碼

若不方便掃碼,搜微信號(hào):CDAshujufenxi

數(shù)據(jù)分析師資訊
更多

OK
客服在線
立即咨詢
客服在線
立即咨詢
') } function initGt() { var handler = function (captchaObj) { captchaObj.appendTo('#captcha'); captchaObj.onReady(function () { $("#wait").hide(); }).onSuccess(function(){ $('.getcheckcode').removeClass('dis'); $('.getcheckcode').trigger('click'); }); window.captchaObj = captchaObj; }; $('#captcha').show(); $.ajax({ url: "/login/gtstart?t=" + (new Date()).getTime(), // 加隨機(jī)數(shù)防止緩存 type: "get", dataType: "json", success: function (data) { $('#text').hide(); $('#wait').show(); // 調(diào)用 initGeetest 進(jìn)行初始化 // 參數(shù)1:配置參數(shù) // 參數(shù)2:回調(diào),回調(diào)的第一個(gè)參數(shù)驗(yàn)證碼對(duì)象,之后可以使用它調(diào)用相應(yīng)的接口 initGeetest({ // 以下 4 個(gè)配置參數(shù)為必須,不能缺少 gt: data.gt, challenge: data.challenge, offline: !data.success, // 表示用戶后臺(tái)檢測(cè)極驗(yàn)服務(wù)器是否宕機(jī) new_captcha: data.new_captcha, // 用于宕機(jī)時(shí)表示是新驗(yàn)證碼的宕機(jī) product: "float", // 產(chǎn)品形式,包括:float,popup width: "280px", https: true // 更多配置參數(shù)說明請(qǐng)參見:http://docs.geetest.com/install/client/web-front/ }, handler); } }); } function codeCutdown() { if(_wait == 0){ //倒計(jì)時(shí)完成 $(".getcheckcode").removeClass('dis').html("重新獲取"); }else{ $(".getcheckcode").addClass('dis').html("重新獲取("+_wait+"s)"); _wait--; setTimeout(function () { codeCutdown(); },1000); } } function inputValidate(ele,telInput) { var oInput = ele; var inputVal = oInput.val(); var oType = ele.attr('data-type'); var oEtag = $('#etag').val(); var oErr = oInput.closest('.form_box').next('.err_txt'); var empTxt = '請(qǐng)輸入'+oInput.attr('placeholder')+'!'; var errTxt = '請(qǐng)輸入正確的'+oInput.attr('placeholder')+'!'; var pattern; if(inputVal==""){ if(!telInput){ errFun(oErr,empTxt); } return false; }else { switch (oType){ case 'login_mobile': pattern = /^1[3456789]\d{9}$/; if(inputVal.length==11) { $.ajax({ url: '/login/checkmobile', type: "post", dataType: "json", data: { mobile: inputVal, etag: oEtag, page_ur: window.location.href, page_referer: document.referrer }, success: function (data) { } }); } break; case 'login_yzm': pattern = /^\d{6}$/; break; } if(oType=='login_mobile'){ } if(!!validateFun(pattern,inputVal)){ errFun(oErr,'') if(telInput){ $('.getcheckcode').removeClass('dis'); } }else { if(!telInput) { errFun(oErr, errTxt); }else { $('.getcheckcode').addClass('dis'); } return false; } } return true; } function errFun(obj,msg) { obj.html(msg); if(msg==''){ $('.login_submit').removeClass('dis'); }else { $('.login_submit').addClass('dis'); } } function validateFun(pat,val) { return pat.test(val); }