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