package org.ff4j.hbase; import java.io.IOException; import java.util.Arrays; import java.util.Set; import java.util.stream.Stream; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.Path; import org.apache.hadoop.hbase.HBaseConfiguration; import org.apache.hadoop.hbase.HColumnDescriptor; import org.apache.hadoop.hbase.HTableDescriptor; import org.apache.hadoop.hbase.TableName; import org.apache.hadoop.hbase.client.Admin; import org.apache.hadoop.hbase.client.Connection; import org.apache.hadoop.hbase.client.ConnectionFactory; import org.apache.hadoop.hbase.client.HBaseAdmin; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * Connection to Cassandra. * * @author Cedrick Lunven (@clunven) */ public class HBaseConnection { /** logger for this store. */ private static Logger LOGGER = LoggerFactory.getLogger(HBaseConnection.class); /** Hbase configuration. */ private Configuration config = null; /** * Default Settings. */ public HBaseConnection() { this(true); } /** * Create connection from XML File. * * @param xmlConf * target xml config * @param checkConfig * if the connection must be checked */ public HBaseConnection(String xmlConf, boolean checkConfig) { config = new Configuration(true); config.addResource(new Path(xmlConf)); if (checkConfig) checkHBaseConfiguration(); } /** * Defaut settings but can skip validation. * * @param checkConfig * flag to avoid validate configuration */ public HBaseConnection(boolean checkConfig) { this(HBaseConstants.ZOOKEEPER_QUORUM_DEFAULT, HBaseConstants.ZOOKEEPER_CLIENTPORT_DEFAULT, checkConfig); } /** * Constructor with parameters. * * @param zooKeeperQuorum * list of zookeeper host separater by a comma * @param zooKeeperClientPort * zookeeper port (should be the same for all?) * @param checkConfig */ public HBaseConnection(String zooKeeperQuorum, int zooKeeperClientPort, boolean checkConfig) { config = HBaseConfiguration.create(); config.clear(); config.set(HBaseConstants.ZOOKEEPER_QUORUM_PARAM, zooKeeperQuorum); config.setInt(HBaseConstants.ZOOKEEPER_CLIENTPORT_PARAM, zooKeeperClientPort); if (checkConfig) checkHBaseConfiguration(); } /** Default. */ public HBaseConnection(Configuration hbaseConf, boolean checkConfig) { this.config = hbaseConf; if (checkConfig) checkHBaseConfiguration(); } /** * Allows check the configuration */ public void checkHBaseConfiguration() { if (config == null) { throw new IllegalStateException("Connection has not been initialized"); } try { HBaseAdmin.checkHBaseAvailable(config); } catch (Exception e) { throw new IllegalArgumentException("Cannot connect to server HBASE, please check /etc/hosts or settings."); } } /** * Helper to create a table in HBASE. * * @param tableName * current table name * @param columnFamilies * list of column families */ public void createTable(String tableName, Set<String> columnFamilies) { try (Connection hbConn = ConnectionFactory.createConnection(config)) { try(Admin hbAdmin = hbConn.getAdmin()) { TableName hTableName = TableName.valueOf(tableName); if (!hbAdmin.tableExists(hTableName)) { HTableDescriptor tableDesc = new HTableDescriptor(hTableName); columnFamilies.stream().map(HColumnDescriptor::new).forEach(tableDesc::addFamily); hbAdmin.createTable(tableDesc); } else { LOGGER.info("Table " + tableName + " already exists."); } } } catch (IOException e) { throw new IllegalArgumentException("Cannot create table " + tableName + " please check name", e); } } /** * Clear a table by its name. * * @param tableName * table name */ public void truncateTable(String tableName) { try (Connection hbConn = ConnectionFactory.createConnection(config)) { try(Admin hbAdmin = hbConn.getAdmin()) { hbAdmin.truncateTable(TableName.valueOf(tableName), true); } } catch (IOException e) { throw new IllegalArgumentException("Cannot truncate table " + tableName + " please check name", e); } } /** * List tables in DB. * * @return * get table * @throws IOException */ public Stream<String> listTablesName() throws IOException { try (Connection hbConn = ConnectionFactory.createConnection(config)) { try(Admin hbAdmin = hbConn.getAdmin()) { return Arrays.stream(hbAdmin.listTables()).map(HTableDescriptor::getNameAsString); } } catch (IOException e) { throw new IllegalArgumentException("Cannot list table names", e); } } /** * Getter accessor for attribute 'config'. * * @return * current value of 'config' */ public Configuration getConfig() { return config; } }