Hadoop之HDFS之一致性模型-創(chuàng)新互聯(lián)

HDFS某些地方為了性能可能會(huì)不符合POSIX(是的,你沒(méi)有看錯(cuò),POSIX不僅僅只適用于linux/unix,Hadoop 使用了POSIX的設(shè)計(jì)來(lái)實(shí)現(xiàn)對(duì)文件系統(tǒng)文件流的讀?。?,所以它看起來(lái)可能與你所期望的不同,要注意。
    創(chuàng)建了一個(gè)文件以后,它是可以在命名空間(namespace)中可以看到的:

創(chuàng)新互聯(lián)公司主打移動(dòng)網(wǎng)站、做網(wǎng)站、成都做網(wǎng)站、網(wǎng)站改版、網(wǎng)絡(luò)推廣、網(wǎng)站維護(hù)、申請(qǐng)域名、等互聯(lián)網(wǎng)信息服務(wù),為各行業(yè)提供服務(wù)。在技術(shù)實(shí)力的保障下,我們?yōu)榭蛻舫兄Z穩(wěn)定,放心的服務(wù),根據(jù)網(wǎng)站的內(nèi)容與功能再?zèng)Q定采用什么樣的設(shè)計(jì)。最后,要實(shí)現(xiàn)符合網(wǎng)站需求的內(nèi)容、功能與設(shè)計(jì),我們還會(huì)規(guī)劃穩(wěn)定安全的技術(shù)方案做保障。
Path p = new Path("p");
fs.create(p);
assertThat(fs.exists(p), is(true));

    但是任何向此文件中寫入的數(shù)據(jù)并不能保證是可見(jiàn)的,即使你flush了已經(jīng)寫入的數(shù)據(jù),此文件的長(zhǎng)度可能仍然為零:

Path p = new Path("p");
OutputStream out = fs.create(p);
out.write("content".getBytes("UTF-8"));
out.flush();
assertThat(fs.getFileStatus(p).getLen(), is(0L));

這是因?yàn)椋贖adoop中,只有滿一個(gè)block數(shù)據(jù)量的數(shù)據(jù)被寫入文件后,此文件中的內(nèi)容才是可見(jiàn)的(即這些數(shù)據(jù)會(huì)被寫入到硬盤中去),所以當(dāng)前正在寫的block中的內(nèi)容總是不可見(jiàn)的。
Hadoop提供了一種強(qiáng)制使buffer中的內(nèi)容沖洗到datanode的方法,那就是FSDataOutputStream的sync()方法。調(diào)用了sync()方法后,Hadoop保證所有已經(jīng)被寫入的數(shù)據(jù)都被沖洗到了管道線中的datanode中,并且對(duì)所有讀者都可見(jiàn)了:

Path p = new Path("p");
FSDataOutputStream out = fs.create(p);
out.write("content".getBytes("UTF-8"));
out.flush();
out.sync();
assertThat(fs.getFileStatus(p).getLen(), is(((long) "content".length())));

這個(gè)方法就像POSIX中的fsync系統(tǒng)調(diào)用(它沖洗給定文件描述符中的所有緩沖數(shù)據(jù)到磁盤中)。例如,使用java API寫一個(gè)本地文件,我們可以保證在調(diào)用flush()和同步化后可以看到已寫入的內(nèi)容:

FileOutputStream out = new FileOutputStream(localFile);
out.write("content".getBytes("UTF-8"));
out.flush(); // flush to operating system
out.getFD().sync(); // sync to disk(getFD()返回與該流所對(duì)應(yīng)的文件描述符)
assertThat(localFile.length(), is(((long) "content".length())));

在HDFS中關(guān)閉一個(gè)流隱式的調(diào)用了sync()方法:

Path p = new Path("p");
OutputStream out = fs.create(p);
out.write("content".getBytes("UTF-8"));
out.close();
assertThat(fs.getFileStatus(p).getLen(), is(((long) "content".length())));

由于Hadoop中的一致性模型限制,如果我們不調(diào)用sync()方法的話,我們很可能會(huì)丟失多大一個(gè)block的數(shù)據(jù)。這是難以接受的,所以我們應(yīng)該使用sync()方法來(lái)確保數(shù)據(jù)已經(jīng)寫入磁盤。但頻繁調(diào)用sync()方法也是不好的,因?yàn)闀?huì)造成很多額外開(kāi)銷。我們可以再寫入一定量數(shù)據(jù)后調(diào)用sync()方法一次,至于這個(gè)具體的數(shù)據(jù)量大小就要根據(jù)你的應(yīng)用程序而定了,在不影響你的應(yīng)用程序的性能的情況下,這個(gè)數(shù)據(jù)量應(yīng)越大越好。

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。

網(wǎng)站題目:Hadoop之HDFS之一致性模型-創(chuàng)新互聯(lián)
網(wǎng)頁(yè)網(wǎng)址:http://muchs.cn/article16/djiodg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站設(shè)計(jì)公司網(wǎng)頁(yè)設(shè)計(jì)公司、云服務(wù)器動(dòng)態(tài)網(wǎng)站、營(yíng)銷型網(wǎng)站建設(shè)、網(wǎng)站策劃

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

微信小程序開(kāi)發(fā)