Excellent analysis! Thanks Dave and Jim!

On Sat, Apr 21, 2012 at 11:26 AM, Jim Donofrio <[email protected]> wrote:
> java.lang.ClassCastException: java.lang.Integer cannot be cast to
> org.apache.hadoop.io.WritableComparable
>    at
> org.apache.hadoop.io.WritableComparator.compare(WritableComparator.java:119)
>    at java.util.TreeMap.compare(TreeMap.java:1188)
>    at java.util.TreeMap.put(TreeMap.java:531)
>    at
> org.apache.hadoop.mrunit.MapReduceDriverBase.shuffle(MapReduceDriverBase.java:172)
>    at org.apache.hadoop.mrunit.MapReduceDriver.run(MapReduceDriver.java:328)
>    at
> org.apache.hadoop.mrunit.MapReduceDriverBase.runTest(MapReduceDriverBase.java:137)
>    at org.apache.hadoop.mrunit.TestDriver.runTest(TestDriver.java:158)
>    at
> org.apache.hadoop.mrunit.TestMapReduceDriver.testJavaSerialization(TestMapReduceDriver.java:409)
>
>  public int compare(Object a, Object b) {
>    return compare((WritableComparable)a, (WritableComparable)b);
>  }
>
> Java 7:
>        Entry<K,V> t = root;
>        if (t == null) {
>            compare(key, key); // type (and possibly null) check
>
>            root = new Entry<>(key, value, null);
>            size = 1;
>            modCount++;
>            return null;
>        }
>
> Java 6:
>        Entry<K,V> t = root;
>        if (t == null) {
>        // TBD:
>        // 5045147: (coll) Adding null to an empty TreeSet should
>        // throw NullPointerException
>        //
>        // compare(key, key); // type check
>            root = new Entry<K,V>(key, value, null);
>            size = 1;
>            modCount++;
>            return null;
>        }
>
> Oops this is a bug in test case not the actual code, good catch. This
> problem is not unique to Java 7. The problem only appears in Java 7 because
> my java serialization tests only use 1 input value. Java 6's put method in
> TreeMap does not call compare when adding to an empty map while Java 7's put
> method does call compare when adding to an empty map.
>
> This can be fixed in the test case by setting a
> OutputValueGroupingComparator in the conf for Integer. Users that use java
> or other non Writable serializations would know they have to set the
> relevant comparators.
>
> I dont think we need to halt the current release because the test will only
> fail under java 7 which most users will not use with hadoop. I will create a
> jira and fix those test cases though.
>
>
>
> On 04/21/2012 09:46 AM, Brock Noland wrote:
>>
>> That is interesting...What line numbers are the errors being thrown?
>>
>> On Sat, Apr 21, 2012 at 3:51 AM, Dave Beech<[email protected]>  wrote:
>>>
>>> Guys - just wanted to make you aware that some unit tests are currently
>>> failing in trunk when building against Java 7. I know this isn't strictly
>>> a
>>> problem, or even wrong since Hadoop itself requires Java 6, but it just
>>> caught me out for a minute because of my Eclipse setup!
>>>
>>> Test failures:
>>>
>>>  testJavaSerialization(org.apache.hadoop.mrunit.mapreduce.TestMapReduceDriver):
>>> java.lang.Integer cannot be cast to
>>> org.apache.hadoop.io.WritableComparable
>>>  testJavaSerialization(org.apache.hadoop.mrunit.TestMapReduceDriver):
>>> java.lang.Integer cannot be cast to
>>> org.apache.hadoop.io.WritableComparable
>>>
>>>  testJavaSerialization(org.apache.hadoop.mrunit.TestPipelineMapReduceDriver):
>>> java.lang.Integer cannot be cast to
>>> org.apache.hadoop.io.WritableComparable
>>>
>>> Maybe we should add a note in BUILD.txt to say Java 6 *must* be used? It
>>> sort of does at the moment but I think it could be more explicit.
>>>
>>> Dave
>>>
>>
>>
>



-- 
Apache MRUnit - Unit testing MapReduce - http://incubator.apache.org/mrunit/

Reply via email to