use of io.cdap.cdap.data2.util.hbase.HBaseTableUtil in project cdap by caskdata.
the class AbstractHBaseTableUtilTest method exists.
private boolean exists(TableId tableId) throws IOException {
HBaseTableUtil tableUtil = getTableUtil();
TableId hTableId = tableUtil.createHTableId(new NamespaceId(tableId.getNamespace()), tableId.getTableName());
return tableUtil.tableExists(hAdmin, hTableId);
}
use of io.cdap.cdap.data2.util.hbase.HBaseTableUtil in project cdap by caskdata.
the class AbstractHBaseTableUtilTest method testTableSizeMetrics.
@Test
public void testTableSizeMetrics() throws Exception {
HBaseTableUtil tableUtil = getTableUtil();
// namespace should not exist
if (namespacesSupported()) {
Assert.assertFalse(tableUtil.hasNamespace(hAdmin, tableUtil.getHBaseNamespace(new NamespaceId("namespace"))));
}
Assert.assertNull(getTableStats("namespace", "table1"));
Assert.assertNull(getTableStats("namespace", "table2"));
Assert.assertNull(getTableStats("namespace", "table3"));
if (namespacesSupported()) {
createNamespace("namespace");
createNamespace("namespace2");
Assert.assertTrue(tableUtil.hasNamespace(hAdmin, tableUtil.getHBaseNamespace(new NamespaceId("namespace"))));
}
Futures.allAsList(createAsync(TableId.from("namespace", "table1")), createAsync(TableId.from("namespace2", "table1")), createAsync(TableId.from("namespace", "table2")), createAsync(TableId.from("namespace", "table3"))).get(60, TimeUnit.SECONDS);
Assert.assertTrue(exists("namespace", "table1"));
Assert.assertTrue(exists("namespace2", "table1"));
Assert.assertTrue(exists("namespace", "table2"));
Assert.assertTrue(exists("namespace", "table3"));
Tasks.waitFor(true, new Callable<Boolean>() {
@Override
public Boolean call() throws Exception {
try {
Assert.assertEquals(0, getTableStats("namespace", "table1").getTotalSizeMB());
Assert.assertEquals(0, getTableStats("namespace2", "table1").getTotalSizeMB());
Assert.assertEquals(0, getTableStats("namespace", "table2").getTotalSizeMB());
Assert.assertEquals(0, getTableStats("namespace", "table3").getTotalSizeMB());
return true;
} catch (Throwable t) {
return false;
}
}
}, 5, TimeUnit.SECONDS, 100, TimeUnit.MILLISECONDS);
writeSome("namespace2", "table1");
writeSome("namespace", "table2");
writeSome("namespace", "table3");
Tasks.waitFor(true, new Callable<Boolean>() {
@Override
public Boolean call() throws Exception {
try {
Assert.assertEquals(0, getTableStats("namespace", "table1").getTotalSizeMB());
Assert.assertTrue(getTableStats("namespace2", "table1").getTotalSizeMB() > 0);
Assert.assertTrue(getTableStats("namespace", "table2").getTotalSizeMB() > 0);
Assert.assertTrue(getTableStats("namespace", "table3").getTotalSizeMB() > 0);
return true;
} catch (Throwable t) {
return false;
}
}
}, 5, TimeUnit.SECONDS, 100, TimeUnit.MILLISECONDS);
drop("namespace", "table1");
Assert.assertFalse(exists("namespace", "table1"));
TableId hTableId = tableUtil.createHTableId(new NamespaceId("namespace"), "table2");
// TODO: TestHBase methods should eventually accept namespace as a param, but will add them incrementally
TEST_HBASE.forceRegionFlush(Bytes.toBytes(getTableNameAsString(hTableId)));
truncate("namespace", "table3");
Tasks.waitFor(true, new Callable<Boolean>() {
@Override
public Boolean call() throws Exception {
try {
Assert.assertNull(getTableStats("namespace", "table1"));
Assert.assertTrue(getTableStats("namespace", "table2").getTotalSizeMB() > 0);
Assert.assertTrue(getTableStats("namespace", "table2").getStoreFileSizeMB() > 0);
Assert.assertEquals(0, getTableStats("namespace", "table3").getTotalSizeMB());
return true;
} catch (Throwable t) {
return false;
}
}
}, 5, TimeUnit.SECONDS, 100, TimeUnit.MILLISECONDS);
// modify
HTableDescriptor desc = getTableDescriptor("namespace2", "table1");
HTableDescriptorBuilder newDesc = getTableUtil().buildHTableDescriptor(desc);
newDesc.setValue("mykey", "myvalue");
disable("namespace2", "table1");
getTableUtil().modifyTable(ddlExecutor, newDesc.build());
desc = getTableDescriptor("namespace2", "table1");
Assert.assertTrue(desc.getValue("mykey").equals("myvalue"));
enable("namespace2", "table1");
desc = getTableDescriptor("namespace", "table2");
Assert.assertNull(desc.getValue("myKey"));
// Make sure that HBase version is added
Assert.assertNotNull(desc.getValue(HBaseTableUtil.CDAP_HBASE_VERSION));
if (namespacesSupported()) {
try {
deleteNamespace("namespace");
Assert.fail("Should not be able to delete a non-empty namespace.");
} catch (ConstraintException e) {
// Expected exception
}
}
Futures.allAsList(dropAsync(TableId.from("namespace2", "table1")), dropAsync(TableId.from("namespace", "table2")), dropAsync(TableId.from("namespace", "table3"))).get(60, TimeUnit.SECONDS);
if (namespacesSupported()) {
deleteNamespace("namespace");
deleteNamespace("namespace2");
Assert.assertFalse(tableUtil.hasNamespace(hAdmin, "namespace"));
Assert.assertFalse(tableUtil.hasNamespace(hAdmin, "namespace2"));
}
}
use of io.cdap.cdap.data2.util.hbase.HBaseTableUtil in project cdap by caskdata.
the class AbstractHBaseTableUtilTest method getTableId.
private TableId getTableId(String namespace, String tableName) throws IOException {
HBaseTableUtil tableUtil = getTableUtil();
List<TableId> tableIds = tableUtil.listTablesInNamespace(hAdmin, tableUtil.getHBaseNamespace(new NamespaceId(namespace)));
for (TableId tId : tableIds) {
if (tId.getTableName().endsWith(tableName)) {
return tId;
}
}
return null;
}
use of io.cdap.cdap.data2.util.hbase.HBaseTableUtil in project cdap by caskdata.
the class AbstractHBaseTableUtilTest method truncate.
private void truncate(String namespace, String tableName) throws IOException {
HBaseTableUtil tableUtil = getTableUtil();
TableId hTableId = tableUtil.createHTableId(new NamespaceId(namespace), tableName);
tableUtil.truncateTable(ddlExecutor, hTableId);
}
use of io.cdap.cdap.data2.util.hbase.HBaseTableUtil in project cdap by caskdata.
the class HBaseCheck method run.
@Override
public void run() {
LOG.info("Checking HBase version.");
HBaseTableUtil hBaseTableUtil;
try {
hBaseTableUtil = new HBaseTableUtilFactory(cConf).get();
} catch (ProvisionException e) {
throw new RuntimeException("Unsupported Hbase version " + HBaseVersion.getVersionString());
}
LOG.info(" HBase version successfully verified.");
LOG.info("Checking HBase availability.");
try (HConnection hbaseConnection = HConnectionManager.createConnection(hConf)) {
hbaseConnection.listTables();
LOG.info(" HBase availability successfully verified.");
} catch (IOException e) {
throw new RuntimeException("Unable to connect to HBase. " + "Please check that HBase is running and that the correct HBase configuration (hbase-site.xml) " + "and libraries are included in the CDAP master classpath.", e);
}
if (hConf.getBoolean("hbase.security.authorization", false)) {
if (cConf.getBoolean(TxConstants.TransactionPruning.PRUNE_ENABLE)) {
LOG.info("HBase authorization and transaction pruning are enabled. Checking global admin privileges for cdap.");
try {
boolean isGlobalAdmin = hBaseTableUtil.isGlobalAdmin(hConf);
LOG.info("Global admin privileges check status: {}", isGlobalAdmin);
if (isGlobalAdmin) {
return;
}
// if global admin was false then depend on the TX_PRUNE_ACL_CHECK value
if (cConf.getBoolean(Constants.Startup.TX_PRUNE_ACL_CHECK, false)) {
LOG.info("Found {} to be set to true. Continuing with cdap master startup even though global admin check " + "returned false", Constants.Startup.TX_PRUNE_ACL_CHECK);
return;
}
StringBuilder builder = new StringBuilder("Transaction pruning is enabled and cdap does not have global " + "admin privileges in HBase. Global admin privileges for cdap " + "are required for transaction pruning. " + "Either disable transaction pruning or grant global admin " + "privilege to cdap in HBase or can override this " + "check by setting ");
builder.append(Constants.Startup.TX_PRUNE_ACL_CHECK);
builder.append(" in cdap-site.xml.");
if (HBaseVersion.get().equals(HBaseVersion.Version.HBASE_96) || HBaseVersion.get().equals(HBaseVersion.Version.HBASE_98)) {
builder.append(" Detected HBase version ");
builder.append(HBaseVersion.get());
builder.append(" CDAP will not be able determine if it has global admin privilege in HBase.");
builder.append(" After granting global admin privilege please set ");
builder.append(Constants.Startup.TX_PRUNE_ACL_CHECK);
}
throw new RuntimeException(builder.toString());
} catch (IOException e) {
throw new RuntimeException("Unable to determines cdap privileges as global admin in HBase.");
}
}
}
LOG.info("Hbase authorization is disabled. Skipping global admin check for transaction pruning.");
}
Aggregations