我正在尝试使用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
5条答案
按热度按时间aamkag611#
您可能遇到了hadoop-7199中描述的错误。当你下载一个带有
copyToLocal
,它也会在同一目录中复制一个crc文件,因此如果您修改您的文件,然后尝试这样做copyFromLocal
,它将对您的新文件进行校验和,并与您的本地crc文件进行比较,然后失败并显示非描述性错误消息。若要修复它,请检查您是否有此crc文件,如果确实有,请将其删除并重试。
5us2dqdw2#
我遇到了完全相同的问题,没有找到任何解决办法。因为这是我第一次体验hadoop,所以我无法在互联网上遵循一些指导。我通过格式化namenode解决了这个问题。
wmvff8tz3#
好的,所以我设法解决了这个问题,我在这里写下答案,以防其他人遇到同样的问题。
我所做的只是创建一个新文件并从有问题的文件中复制所有内容。
从什么我可以假定它看起来像一些crc文件正在创建和附加到该特定文件,因此,通过尝试与另一个文件,另一个crc检查将执行。另一个原因可能是我将文件命名为attr.txt,这可能是与其他资源冲突的文件名。也许有人可以对我的答案进行更多的阐述,因为我对技术细节不是100%确定,这些只是我的观察。
fd3cxomn4#
crc文件保存特定块数据的序列号。整个数据分插到集合块中。每个块在/hdfs/data/dfs/data文件夹中存储metada和crc文件。如果有人对crc文件进行更正…实际和当前的crc序列号将不匹配,从而导致错误!!修复此错误的最佳实践是重写元数据文件和crc文件。
nnt7mjpx5#
通过删除.crc文件,我也面临同样的问题