# Set in_memory=true and blockcache=true on catalog tables. # The .META. and -ROOT- tables can be created with caching and # in_memory set to false. You want them set to true so that # these hot tables make it into cache. To see if the # .META. table has BLOCKCACHE set, in the shell do the following: # # hbase> scan '-ROOT-' # # Look for the 'info' column family. See if BLOCKCACHE => 'true'? # If not, run this script and it will set the value to true. # Setting cache to 'true' will only take effect on region restart # of if you close the .META. region -- *disruptive* -- and have # it deploy elsewhere. This script runs against an up and running # hbase instance. # # To see usage for this script, run: # # ${HBASE_HOME}/bin/hbase org.jruby.Main set_meta_block_caching.rb # include Java import org.apache.hadoop.hbase.util.Bytes import org.apache.hadoop.hbase.HConstants import org.apache.hadoop.hbase.HRegionInfo import org.apache.hadoop.hbase.client.HTable import org.apache.hadoop.hbase.client.Delete import org.apache.hadoop.hbase.client.Put import org.apache.hadoop.hbase.client.Scan import org.apache.hadoop.hbase.HTableDescriptor import org.apache.hadoop.hbase.HBaseConfiguration import org.apache.hadoop.hbase.util.FSUtils import org.apache.hadoop.hbase.util.Writables import org.apache.hadoop.fs.Path import org.apache.hadoop.fs.FileSystem import org.apache.commons.logging.LogFactory # Name of this script NAME = "set_meta_block_caching.rb" # Print usage for this script def usage puts 'Usage: %s.rb]' % NAME exit! end # Get configuration to use. c = HBaseConfiguration.new() # Set hadoop filesystem configuration using the hbase.rootdir. # Otherwise, we'll always use localhost though the hbase.rootdir # might be pointing at hdfs location. c.set("fs.default.name", c.get(HConstants::HBASE_DIR)) fs = FileSystem.get(c) # Get a logger and a metautils instance. LOG = LogFactory.getLog(NAME) # Check arguments if ARGV.size > 0 usage end # Clean mentions of table from .META. # Scan the .META. and remove all lines that begin with tablename metaTable = HTable.new(c, HConstants::ROOT_TABLE_NAME) scan = Scan.new() scan.addColumn(HConstants::CATALOG_FAMILY, HConstants::REGIONINFO_QUALIFIER); scanner = metaTable.getScanner(scan) while (result = scanner.next()) rowid = Bytes.toString(result.getRow()) LOG.info("Setting BLOCKCACHE and IN_MEMORY on: " + rowid); hriValue = result.getValue(HConstants::CATALOG_FAMILY, HConstants::REGIONINFO_QUALIFIER) hri = Writables.getHRegionInfo(hriValue) family = hri.getTableDesc().getFamily(HConstants::CATALOG_FAMILY) family.setBlockCacheEnabled(true) family.setInMemory(true) p = Put.new(result.getRow()) p.add(HConstants::CATALOG_FAMILY, HConstants::REGIONINFO_QUALIFIER, Writables.getBytes(hri)); metaTable.put(p) end scanner.close()