/******************************************************************************* * * Pentaho Big Data * * Copyright (C) 2002-2016 by Pentaho : http://www.pentaho.com * ******************************************************************************* * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ******************************************************************************/ package org.pentaho.hbase.shim.spi; import java.net.MalformedURLException; import java.net.URL; import java.util.List; import java.util.NavigableMap; import java.util.Properties; import org.pentaho.di.core.variables.VariableSpace; import org.pentaho.hadoop.shim.api.Configuration; import org.pentaho.hbase.shim.api.ColumnFilter; import org.pentaho.hbase.shim.api.HBaseValueMeta; public abstract class HBaseConnection { // version key public static final String HBASE_VERSION_KEY = "hbase.defaults.for.version"; // constant connection keys public static final String DEFAULTS_KEY = "hbase.default"; public static final String SITE_KEY = "hbase.site"; public static final String ZOOKEEPER_QUORUM_KEY = "hbase.zookeeper.quorum"; public static final String ZOOKEEPER_PORT_KEY = "hbase.zookeeper.property.clientPort"; // constant table creation option keys (commented out keys don't exist as // options for HColumnDescriptor in 0.90.3) // public static final String COL_DESCRIPTOR_MIN_VERSIONS_KEY = // "col.descriptor.minVersions"; public static final String COL_DESCRIPTOR_MAX_VERSIONS_KEY = "col.descriptor.maxVersions"; // public static final String COL_DESCRIPTOR_KEEP_DELETED_CELLS_KEY = // "col.descriptor.keepDeletedCells"; public static final String COL_DESCRIPTOR_COMPRESSION_KEY = "col.descriptor.compression"; // public static final String COL_DESCRIPTOR_ENCODE_ON_DISK_KEY = // "col.descriptor.encodeOnDisk"; // public static final String COL_DESCRIPTOR_DATA_BLOCK_ENCODING_KEY = // "col.descriptor.dataBlockEncoding"; public static final String COL_DESCRIPTOR_IN_MEMORY_KEY = "col.descriptor.inMemory"; public static final String COL_DESCRIPTOR_BLOCK_CACHE_ENABLED_KEY = "col.descriptor.blockCacheEnabled"; public static final String COL_DESCRIPTOR_BLOCK_SIZE_KEY = "col.descriptor.blockSize"; public static final String COL_DESCRIPTOR_TIME_TO_LIVE_KEY = "col.desciptor.timeToLive"; public static final String COL_DESCRIPTOR_BLOOM_FILTER_KEY = "col.descriptor.bloomFilter"; public static final String COL_DESCRIPTOR_SCOPE_KEY = "col.descriptor.scope"; // constant HTable writing keys public static final String HTABLE_WRITE_BUFFER_SIZE_KEY = "htable.writeBufferSize"; /** * Method for getting a byte utility implementation * * @return * @throws Exception */ public abstract HBaseBytesUtilShim getBytesUtil() throws Exception; /** * Configure the HBase connection using the supplied connection properties * * @param connProps the properties supplying connection details * @param logMessages will hold any log messages generated during the * connection configuration process * @throws Exception if a problem occurs */ public abstract void configureConnection( Properties connProps, List<String> logMessages ) throws Exception; /** * Check if HBase is available and running * * @throws Exception if a problem occurs */ public abstract void checkHBaseAvailable() throws Exception; /** * Gets a list of tables from HBase * * @return a list of tables * @throws Exception if a problem occurs */ public abstract List<String> listTableNames() throws Exception; /** * Returns true if the named table exists in HBase * * @param tableName the name of the table to check * @return true if the table exists * @throws Exception if a problem occurs */ public abstract boolean tableExists( String tableName ) throws Exception; /** * Returns true if the named table is disabled in HBase * * @param tableName the name of the table to check * @return true if the table is disabled * @throws Exception if a problem occurs */ public abstract boolean isTableDisabled( String tableName ) throws Exception; /** * Returns true if the named table is available * * @param tableName the name of the table to check * @return true if the table is available * @throws Exception if a problem occurs */ public abstract boolean isTableAvailable( String tableName ) throws Exception; /** * Disable the named table * * @param tableName the name of the table to disable * @throws Exception if a problem occurs */ public abstract void disableTable( String tableName ) throws Exception; /** * Enable the named table * * @param tableName the name of the table to enable * @throws Exception if a problem occurs */ public abstract void enableTable( String tableName ) throws Exception; /** * Delete the named table from HBase * * @param tableName the name of the table to delete * @throws Exception if a problem occurs */ public abstract void deleteTable( String tableName ) throws Exception; /** * Delete a row from the current target table * * @param rowKey the key of the row to delete * @throws Exception if no target table has been specified yet via * <code>newTargetTable</code> or a problem occurs during the * operation. */ public abstract void executeTargetTableDelete( byte[] rowKey ) throws Exception; /** * Create the named table in HBase * * @param tableName the name of the table to create * @param colFamilyNames a list of column families to create in the new table * @param creationProps options for table creation (see the constant table * creation keys). * @throws Exception a problem occurs */ public abstract void createTable( String tableName, List<String> colFamilyNames, Properties creationProps ) throws Exception; /** * Return a list of column families for the supplied table name * * @param tableName the name of the table to list column families for * @return a list of column families existing in the named table * @throws Exception if a problem occurs */ public abstract List<String> getTableFamiles( String tableName ) throws Exception; /** * Specify a new source table to use for read operations * * @param tableName the name of the table to read from * @throws Exception if a problem occurs */ public abstract void newSourceTable( String tableName ) throws Exception; /** * Returns true if the source table contains a row with the given row key * * @param rowKey the row key to check for * @return true if the source table contains a row with the given row key * @throws Exception if a problem occurs */ public abstract boolean sourceTableRowExists( byte[] rowKey ) throws Exception; /** * Configure a new source table scan. HBase can do a full table scan if no * lower and upper bound are supplied or an open upper-ended scan if a lower * bound but no upper bound is specified. An upper bound with no lower bound * is not allowed. * * @param keyLowerBound the lower bound of the scan range (may be null for no * lower bound) * @param keyUpperBound the upper bound of the scan range (man be null for no * upper bound). * @param cacheSize the size of the scanner cache * @throws Exception no source table has been specified or if a problem occurs */ public abstract void newSourceTableScan( byte[] keyLowerBound, byte[] keyUpperBound, int cacheSize ) throws Exception; /** * Configure a new target table put * * @param key the key of the row that will be inserted into the target table * @param writeToWAL false to disable the write to WAL * @throws Exception if no target table has been specified or if a problem * occurs */ public abstract void newTargetTablePut( byte[] key, boolean writeToWAL ) throws Exception; /** * Returns true if the target table is set up to automatically flush commits * * @return true if the target table is auto flush * @throws Exception if no target table has been specified or if a problem * occurs */ public abstract boolean targetTableIsAutoFlush() throws Exception; /** * Executes the last configured target table push * * @throws Exception if no target table has been specified or if a problem * occurs */ public abstract void executeTargetTablePut() throws Exception; /** * Flush any buffered commits for the target table * * @throws Exception if a problem occurs */ public abstract void flushCommitsTargetTable() throws Exception; /** * Add a column value to the current target table push * * @param columnFamily the column family to add the column to * @param columnName the name of the column to add * @param colNameIsBinary true if the column name is binary * @param colValue the encoded column value to add * @throws Exception if a problem occurs */ public abstract void addColumnToTargetPut( String columnFamily, String columnName, boolean colNameIsBinary, byte[] colValue ) throws Exception; /** * Add a column filter to the list of filters that the scanner will apply to * rows server-side. * * @param cf the column filter to add * @param columnMeta the meta data for the column used in the filter to add * @param vars environment variables * @param matchAny true if the list of filters (if not created yet) should be * "match one" (and false if it should be "match all") * @throws Exception if a problem occurs */ public abstract void addColumnFilterToScan( ColumnFilter cf, HBaseValueMeta columnMeta, VariableSpace vars, boolean matchAny ) throws Exception; /** * Add a specific column to the current source table scan * * @param colFamilyName the name of the column family containing the column to * add * @param colName the name of the column * @param colNameIsBinary true if the column name is binary * @throws Exception if a problem occurs */ public abstract void addColumnToScan( String colFamilyName, String colName, boolean colNameIsBinary ) throws Exception; /** * Execute the current source table scan * * @throws Exception if a problem occurs */ public abstract void executeSourceTableScan() throws Exception; /** * Advance the source table scanner to the next row. * * @return true if the scanner was advanced and the next row is now the * current row; false if there is no next row. * @throws Exception if a source table or source scan has not been specified, * if the scan has not been "executed" or if a problem occurs. */ public abstract boolean resultSetNextRow() throws Exception; /** * Get the row key of the supplied row object. * * @param aRow an HBase row * @return the raw row key * @throws Exception if the supplied object is not of the correct type for the * current instance/version of HBase wrapped by this HBaseAdmin or * if a problem occurs */ public abstract byte[] getRowKey( Object aRow ) throws Exception; /** * Get the row key of the current row from the current source table scan * * @return the raw row key of the current source table row. * @throws Exception if source table or source scan has not been configured, * the source scan has not been "executed" or a problem occurs */ public abstract byte[] getResultSetCurrentRowKey() throws Exception; /** * get the latest version of a column in the supplied row object * * @param aRow an HBase row * @param colFamilyName the name of the column family that the column belongs * to * @param colName the name of the column in question * @param colNameIsBinary true if the column name is binary * @return the raw column value * @throws Exception if the supplied object is not of the correct type for the * current instance/version of HBase wrapped by this HBaseAdmin or * if a problem occurs */ public abstract byte[] getRowColumnLatest( Object aRow, String colFamilyName, String colName, boolean colNameIsBinary ) throws Exception; /** * Checks if the supplied object is a HBase "row" for the instance/version of * HBase wrapped by this HBaseAdmin * * @param rowToCheck an HBase row to check for validity * @return true if the supplied object is an HBase "row" object */ public abstract boolean checkForHBaseRow( Object rowToCheck ); /** * Gets the value of a column from the current row from the source table scan * * @param colFamilyName the name of the column family to look for the column * in * @param colName the name of the column * @param colNameIsBinary true if the column name is binary * * @return the value of the column or null if the column is not in the row (or * in the subset of columns specified in the scan for the current * row). * @throws Exception if the source table or scan isn't configured, the source * scan has not been "executed" or a problem occurs */ public abstract byte[] getResultSetCurrentRowColumnLatest( String colFamilyName, String colName, boolean colNameIsBinary ) throws Exception; /** * Return a map of columns to values from the supplied HBase row object for * the supplied column family name * * @param aRow an HBase row object * @param familyName the column family to return columns from * @return a map of column names to values * @throws Exception if the supplied row object isn't valid with respect to * the instance/versions of HBase wrapped by this HBaseAdmin or a * problem occurs */ public abstract NavigableMap<byte[], byte[]> getRowFamilyMap( Object aRow, String familyName ) throws Exception; /** * Return a map of columns to values from the current source table scan row * for the supplied column family name. * * @param familyName the column family to return rows from * @return a map of column names to values * @throws Exception if the supplied row object isn't valid with respect to * the instance/versions of HBase wrapped by this HBaseAdmin or a * problem occurs */ public abstract NavigableMap<byte[], byte[]> getResultSetCurrentRowFamilyMap( String familyName ) throws Exception; /** * Get a full map for the supplied HBase row (i.e. column family -> column * name -> col value). * * @param aRow an HBase row object * @return a map of column families to columns to column values * @throws Exception if the supplied row object is not valid with respect to * the instance/version of HBase wrapped by this HBaseAdmin or a * problem occurs */ public abstract NavigableMap<byte[], NavigableMap<byte[], NavigableMap<Long, byte[]>>> getRowMap( Object aRow ) throws Exception; /** * Get a full map from the current source table scan row (i.e. column family * -> column name -> col value). * * @return a map of column families to columns to column values * @throws Exception if the source table or scan is not configured, the scan * hasn't been "executed" or a problem occurs */ public abstract NavigableMap<byte[], NavigableMap<byte[], NavigableMap<Long, byte[]>>> getResultSetCurrentRowMap() throws Exception; /** * Close the current source table * * @throws Exception if a problem occurs */ public abstract void closeSourceTable() throws Exception; /** * Close the current source scan's result set * * @throws Exception if a problem occurs */ public abstract void closeSourceResultSet() throws Exception; /** * Specify an new target table to write to * * @param tableName the name of the target table * @param props properties for writing (constant HTable writing keys) * @throws Exception if the connection HBaseAdmin hasn't been configured or a * problem occurs */ public abstract void newTargetTable( String tableName, Properties props ) throws Exception; /** * Close the target table * * @throws Exception if a problem occurs */ public abstract void closeTargetTable() throws Exception; /** * Determines if the object is an * {@link org.apache.hadoop.hbase.io.ImmutableBytesWritable}. * * @return {@code true} if {@code o} is an * {@link org.apache.hadoop.hbase.io.ImmutableBytesWritable}. */ public abstract boolean isImmutableBytesWritable( Object o ); /** * Utility method to covert a string to a URL object. * * @param pathOrURL file or http URL as a string * @return a URL * @throws MalformedURLException if there is a problem with the URL. */ public static URL stringToURL( String pathOrURL ) throws MalformedURLException { URL result = null; if ( !isEmpty( pathOrURL ) ) { if ( pathOrURL.toLowerCase().startsWith( "http://" ) || pathOrURL.toLowerCase().startsWith( "file://" ) ) { result = new URL( pathOrURL ); } else { String c = "file://" + pathOrURL; result = new URL( c ); } } return result; } public static boolean isEmpty( String toCheck ) { return ( toCheck == null || toCheck.length() == 0 ); } /** * Is used to close all backed resources * @throws Exception is thrown in case of any failure */ public abstract void close() throws Exception; public abstract void obtainAuthTokenForJob( Configuration conf ) throws Exception; }