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)

错误原因:

启动任务的命令中包含一个参数“-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.恢复原有文件内容

时间: 2024-10-18 06:02:29

Hadoop中的CRC数据校验文件的相关文章

读Redis学C语言设计之三:CRC数据校验

Redis里面在网络传输和RDB备份的时候都会面临着数据出错的问题,因此采用了数据的校验.包括使用了CRC64的校验算法.CRC检验原理实际上就是在一个p位二进制数据序列之后附加一个r位二进制检验码(序列),从而构成一个总长为n=p+r位的二进制序列:附加在数据序列之后的这个检验码与数据序列的内容之间存在着某种特定的关系.如果因干扰等原因使数据序列中的某一位或某些位发生错误,这种特定关系就会被破坏.因此,通过检查这一关系,就可以实现对数据正确性的检验.Redis里面的CRC算法实现如下: uin

C#中不同格式数据校验的正则表达式

网上经常看到用正则表达式校验数据的文章,有的虽然总结得很全,但是大多数都没有经过严格验证,错误较多. 本文包含三十余条不同格式数据校验的C#正则表达式,一般均附有说明,且在Visual Studio里面跑过. 正则表达式基本规则对照表: /*说明:1.下面的正则都是以^开头,以$结尾,说明是把整个字符串拿来匹配.2.下面的正则表达式前都应该加@,例如:bool reg = Regex.IsMatch("35_ab", @"^[0-9a-zA-Z_]{1,}$");3

从0到1导出Linux下的MySQL中含有中文数据的文件(not complete)

注明版本号: 这是刚安装完MySQL的时候的样子: 首先解决secure_file_priv的问题: 由于文件是只读的,所以只能在root模式下来改.使用vi命令编辑mysqld.cnf: 在文件结尾加上这一行,保存并退出. 现在再看看: 未完待续. 参考链接: 1.mysql命令之二:查看mysql版本的四种方法 - duanxz - 博客园 https://www.cnblogs.com/duanxz/p/5244634.html 就是看个版本号,可以进入MySQL后输入status;或se

StringMVC 中如何做数据校验

步骤一:引入四个jar包 步骤二:注册类型转换器 <context:component-scan base-package="cn.happy.controller"></context:component-scan> <!-- 配置验证器 --> <bean id="myvalidator" class="org.springframework.validation.beanvalidation.LocalVal

Struts2(五)数据校验

一.概述 在提交表单数据时,如果数据需要保存到数据库,空输入等可能会引发一些异常,为了避免引起用户的输入引起底层异常,通常在进行业务逻辑操作之前,先执行基本的数据校验. 下面通过两种方式来阐述Struts 2的数据校验功能. 二.重写validate方法 我们编写的Action一般继承与ActionSupport,而ActionSupport不仅实现了Action接口,还实现了Validatable接口,提供了数据校验功能.在Validatable接口中定义一个validate方法,重写该方法,

Windows校验文件哈希hash的两种常用方式

大家经常都到哪儿去下载软件和应用程序呢?有没想过下载回来的软件.应用程序或资源是否安全呢?在 Windows 10 和 Office 2016 发布当初,很多没权限的朋友都使用第三方网站去下载安装映像.而大家如何保证自己下载回来的映像或软件就是官方版本,而没有被别人篡改过呢? 很多朋友会想到将下载回来的资源校验 MD5 或 SHA1 与官方版哈希值进行对比,如果无误则表示未被篡改.大家平常在 Windows 中都使用何种工具算校验值呢?本文向大家推荐 Windows 校验文件哈希的两种常用方式.

Redis源码中的CRC校验码(crc16、crc64)原理浅析

在阅读Redis源码的时候,看到了两个文件:crc16.c.crc64.c.下面我抛砖引玉,简析一下原理. CRC即循环冗余校验码,是信息系统中一种常见的检错码.大学课程中的"计算机网络"."计算机组成"等课程中都有提及.我们可能都了解它的数学原理,在试卷上手工计算一个CRC校验码,并不是难事.但是计算机不是人,现实世界中的数学原理需要转化为计算机算法才能实现目的.实际上作为计算机专业背景人并不会经常使用或接触到CRC的计算机算法实现的原理,通常是电子学科背景的人士

浅谈hadoop中mapreduce的文件分发

最近在做数据分析的时候,需要在mapreduce中调用c语言写的接口,此时就需要把动态链接库so文件分发到hadoop的各个节点上,原来想自己来做这个分发,大概过程就是把so文件放在hdfs上面,然后做mapreduce的时候把so文件从hdfs下载到本地,但查询资料后发现hadoop有相应的组件来帮助我们完成这个操作,这个组件就是DistributedCache,分布式缓存,运用这个东西可以做到第三方文件的分发和缓存功能,下面详解: 如果我们需要在map之间共享一些数据,如果信息量不大,我们可

springMVC数据校验与单文件上传

spring表单标签:    <fr:from/> 渲染表单元素    <fr:input/>输入框组件    <fr:password/>密码框组件标签    <fr:hidden/>隐藏框组件标签0    <fr:textarea/>多行输入框组件标签    <fr:radiobutton/>单选框组件标签    <fr:checkbox/>复选框组件标签    <fr:select/>下拉列表组件标签