• Hadoop中的CRC数据校验文件


    错误分析:
    今天在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.恢复原有文件内容
     
  • 相关阅读:
    Flask:flask-script;多app应用;wtforms
    Flask:Locla;偏函数;请求上下文;蓝图;g对象;信号;flask-session
    Flask:闪现; 请求扩展;自定义中间件
    Flask:cookie和session
    Flask:请求与响应
    Flask:重定向;模板语法,
    Flask:路由系统;CBV的代码案例
    软件质量模型
    Selenium with Python 002
    Selenium with Python 001
  • 原文地址:https://www.cnblogs.com/0xcafedaddy/p/7061697.html
Copyright © 2020-2023  润新知