最近我所在的一个项目进行了Hadoop版本迁移,由hadoop-0.20.2迁移至hadoop-2.2.0,旧版的mapreduce Job虽然都是用旧的API写的,但在新环境下基本上都是兼容的,只有两个涉及到global sort的Job,出现了同样的问题,报错分别如下:
1、wrong key class: org.apache.hadoop.io.LongWritable is not class com.cmri.bcpdm.v2.filters.sort.NewText at org.apache.hadoop.io.SequenceFile$RecordCompressWriter.append(SequenceFile.java:1380) at org.apache.hadoop.mapreduce.lib.partition.InputSampler.writePartitionFile(InputSampler.java:340) at org.apache.hadoop.mapred.lib.InputSampler.writePartitionFile(InputSampler.java:49) at com.cmri.bcpdm.v2.filters.sort.Sort.run(Sort.java:295)
2、wrong key class: org.apache.hadoop.io.LongWritable is not class org.apache.hadoop.io.IntWritable at org.apache.hadoop.io.SequenceFile$RecordCompressWriter.append(SequenceFile.java:1380) at org.apache.hadoop.mapreduce.lib.partition.InputSampler.writePartitionFile(InputSampler.java:340) at org.apache.hadoop.mapred.lib.InputSampler.writePartitionFile(InputSampler.java:49) at com.cmri.bcpdm.v2.filters.counttransform.CountTransform.run(CountTransform.java:223)
一开始怎么也搞不清怎么回事啊。。。后来上网找了半天,才发现hadoop源码包里边的example中就自带有sort.java的程序,仔细比较了一下新旧两个版本,觉得有必要用新的API改改旧代码了。就的API放在org.apache.hadoop.mapred包中,新API则放在org.apache.hadoop.mapreduce包中。
照着example中的程序改了之后,上述错误不见了,但出现了新的错误:
Can‘t read partitions file
Caused by: java.io.FileNotFoundException: File _partition.lst does not
exist.
意思是找不到分区文件。
又在google上找了半天,最后在这里找到了答案,其实就是把代码中的conf都改成job.getConfiguration(),具体原因不是太清楚。
PS:在用API重写的过程中,还发现了另一个问题,mapreduce在用conf.set("name","value")设置全局变量的时候,这行代码应该放在Job定义之前,也就是尽量往前放,否则可能设置不成功,map 或 reduce在读取这个全局变量的时候读出的是null,造成之后的错误。
时间: 2024-12-22 18:07:16