首页 > 代码库 > 在hadoop-2.2.0集群上使用TotalOrderPartitioner进行排序时遇到的新旧接口问题

在hadoop-2.2.0集群上使用TotalOrderPartitioner进行排序时遇到的新旧接口问题

最近我所在的一个项目进行了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,造成之后的错误。


本文出自 “7389921” 博客,请务必保留此出处http://7399921.blog.51cto.com/7389921/1584544

在hadoop-2.2.0集群上使用TotalOrderPartitioner进行排序时遇到的新旧接口问题