An empty value seems to imply that you wrote some unexpected data to your table. The following code does work correctly (using 1.7.0).

    byte[] bytes = new LongLexicoder().encode(1l);
    System.out.println(Arrays.toString(bytes));
    System.out.println(new LongLexicoder().decode(bytes));

Can you check the code you're using to create Mutations and verify that you're passing in the bytes from the LongLexicoder encode() method as the Value?

You can try removing the SummingCombiner from your table which should let you scan the table to verify the records (and also let your compactions happen). Because you removed the VersioningIterator, it should preserve all of the entries you have in the table.

z11373 wrote:
Hi,
I attach a summing combiner into a newly created table. The snippet code is
something like:

                        EnumSet<IteratorScope>  iteratorScopes =
EnumSet.allOf(IteratorScope.class);

                        // first, remove versioning iterator since it will not 
work with combiner
                        conn.tableOperations().removeIterator(tableName,
                                VERS_ITERATOR_NAME,
                                iteratorScopes);
                        
                        // create the combiner setting, in this case it is 
SummingCombiner, which
will
                        // sum value of all rows with same key (different 
timestamp is considered
same)
                        // and result in single row with that key and aggregate 
value
                        IteratorSetting setting = new IteratorSetting(
                                COMBINERS_PRIORITY,
                                SUM_COMBINERS_NAME,
                                SummingCombiner.class);
                        
                        // set the combiner to apply to all columns
                        SummingCombiner.setCombineAllColumns(setting, true);
                        
                        // need to set encoding type, otherwise exception will 
be thrown during
scan
                        SummingCombiner.setEncodingType(setting, 
LongLexicoder.class);
                        
                        // attach the combiner to the table
                        conn.tableOperations().attachIterator(tableName, 
setting,
iteratorScopes);


As you see from the code above, I use LongLexicoder class as the encoding
type.
The mutation I add for that table will be unique row id, a string for column
family, empty column qualifier, and the value is "new
LongLexicoder().encode(1L)", so basically the value is 1.

It runs fine until at one point (and I can see rows are inserted into the
table), but it hung then.
Looking at the tablet server logs I found:

2015-08-31 17:59:42,371 [tserver.MinorCompactor] WARN : MinC failed (0) to
create
hdfs://<machine>:<port>/accumulo/tables/l/default_tablet/F00009gp.rf_tmp
retrying ...
java.lang.ArrayIndexOutOfBoundsException: 0
         at
org.apache.accumulo.core.client.lexicoder.ULongLexicoder.decode(ULongLexicoder.java:60)
         at
org.apache.accumulo.core.client.lexicoder.LongLexicoder.decode(LongLexicoder.java:33)
         at
org.apache.accumulo.core.client.lexicoder.LongLexicoder.decode(LongLexicoder.java:25)
         at
org.apache.accumulo.core.iterators.TypedValueCombiner$VIterator.hasNext(TypedValueCombiner.java:82)
         at
org.apache.accumulo.core.iterators.user.SummingCombiner.typedReduce(SummingCombiner.java:31)
         at
org.apache.accumulo.core.iterators.user.SummingCombiner.typedReduce(SummingCombiner.java:27)
         at
org.apache.accumulo.core.iterators.TypedValueCombiner.reduce(TypedValueCombiner.java:182)
         at
org.apache.accumulo.core.iterators.Combiner.findTop(Combiner.java:166)
         at
org.apache.accumulo.core.iterators.Combiner.next(Combiner.java:147)
         at
org.apache.accumulo.tserver.Compactor.compactLocalityGroup(Compactor.java:505)
         at org.apache.accumulo.tserver.Compactor.call(Compactor.java:362)
         at
org.apache.accumulo.tserver.MinorCompactor.call(MinorCompactor.java:96)
         at org.apache.accumulo.tserver.Tablet.minorCompact(Tablet.java:2072)
         at org.apache.accumulo.tserver.Tablet.access$4400(Tablet.java:172)
         at
org.apache.accumulo.tserver.Tablet$MinorCompactionTask.run(Tablet.java:2159)
         at
org.apache.accumulo.core.util.LoggingRunnable.run(LoggingRunnable.java:34)
         at
org.apache.accumulo.trace.instrument.TraceRunnable.run(TraceRunnable.java:47)
         at
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
         at
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
         at
org.apache.accumulo.trace.instrument.TraceRunnable.run(TraceRunnable.java:47)
         at
org.apache.accumulo.core.util.LoggingRunnable.run(LoggingRunnable.java:34)
         at java.lang.Thread.run(Thread.java:722)


Looking at Accumulo's source code in ULongLexicoder.java, it looks like the
array is empty, hence it throws exception, which is still happening even
after I killed my app. I am thinking to stop Accumulo.
Do you have any idea why the array is empty? I am thinking to experiment
with String encoder instead of using LongLexicoder.


   public Long decode(byte[] data) {

     long l = 0;
     int shift = 0;

     if (data[0]<  0 || data[0]>  16)
       throw new IllegalArgumentException("Unexpected length " + (0xff&
data[0]));

     ...
   }


Thanks,
zainal



--
View this message in context: 
http://apache-accumulo.1065345.n5.nabble.com/exception-thrown-during-minor-compaction-tp15010.html
Sent from the Developers mailing list archive at Nabble.com.

Reply via email to