From 8b9e2584ee21fdc16bd69756c4fdcb4b6a4abe94 Mon Sep 17 00:00:00 2001 From: tedyu Date: Mon, 2 May 2016 15:22:49 -0700 Subject: [PATCH] HBASE-15752 ClassNotFoundException is encountered when custom WAL codec is not found in WALPlayer job --- .../java/org/apache/hadoop/hbase/mapreduce/WALPlayer.java | 9 +++++++++ .../apache/hadoop/hbase/regionserver/wal/WALCellCodec.java | 11 +++++++++++ 2 files changed, 20 insertions(+) diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/mapreduce/WALPlayer.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/mapreduce/WALPlayer.java index 9d9cee0..00da47a 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/mapreduce/WALPlayer.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/mapreduce/WALPlayer.java @@ -44,6 +44,7 @@ import org.apache.hadoop.hbase.client.Put; import org.apache.hadoop.hbase.client.RegionLocator; import org.apache.hadoop.hbase.client.Table; import org.apache.hadoop.hbase.io.ImmutableBytesWritable; +import org.apache.hadoop.hbase.regionserver.wal.WALCellCodec; import org.apache.hadoop.hbase.regionserver.wal.WALEdit; import org.apache.hadoop.hbase.util.Bytes; import org.apache.hadoop.hbase.wal.WALKey; @@ -292,6 +293,14 @@ public class WALPlayer extends Configured implements Tool { // No reducers. job.setNumReduceTasks(0); } + String codecCls = WALCellCodec.getNonDefaultWALCellCodecClass(conf); + if (codecCls != null) { + try { + TableMapReduceUtil.addDependencyJars(conf, Class.forName(codecCls)); + } catch (Exception e) { + throw new IOException("Cannot determine wal codec class " + codecCls, e); + } + } return job; } diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/wal/WALCellCodec.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/wal/WALCellCodec.java index 6b89e89..7dad98c 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/wal/WALCellCodec.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/wal/WALCellCodec.java @@ -87,6 +87,17 @@ public class WALCellCodec implements Codec { } /** + * Retrieves custom WAL codec class name + * @param conf the Configuration from which WAL codec class is to be retrieved + * @return name of custom WAL codec class. If default codec is specified, return null + */ + public static String getNonDefaultWALCellCodecClass(Configuration conf) { + String defaultCodec = WALCellCodec.class.getName(); + String codec = conf.get(WAL_CELL_CODEC_CLASS_KEY, defaultCodec); + return !defaultCodec.equals(codec) ? codec : null; + } + + /** * Create and setup a {@link WALCellCodec} from the {@code cellCodecClsName} and * CompressionContext, if {@code cellCodecClsName} is specified. * Otherwise Cell Codec classname is read from {@link Configuration}. -- 1.7.12.4 (Apple Git-37)