发现一个特别奇葩的问题,在自己电脑上写的程序的使用MapReduce对数据进行清理,但是被同事拷贝了一份之后,在同事电脑上跑程序,就报错
使用的jdk版本是1.8的
java.lang.IllegalArgumentException: Comparison method violates its general contract!
at java.util.TimSort.mergeHi(TimSort.java:899)
at java.util.TimSort.mergeAt(TimSort.java:516)
at java.util.TimSort.mergeForceCollapse(TimSort.java:457)
at java.util.TimSort.sort(TimSort.java:254)
at java.util.Arrays.sort(Arrays.java:1512)
at java.util.ArrayList.sort(ArrayList.java:1454)
at java.util.Collections.sort(Collections.java:175)
at com.byhq.mapreduce.clikStream.pageViewReduce.reduce(pageViewReduce.java:42)
at com.byhq.mapreduce.clikStream.pageViewReduce.reduce(pageViewReduce.java:16)
at org.apache.hadoop.mapreduce.Reducer.run(Reducer.java:164)
at org.apache.hadoop.mapred.ReduceTask.runNewReducer(ReduceTask.java:610)
at org.apache.hadoop.mapred.ReduceTask.run(ReduceTask.java:444)
at org.apache.hadoop.mapred.LocalJobRunner$Job.run(LocalJobRunner.java:449)
在网上查了很多帖子都是关于jdk版本的问题,然而使用其解决方式无济于事,自己查看错误的 at java.util.TimSort.mergeHi(TimSort.java:899)源码就会发现还是自己定义比较器的时候考虑不周到
原来的比较器定义比较条件的代码
d1.getTime() >d2.getTime() ? 1 :-1
修改之后的比较器定义比较条件的代码
d1.getTime()==d2.getTime() ? 0 :(d1.getTime() >d2.getTime() ? 1 :-1)
相比之下考虑的因素更加全面,问题解决,希望大家对大家有用