一、資料的完整性
由於每個磁碟或者網路上的i/o操作肯能會對正在讀寫的資料不慎引入錯誤,如果通過的資料流量非常大,資料發生損壞的機率非常高。
檢測損壞資料的常用方法是在第一次進入系統時計算資料的校驗和,然後只要資料是在乙個不可靠的通道上傳輸,就可能被損壞。如果新生成的校驗和不完全匹配原始的校驗和,那麼資料就會被認為是被損壞了。這項技術不提供任何方式來修復資料,僅僅是錯誤檢測。(有可能校驗和出錯,但資料是正確的,但肯能性不大)。
熟悉資料結構或網路程式設計的同學都知道一種常用的錯誤檢測** crc-32(迴圈冗餘檢測),計算乙個32位的任何大小輸入的整數校驗和。
二、hdfs以透明方式校驗所以寫入它的資料,在預設設定下,會在讀取資料時驗證校驗和。針對每個io.byte.per.checksum位元組,都會建立乙個單獨的校驗和。預設值為512位元組。當客戶端寫入資料並且將它傳送到乙個資料節點的管線中,管線上的最後乙個資料節點驗證校驗和,如果此節點檢測到錯誤,客戶端會收到乙個checksum exception,是ioexception的乙個子類。如果客戶端讀取資料塊時檢測到錯誤,它在丟擲checksumexception前報告該壞塊以及試圖從名稱節點中讀取資料節點,名稱節點標記該塊已損壞,會從其他副本複製乙個新的副本,這樣它的副本數就會回歸到預期的數量。損壞的副本將被刪除。
禁用校驗和:
(1)在用open()方法讀取檔案前,傳乙個falsefilesystem中的setverifychecksum()方法來禁用校驗和。
(2)shell命令,如-get,=、-copytolocal -ignorecrc等。
(3)底層檔案系統原生支援校驗和,是通過rawlocalfilesystem 來代替 localfilesystem完成的。如果只想針對某些讀取禁用校驗和,可以建立乙個rawlocalfilesystem例項,
filesystem fs = new rawlocalfilesystem();
fs.initialize(null,conf);
三、當寫入乙個名為filename的檔案時,檔案系統的客戶端以透明方式建立乙個隱藏的檔案.filename.crc,在同乙個資料夾下包含每個檔案塊的校驗和。比如hdfs塊,大小受io.bytes.per.checksum屬性控制,預設為512位元組。塊的大小作為元資料儲存在.crc檔案中。讀取檔案過程中會對校驗和進行驗證,如果檢測到錯誤,本地檔案系統丟擲checksum exception。
四、checksumfilesystem校驗和檔案系統
繼承自filterfilesystem類,為每個原始檔案建立乙個校驗和檔案,這些操作都在客戶端完成。它很容易新增到各種檔案系統中,如:
filesyatem rawfs = new localfilesystem();
filesystem checksummedfs = new checksumfilesystem(rawfs); //為rawfs建立校驗和檔案例項
方法:getrawfilwsystem() //獲得原始檔案系統
getchecksumfile(path file) //返回與file相關的校驗和檔案,字尾名為.crc
ischecksumfile(path file) //如果file為校驗和檔案,返回true
reportchecksumfailure(path f, fsdatainputstream in, long inpos, fsdatainputstream sums, long sumspos) //向檔案系統報告校驗錯誤
setverifychecksum(boolean verifychecksum) //設定是否驗證校驗
getchecksumlength
(long size, int bytespersum) //根據引數位元組計算校驗和長度
12 09學習小結 二)
接著上面的來,如果乙個控制項的值有很多,那麼傳過去時怎麼能知道是哪個值呢?下面給大家介紹兩個方法 public enumeration getparameternames 返回request中所有的引數 public string getparametervalues string name 返回乙...
二分學習小結
乙個經典問題 如何在乙個嚴格遞增序列a中找出給定的數x。二分查詢的高效之處在於,每一步都可以去除當前區間中的一半元素 因此其時間複雜度是o logn 優秀!需要注意的是 二分查詢的過程與序列的下標從0開始還是從1開始無關 include include include include include...
linux 學習第二週小結
本週學習概況 系統呼叫 標準i o庫 程序控制 程序間通訊 管道 命名管道 訊息佇列 訊號的基本操作 執行緒的基本操作 具體內容如下 系統呼叫 基本命令 who 作用 顯示登陸使用者名稱,終端名,登陸時間 open 作用 開啟乙個檔案 標頭檔案 include 原型 int open char na...