中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Hadoop之HDFS之一致性模型

發布時間:2020-06-15 22:18:35 來源:網絡 閱讀:7693 作者:wangwei4078 欄目:大數據

    HDFS某些地方為了性能可能會不符合POSIX(是的,你沒有看錯,POSIX不僅僅只適用于linux/unix,Hadoop 使用了POSIX的設計來實現對文件系統文件流的讀取),所以它看起來可能與你所期望的不同,要注意。
    創建了一個文件以后,它是可以在命名空間(namespace)中可以看到的:

Path p = new Path("p");
fs.create(p);
assertThat(fs.exists(p), is(true));

    但是任何向此文件中寫入的數據并不能保證是可見的,即使你flush了已經寫入的數據,此文件的長度可能仍然為零:

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));

  這是因為,在Hadoop中,只有滿一個block數據量的數據被寫入文件后,此文件中的內容才是可見的(即這些數據會被寫入到硬盤中去),所以當前正在寫的block中的內容總是不可見的。
  Hadoop提供了一種強制使buffer中的內容沖洗到datanode的方法,那就是FSDataOutputStream的sync()方法。調用了sync()方法后,Hadoop保證所有已經被寫入的數據都被沖洗到了管道線中的datanode中,并且對所有讀者都可見了:

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())));

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

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

  在HDFS中關閉一個流隱式的調用了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中的一致性模型限制,如果我們不調用sync()方法的話,我們很可能會丟失多大一個block的數據。這是難以接受的,所以我們應該使用sync()方法來確保數據已經寫入磁盤。但頻繁調用sync()方法也是不好的,因為會造成很多額外開銷。我們可以再寫入一定量數據后調用sync()方法一次,至于這個具體的數據量大小就要根據你的應用程序而定了,在不影響你的應用程序的性能的情況下,這個數據量應越大越好。


向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

五寨县| 获嘉县| 双鸭山市| 内黄县| 冷水江市| 正镶白旗| 长白| 保康县| 达拉特旗| 江川县| 长丰县| 红河县| 通州市| 西乡县| 清流县| 宜章县| 娄烦县| 翁牛特旗| 宝丰县| 东阳市| 德安县| 两当县| 岢岚县| 乌拉特后旗| 平顺县| 乐安县| 连江县| 邵武市| 松桃| 安康市| 南宁市| 安庆市| 长治县| 桂平市| 平陆县| 丰顺县| 乾安县| 夹江县| 黄大仙区| 沁阳市| 老河口市|