java readfully_MapReduce Error: java.io.EOFException at java.io.DataInputStream.readFully(DataInputS...

13/07/23 22:53:05 INFO jvm.JvmMetrics: Initializing JVM Metrics with processName=JobTracker, sessionId=

13/07/23 22:53:05 WARN mapred.JobClient: Use GenericOptionsParser for parsing the arguments. Applications should implement Tool for the same.

13/07/23 22:53:05 WARN mapred.JobClient: No job jar file set.  User classes may not be found. See JobConf(Class) or JobConf#setJar(String).

13/07/23 22:53:05 INFO input.FileInputFormat: Total input paths to process : 44

13/07/23 22:53:10 INFO mapred.JobClient: Running job: job_local_0001

13/07/23 22:53:10 INFO input.FileInputFormat: Total input paths to process : 44

13/07/23 22:53:10 INFO mapred.MapTask: io.sort.mb = 100

13/07/23 22:53:14 INFO mapred.JobClient:  map 0% reduce 0%

13/07/23 22:53:14 INFO mapred.MapTask: data buffer = 79691776/99614720

13/07/23 22:53:14 INFO mapred.MapTask: record buffer = 262144/327680

13/07/23 22:53:14 INFO mapred.MapTask: Starting flush of map output

13/07/23 22:53:14 WARN mapred.LocalJobRunner: job_local_0001

java.io.EOFException

at java.io.DataInputStream.readFully(DataInputStream.java:197)

at org.apache.hadoop.io.Text.

readFields(Text.java:265)

at CoOccurrence$TextPair.

readFields(CoOccurrence.java:

74)

at org.apache.hadoop.io.

serializer.

WritableSerialization$

WritableDeserializer.

deserialize(

WritableSerialization.java:67)

at org.apache.hadoop.io.

serializer.

WritableSerialization$

WritableDeserializer.

deserialize(

WritableSerialization.java:40)

at org.apache.hadoop.mapreduce.

ReduceContext.nextKeyValue(

ReduceContext.java:113)

at org.apache.hadoop.mapreduce.

ReduceContext.nextKey(

ReduceContext.java:92)

at org.apache.hadoop.mapreduce.

Reducer.run(Reducer.java:175)

at org.apache.hadoop.mapred.Task$

NewCombinerRunner.combine(

Task.java:1222)

at org.apache.hadoop.mapred.

MapTask$MapOutputBuffer.

sortAndSpill(MapTask.java:

1265)

at org.apache.hadoop.mapred.

MapTask$MapOutputBuffer.flush(

MapTask.java:1129)

at org.apache.hadoop.mapred.

MapTask$NewOutputCollector.

close(MapTask.java:549)

at org.apache.hadoop.mapred.

MapTask.runNewMapper(MapTask.

java:623)

at org.apache.hadoop.mapred.

MapTask.run(MapTask.java:305)

at org.apache.hadoop.mapred.

LocalJobRunner$Job.run(

LocalJobRunner.java:177)

13/07/23 22:53:15 INFO mapred.JobClient: Job complete: job_local_0001

13/07/23 22:53:15 INFO mapred.JobClient: Counters: 0

1、程序没有Warning

2、StackOverFlow上有说是While循环的问题:然后我把程序中的While循环注释掉还是这个Error。

3、StackOverFlow上还有人说不同的运行时间有的时候会出现,有的时候不出现。

网上还有很多办法,但是依旧没有解决掉。

最终查找到的原因:

@Override

public void readFields(DataInput in) throws IOException {

first.readFields(in);

second.readFields(in);

}

@Override

public void write(DataOutput out) throws IOException {

first.write(out);

out.write('\t');//错误原因!!!

second.write(out);

错误原因是DataInput类的readFully方法读到了文件末尾抛出了异常……

在TextPair类的readFields方法中直接使用的Text类的readFields方法

public void readFields(DataInput in) throws IOException {

int newLength = WritableUtils.readVInt(in);

setCapacity(newLength, false);

in.readFully(bytes, 0, newLength);

length = newLength;

}

这是Text类的readFields方法源代码,里面牵扯到两个类,一个是Java的DataInput类,一个是WritableUtils类,大体看了一下,Text的在序列化和反序列化时,把数据长度写入第一个byte,你在序列化时,在写了第一个变量后,又写了一个转义字符,然后继续写下一个变量,而在你读的时候却没做处理,这样就会导致读第二个变量的时候独到的第一个byte不是第二个变量的长度,而是你打的\t,长度出错了,如果读的长度比原来的长度短,反而不会出错(但是结果不对),如果比原长度长,那肯定就是EOFException,没东西可读了。

把out.write("\t")去掉就好了。

多谢cs402的同学!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
apache commons-io-2.CHM帮助文档 一、FileUtils 打开FileUtils的api文档,我们抽出一些工作中比较常用的方法,进行总结和讲解。总结如下: cleanDirectory:清空目录,但不删除目录。 contentEquals:比较两个文件的内容是否相同。 copyDirectory:将一个目录内容拷贝到另一个目录。可以通过FileFilter过滤需要拷贝的 文件。 copyFile:将一个文件拷贝到一个新的地址。 copyFileToDirectory:将一个文件拷贝到某个目录下。 copyInputStreamToFile:将一个输入流中的内容拷贝到某个文件。 deleteDirectory:删除目录。 deleteQuietly:删除文件。 listFiles:列出指定目录下的所有文件。 openInputSteam:打开指定文件的输入流。 readFileToString:将文件内容作为字符串返回。 readLines:将文件内容按行返回到一个字符串数组中。 size:返回文件或目录的大小。 write:将字符串内容直接写到文件中。 writeByteArrayToFile:将字节数组内容写到文件中。 writeLines:将容器中的元素的toString方法返回的内容依次写入文件中。 writeStringToFile:将字符串内容写到文件中。 二、IOUtils 打开IOUtils的api文档,我们发现它的方法大部分都是重载的。所以,我们理解它的方法并不是难事。因此,对于方法的用法总结如下: 1. buffer方法:将传入的流进行包装,变成缓冲流。并可以通过参数指定缓冲大小。 2. closeQueitly方法:关闭流。 3. contentEquals方法:比较两个流中的内容是否一致。 4. copy方法:将输入流中的内容拷贝到输出流中,并可以指定字符编码。 5. copyLarge方法:将输入流中的内容拷贝到输出流中,适合大于2G内容的拷贝。 6. lineIterator方法:返回可以迭代每一行内容的迭代器。 7. read方法:将输入流中的部分内容读入到字节数组中。 8. readFully方法:将输入流中的所有内容读入到字节数组中。 9. readLine方法:读入输入流内容中的一行。 10. toBufferedInputStream,toBufferedReader:将输入转为带缓存的输入流。 11. toByteArray,toCharArray:将输入流的内容转为字节数组、字符数组。 12. toString:将输入流或数组中的内容转化为字符串。 13. write方法:向流里面写入内容。 14. writeLine方法:向流里面写入一行内容。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值