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

l7wslrjt  于 2021-06-03  发布在  Hadoop
关注(0)|答案(5)|浏览(443)

我正在尝试使用apachehadoop实现一个并行算法,但是在尝试将文件从本地文件系统传输到hdfs时遇到了一些问题。尝试读取或传输文件时引发校验和异常。
奇怪的是,有些文件被成功复制,而另一些文件则没有(我尝试了两个文件,一个文件比另一个稍大,两个文件的大小都很小)。我所做的另一个观察是,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
aamkag61

aamkag611#

您可能遇到了hadoop-7199中描述的错误。当你下载一个带有 copyToLocal ,它也会在同一目录中复制一个crc文件,因此如果您修改您的文件,然后尝试这样做 copyFromLocal ,它将对您的新文件进行校验和,并与您的本地crc文件进行比较,然后失败并显示非描述性错误消息。
若要修复它,请检查您是否有此crc文件,如果确实有,请将其删除并重试。

5us2dqdw

5us2dqdw2#

我遇到了完全相同的问题,没有找到任何解决办法。因为这是我第一次体验hadoop,所以我无法在互联网上遵循一些指导。我通过格式化namenode解决了这个问题。

hadoop namenode -format
wmvff8tz

wmvff8tz3#

好的,所以我设法解决了这个问题,我在这里写下答案,以防其他人遇到同样的问题。
我所做的只是创建一个新文件并从有问题的文件中复制所有内容。
从什么我可以假定它看起来像一些crc文件正在创建和附加到该特定文件,因此,通过尝试与另一个文件,另一个crc检查将执行。另一个原因可能是我将文件命名为attr.txt,这可能是与其他资源冲突的文件名。也许有人可以对我的答案进行更多的阐述,因为我对技术细节不是100%确定,这些只是我的观察。

fd3cxomn

fd3cxomn4#

crc文件保存特定块数据的序列号。整个数据分插到集合块中。每个块在/hdfs/data/dfs/data文件夹中存储metada和crc文件。如果有人对crc文件进行更正…实际和当前的crc序列号将不匹配,从而导致错误!!修复此错误的最佳实践是重写元数据文件和crc文件。

nnt7mjpx

nnt7mjpx5#

通过删除.crc文件,我也面临同样的问题

相关问题