比如我們遇到的這個(gè)Case:
執(zhí)行的命令:
hadoop jar dw-hadoop-2010_7_23.jar jobDriver -files tb_steps_url_path_dim.txt multisteps_output 2011-01-25
出錯(cuò)日志的提示:
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)
錯(cuò)誤原因:
啟動(dòng)任務(wù)的命令中包含一個(gè)參數(shù)“-files tb_steps_url_path_dim.txt”
Hadoop客戶端需要將機(jī)器本地磁盤(pán)中的tb_steps_url_path_dim.txt文件上傳到DFS中。
在上傳的過(guò)程中,Hadoop將通過(guò)FSInputChecker判斷需要上傳的文件是否存在進(jìn)行校驗(yàn)的crc文件,即.tb_steps_url_path_dim.txt.crc,如果存在crc文件,將會(huì)對(duì)其內(nèi)容一致性進(jìn)行校驗(yàn),如果校驗(yàn)失敗,則停止上傳該文件。最終導(dǎo)致整個(gè)MR任務(wù)無(wú)法執(zhí)行。
crc文件來(lái)源
DFS命令:hadoop fs -getmerge srcDir destFile
這類命令在執(zhí)行的時(shí)候,會(huì)將srcDir目錄下的所有文件合并成一個(gè)文件,保存在destFile中,同時(shí)會(huì)在本地磁盤(pán)生成一個(gè). destFile.crc的校驗(yàn)文件。
DFS命令:hadoop fs -get -crc src dest
這類命令在執(zhí)行的時(shí)候,會(huì)將src文件,保存在dest中,同時(shí)會(huì)在本地磁盤(pán)生成一個(gè). dest.crc的校驗(yàn)文件。
如何避免
在使用hadoop fs -getmerge srcDir destFile命令時(shí),本地磁盤(pán)一定會(huì)(沒(méi)有參數(shù)可以關(guān)閉)生成相應(yīng)的.crc文件。
所以如果需要修改getmerge獲取的文件的內(nèi)容,再次上傳到DFS時(shí),可以采取以下2種策略進(jìn)行規(guī)避:
1. 刪除.crc文件
2. 將getmerge獲取的文件修改后重新命名,如使用mv操作,再次上傳到DFS中。