24

我正在尝试使用 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
4

5 回答 5

61

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

要修复它,请检查您是否有此crc文件,如果您确实删除它并重试。

于 2013-03-15T22:04:10.263 回答
4

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

于 2016-03-25T18:09:43.643 回答
1

CRC 文件保存特定块数据的序列号。整个数据被拆分成集体块。每个块都将元数据与 CRC 文件一起存储在 /hdfs/data/dfs/data 文件夹中。如果有人对 CRC 文件进行更正......实际和当前的 CRC 序列号将不匹配,并导致错误!修复此错误的最佳做法是覆盖元数据文件和 CRC 文件。

于 2013-05-20T07:32:35.320 回答
1

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

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

据我推测,似乎正在创建一些crc文件并将其附加到该特定文件,因此通过尝试使用另一个文件,将执行另一个crc检查。另一个原因可能是我将文件命名为attr.txt,这可能是与其他资源冲突的文件名。也许有人可以进一步扩展我的答案,因为我不能 100% 确定技术细节,这些只是我的观察。

于 2013-03-16T07:25:31.960 回答
-3

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

hadoop namenode -format
于 2014-05-02T09:23:27.673 回答