1. 程式人生 > >Hadoop中的CRC數據校驗文件

Hadoop中的CRC數據校驗文件

本地磁盤 ati onf ase utc 獲取 line fileutil pan

錯誤分析: 今天在A程序中生成了數據,然後將A結果數據作為B的輸入數據,在查看A結果數據時候,發現有一條數據不符合規則,遂將其刪除,刪除後執行B程序則報錯.嘗試打斷點,發現程序連map過程都不執行,到了 job.waitForCompletion(true);這一步之後直接就報錯了,錯誤信息為: org.apache.hadoop.fs.ChecksumException: Checksum error: file:/E:/hdpSapce/web_log/out/golden/part-m-00000 at 0 exp: 397811546 got: -1419898685 通過搜索發現是Hadoop會校驗數據一致性的問題. 後續我還進行了一下測試: 不管是刪除一行,還是一條個字符,或者增加一個字符.只要文件有改變,那麽都會報錯. Hadoop系統為了保證數據的一致性,會對文件生成相應的校驗文件,並在讀寫的時候進行校驗,確保數據的準確性。 比如我們遇到的這個Case: 執行的命令: hadoop jar dw-hadoop-2010_7_23.jar jobDriver -files tb_steps_url_path_dim.txt multisteps_output 2011-01-25 出錯日誌的提示: 技術分享
org.apache.hadoop.fs.ChecksumException: Checksum error: file:tb_steps_url_path_dim.txt at 0
 at org.apache.hadoop.fs.FSInputChecker.verifySum(FSInputChecker.java:277)
 at org.apache.hadoop.fs.FSInputChecker.readChecksumChunk(FSInputChecker.java:241)
 at org.apache.hadoop.fs.FSInputChecker.read1(FSInputChecker.java:
189) at org.apache.hadoop.fs.FSInputChecker.read(FSInputChecker.java:158) at java.io.DataInputStream.read(DataInputStream.java:83) at org.apache.hadoop.io.IOUtils.copyBytes(IOUtils.java:49) at org.apache.hadoop.io.IOUtils.copyBytes(IOUtils.java:87) at org.apache.hadoop.fs.FileUtil.copy(FileUtil.java:
209) at org.apache.hadoop.fs.FileUtil.copy(FileUtil.java:142) at org.apache.hadoop.mapred.JobClient.copyRemoteFiles(JobClient.java:565) at org.apache.hadoop.mapred.JobClient.configureCommandLineOptions(JobClient.java:627) at org.apache.hadoop.mapred.JobClient.submitJobInternal(JobClient.java:802) at org.apache.hadoop.mapred.JobClient.submitJob(JobClient.java:771) at org.apache.hadoop.mapred.JobClient.runJob(JobClient.java:1290) at jobDriver.run(jobDriver.java:85) at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:65) at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:79) at jobDriver.main(jobDriver.java:124) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597)
View Code 錯誤原因: 啟動任務的命令中包含一個參數“-files tb_steps_url_path_dim.txt” Hadoop客戶端需要將機器本地磁盤中的tb_steps_url_path_dim.txt文件上傳到DFS中。 在上傳的過程中,Hadoop將通過FSInputChecker判斷需要上傳的文件是否存在進行校驗的crc文件,即.tb_steps_url_path_dim.txt.crc,如果存在crc文件,將會對其內容一致性進行校驗,如果校驗失敗,則停止上傳該文件。最終導致整個MR任務無法執行。 crc文件來源 DFS命令:hadoop fs -getmerge srcDir destFile 這類命令在執行的時候,會將srcDir目錄下的所有文件合並成一個文件,保存在destFile中,同時會在本地磁盤生成一個. destFile.crc的校驗文件。 DFS命令:hadoop fs -get -crc src dest 這類命令在執行的時候,會將src文件,保存在dest中,同時會在本地磁盤生成一個. dest.crc的校驗文件。 如何避免 在使用hadoop fs -getmerge srcDir destFile命令時,本地磁盤一定會(沒有參數可以關閉)生成相應的.crc文件。 所以如果需要修改getmerge獲取的文件的內容,再次上傳到DFS時,可以采取以下2種策略進行規避: 1. 刪除.crc文件 2. 將getmerge獲取的文件修改後重新命名,如使用mv操作,再次上傳到DFS中。 3.恢復原有文件內容

Hadoop中的CRC數據校驗文件