Hadoop中的CRC數據校驗文件
阿新 • • 發佈:2017-06-21
本地磁盤 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: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.恢復原有文件內容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)
Hadoop中的CRC數據校驗文件