繁体   English   中英

在apache hadoop中读取或复制到hdfs时的校验和异常

[英]Checksum Exception when reading from or copying to hdfs in apache hadoop

我正在尝试使用Apache hadoop实现并行化算法,但是当我尝试将文件从本地文件系统传输到hdfs时,我遇到了一些问题。 尝试读取或传输文件时会抛出校验和异常

奇怪的是,有些文件被成功复制而其他文件没有被复制(我尝试使用2个文件,其中一个略大于另一个,但两者都很小)。 我所做的另一个观察是Java FileSystem.getFileChecksum方法在所有情况下都返回null

关于我想要实现的目标的一个小背景:我正在尝试将文件写入hdfs,以便能够将其用作我编写的mapreduce作业的分布式缓存。

我还尝试了来自终端的hadoop fs -copyFromLocal命令,结果与通过java代码完成的行为完全相同。

我已经浏览了整个网络,包括有关stackoverflow的其他问题,但是我还没有设法解决这个问题。 请注意,我对hadoop仍然很新,所以非常感谢任何帮助。

我附加了下面的堆栈跟踪,其中显示了抛出的异常。 (在这种情况下,我发布了来自终端的hadoop fs -copyFromLocal命令产生的堆栈跟踪)

name@ubuntu:~/Desktop/hadoop2$ bin/hadoop fs -copyFromLocal ~/Desktop/dtlScaleData/attr.txt /tmp/hadoop-name/dfs/data/attr2.txt

13/03/15 15:02:51 INFO util.NativeCodeLoader: Loaded the native-hadoop library
    13/03/15 15:02:51 INFO fs.FSInputChecker: Found checksum error: b[0, 0]=
    org.apache.hadoop.fs.ChecksumException: Checksum error: /home/name/Desktop/dtlScaleData/attr.txt at 0
        at org.apache.hadoop.fs.ChecksumFileSystem$ChecksumFSInputChecker.readChunk(ChecksumFileSystem.java:219)
        at org.apache.hadoop.fs.FSInputChecker.readChecksumChunk(FSInputChecker.java:237)
        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:100)
        at org.apache.hadoop.io.IOUtils.copyBytes(IOUtils.java:68)
        at org.apache.hadoop.io.IOUtils.copyBytes(IOUtils.java:47)
        at org.apache.hadoop.io.IOUtils.copyBytes(IOUtils.java:100)
        at org.apache.hadoop.fs.FileUtil.copy(FileUtil.java:230)
        at org.apache.hadoop.fs.FileUtil.copy(FileUtil.java:176)
        at org.apache.hadoop.fs.FileSystem.copyFromLocalFile(FileSystem.java:1183)
        at org.apache.hadoop.fs.FsShell.copyFromLocal(FsShell.java:130)
        at org.apache.hadoop.fs.FsShell.run(FsShell.java:1762)
        at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:65)
        at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:79)
        at org.apache.hadoop.fs.FsShell.main(FsShell.java:1895)
    copyFromLocal: Checksum error: /home/name/Desktop/dtlScaleData/attr.txt at 0

您可能正在遇到HADOOP-7199中描述的错误。 当您使用copyToLocal下载文件时,它还会将crc文件复制到同一目录中,因此如果您修改文件然后尝试执行copyFromLocal ,它将对您的新文件执行校验和并与您的本地文件进行比较crc文件并失败,并显示非描述性错误消息。

要修复它,请检查您是否有此crc文件,如果您只是删除它并再试一次。

我通过删除.crc文件来解决同样的问题

好的,所以我设法解决了这个问题,我正在写这里的答案,以防其他人遇到同样的问题。

我所做的只是创建一个新文件并复制有问题文件中的所有内容

从我可以假设它看起来像某个crc文件正在创建并附加到该特定文件,因此通过尝试使用另一个文件,将执行另一个crc检查。 另一个原因可能是我将文件命名为attr.txt ,这可能是与其他资源冲突的文件名。 也许有人可以扩大我的答案,因为我不是100%肯定技术细节,这些只是我的观察。

CRC文件保存特定块数据的序列号。 整个数据被转移到Collective Blocks中。 每个块都存储metada以及/ hdfs / data / dfs / data文件夹中的CRC文件。 如果有人对CRC文件进行了修正......实际和当前的CRC序列号将不匹配,导致错误! 修复此ERROR的最佳做法是覆盖元数据文件和CRC文件。

我得到了完全相同的问题,没有任何解决方案。 由于这是我的第一次hadoop体验,我无法通过互联网进行一些指导。 我通过格式化我的namenode解决了这个问题。

hadoop namenode -format

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM