当从apache hadoop读取或复制到hdfs时,校验和exception

我正在尝试使用Apache hadoop实现并行化algorithm,但是在尝试从本地文件系统向hdfs传输文件时遇到了一些问题。 尝试读取或传输文件时,会引发校验和exception

奇怪的是,一些文件正在被成功复制,而另一些则没有(我尝试了2个文件,其中一个稍大于另一个,虽然尺寸虽小)。 我所做的另一个观察是Java FileSystem.getFileChecksum方法在所有情况下都返回null

我试图实现的一个轻微的背景:我试图写一个文件到hdfs,以便能够使用它作为分布式caching为我写的mapreduce作业。

我也尝试了从terminal的hadoop fs -copyFromLocal命令,结果是完全相同的行为,当它通过Java代码完成。

我已经遍布networking,包括其他问题在这里stackoverflow但是我没有设法解决这个问题。 请注意,我还是相当新的hadoop所以任何帮助,不胜感激。

我附上下面的堆栈跟踪,显示抛出的exception。 (在这种情况下,我从terminal发布了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文件保存特定块数据的序列号。 整个数据被集成到集合块中。 每个块都将metada和CRC文件一起存储在/ hdfs / data / dfs / data文件夹中。 如果有人对CRC文件进行更正…实际和当前的CRC序列号将不匹配,并导致错误! 解决此错误的最佳做法是重写元数据文件以及CRC文件。

我得到了完全相同的问题,并没有解决任何问题。 既然这是我的第一次hadoop经验,我不能遵循互联网上的一些指令。 我通过格式化我的namenode来解决这个问题。

 hadoop namenode -format