commit be323e48d175327e77e6c09eafb147ce26b33465 Author: Devaraj Das Date: Thu Jan 9 17:04:26 2014 -0800 HTableDescriptor changes and shell changes for supporting REGION_REPLICATION diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/HTableDescriptor.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/HTableDescriptor.java index d1c7daf..ed7e04a 100644 --- a/hbase-client/src/main/java/org/apache/hadoop/hbase/HTableDescriptor.java +++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/HTableDescriptor.java @@ -182,6 +182,13 @@ public class HTableDescriptor implements WritableComparable { private static final ImmutableBytesWritable DURABILITY_KEY = new ImmutableBytesWritable(Bytes.toBytes("DURABILITY")); + /** + * INTERNAL number of region replicas for the table. + */ + public static final String REGION_REPLICATION = "REGION_REPLICATION"; + private static final ImmutableBytesWritable REGION_REPLICATION_KEY = + new ImmutableBytesWritable(Bytes.toBytes(REGION_REPLICATION)); + /** Default durability for HTD is USE_DEFAULT, which defaults to HBase-global default value */ private static final Durability DEFAULT_DURABLITY = Durability.USE_DEFAULT; @@ -214,6 +221,8 @@ public class HTableDescriptor implements WritableComparable { */ public static final long DEFAULT_MEMSTORE_FLUSH_SIZE = 1024*1024*128L; + public static final int DEFAULT_REGION_REPLICATION = 1; + private final static Map DEFAULT_VALUES = new HashMap(); private final static Set RESERVED_KEYWORDS @@ -227,6 +236,7 @@ public class HTableDescriptor implements WritableComparable { DEFAULT_VALUES.put(DEFERRED_LOG_FLUSH, String.valueOf(DEFAULT_DEFERRED_LOG_FLUSH)); DEFAULT_VALUES.put(DURABILITY, DEFAULT_DURABLITY.name()); //use the enum name + DEFAULT_VALUES.put(REGION_REPLICATION, String.valueOf(DEFAULT_REGION_REPLICATION)); for (String s : DEFAULT_VALUES.keySet()) { RESERVED_KEYWORDS.add(new ImmutableBytesWritable(Bytes.toBytes(s))); } @@ -1091,6 +1101,26 @@ public class HTableDescriptor implements WritableComparable { } /** + * Returns the configured replicas per region + */ + public int getRegionReplication() { + byte[] val = getValue(REGION_REPLICATION_KEY); + if (val == null || val.length == 0) { + return DEFAULT_REGION_REPLICATION; + } + return Integer.parseInt(Bytes.toString(val)); + } + + /** + * Sets the number of replicas per region. + * @param regionReplication the replication factor per region + */ + public void setRegionReplication(int regionReplication) { + setValue(REGION_REPLICATION_KEY, + new ImmutableBytesWritable(Bytes.toBytes(Integer.toString(regionReplication)))); + } + + /** * Returns all the column family names of the current table. The map of * HTableDescriptor contains mapping of family name to HColumnDescriptors. * This returns all the keys of the family map which represents the column diff --git a/hbase-shell/src/main/ruby/hbase.rb b/hbase-shell/src/main/ruby/hbase.rb index 3c09c4d..cdd8db4 100644 --- a/hbase-shell/src/main/ruby/hbase.rb +++ b/hbase-shell/src/main/ruby/hbase.rb @@ -57,6 +57,7 @@ module HBaseConstants SPLITS_FILE = 'SPLITS_FILE' SPLITALGO = 'SPLITALGO' NUMREGIONS = 'NUMREGIONS' + REGION_REPLICATION = 'REGION_REPLICATION' CONFIGURATION = org.apache.hadoop.hbase.HConstants::CONFIGURATION ATTRIBUTES="ATTRIBUTES" VISIBILITY="VISIBILITY" diff --git a/hbase-shell/src/main/ruby/hbase/admin.rb b/hbase-shell/src/main/ruby/hbase/admin.rb index ce1a8bc..22763bc 100644 --- a/hbase-shell/src/main/ruby/hbase/admin.rb +++ b/hbase-shell/src/main/ruby/hbase/admin.rb @@ -219,6 +219,10 @@ module Hbase has_columns = true next end + if arg.has_key?(REGION_REPLICATION) + region_replication = JInteger.valueOf(arg.delete(REGION_REPLICATION)) + htd.setRegionReplication(region_replication) + end # Get rid of the "METHOD", which is deprecated for create. # We'll do whatever it used to do below if it's table_att. diff --git a/hbase-shell/src/main/ruby/shell/commands/create.rb b/hbase-shell/src/main/ruby/shell/commands/create.rb index e59a5cb..8b59653 100644 --- a/hbase-shell/src/main/ruby/shell/commands/create.rb +++ b/hbase-shell/src/main/ruby/shell/commands/create.rb @@ -45,7 +45,7 @@ Examples: hbase> # Optionally pre-split the table into NUMREGIONS, using hbase> # SPLITALGO ("HexStringSplit", "UniformSplit" or classname) hbase> create 't1', 'f1', {NUMREGIONS => 15, SPLITALGO => 'HexStringSplit'} - hbase> create 't1', 'f1', {NUMREGIONS => 15, SPLITALGO => 'HexStringSplit', CONFIGURATION => {'hbase.hregion.scan.loadColumnFamiliesOnDemand' => 'true'}} + hbase> create 't1', 'f1', {NUMREGIONS => 15, SPLITALGO => 'HexStringSplit', REGION_REPLICATION => 2, CONFIGURATION => {'hbase.hregion.scan.loadColumnFamiliesOnDemand' => 'true'}} You can also keep around a reference to the created table: diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/TestHTableDescriptor.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/TestHTableDescriptor.java index 82a132f..0c0b165 100644 --- a/hbase-server/src/test/java/org/apache/hadoop/hbase/TestHTableDescriptor.java +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/TestHTableDescriptor.java @@ -49,12 +49,14 @@ public class TestHTableDescriptor { htd.setMaxFileSize(v); htd.setDurability(Durability.ASYNC_WAL); htd.setReadOnly(true); + htd.setRegionReplication(2); byte [] bytes = htd.toByteArray(); HTableDescriptor deserializedHtd = HTableDescriptor.parseFrom(bytes); assertEquals(htd, deserializedHtd); assertEquals(v, deserializedHtd.getMaxFileSize()); assertTrue(deserializedHtd.isReadOnly()); assertEquals(Durability.ASYNC_WAL, deserializedHtd.getDurability()); + assertEquals(deserializedHtd.getRegionReplication(), 2); } /**