in ambari-metrics-timelineservice/src/main/java/org/apache/ambari/metrics/core/timeline/PhoenixHBaseAccessor.java [618:717]
boolean initPoliciesAndTTL() {
boolean modifyAnyTable = false;
Admin hBaseAdmin = null;
try {
hBaseAdmin = dataSource.getHBaseAdmin();
} catch (IOException e) {
LOG.warn("Unable to initialize HBaseAdmin for setting policies.", e);
}
TableName[] tableNames = null;
TableName[] containerMetricsTableName = null;
if (hBaseAdmin != null) {
try {
tableNames = hBaseAdmin.listTableNames(PHOENIX_TABLES_REGEX_PATTERN, false);
containerMetricsTableName = hBaseAdmin.listTableNames(CONTAINER_METRICS_TABLE_NAME, false);
tableNames = (TableName[]) ArrayUtils.addAll(tableNames, containerMetricsTableName);
} catch (IOException e) {
LOG.warn("Unable to get table names from HBaseAdmin for setting policies.", e);
return false;
}
if (tableNames == null || tableNames.length == 0) {
LOG.warn("Unable to get table names from HBaseAdmin for setting policies.");
return false;
}
for (String tableName : PHOENIX_TABLES) {
try {
boolean modifyTable = false;
Optional<TableName> tableNameOptional = Arrays.stream(tableNames)
.filter(t -> tableName.equals(t.getNameAsString())).findFirst();
TableDescriptor tableDescriptor = null;
if (tableNameOptional.isPresent()) {
tableDescriptor = hBaseAdmin.getTableDescriptor(tableNameOptional.get());
}
if (tableDescriptor == null) {
LOG.warn("Unable to get table descriptor for " + tableName);
continue;
}
// @TableDescriptor is immutable by design
TableDescriptorBuilder tableDescriptorBuilder =
TableDescriptorBuilder.newBuilder(tableDescriptor);
//Set normalizer preferences
boolean enableNormalizer = hbaseConf.getBoolean("hbase.normalizer.enabled", false);
if (enableNormalizer ^ tableDescriptor.isNormalizationEnabled()) {
tableDescriptorBuilder.setNormalizationEnabled(enableNormalizer);
LOG.info("Normalizer set to " + enableNormalizer + " for " + tableName);
modifyTable = true;
}
//Set durability preferences
boolean durabilitySettingsModified = setDurabilityForTable(tableName, tableDescriptorBuilder, tableDescriptor);
modifyTable = modifyTable || durabilitySettingsModified;
//Set compaction policy preferences
boolean compactionPolicyModified = false;
compactionPolicyModified = setCompactionPolicyForTable(tableName, tableDescriptorBuilder, tableDescriptor);
modifyTable = modifyTable || compactionPolicyModified;
// Change TTL setting to match user configuration
ColumnFamilyDescriptor[] columnFamilyDescriptors = tableDescriptor.getColumnFamilies();
if (columnFamilyDescriptors != null) {
for (ColumnFamilyDescriptor familyDescriptor : columnFamilyDescriptors) {
int ttlValue = familyDescriptor.getTimeToLive();
if (ttlValue != tableTTL.get(tableName)) {
ColumnFamilyDescriptorBuilder familyDescriptorBuilder =
ColumnFamilyDescriptorBuilder.newBuilder(familyDescriptor);
familyDescriptorBuilder.setTimeToLive(tableTTL.get(tableName));
LOG.info("Setting TTL on table: " + tableName + " to : " +
tableTTL.get(tableName) + " seconds.");
hBaseAdmin.modifyColumnFamily(tableNameOptional.get(), familyDescriptorBuilder.build());
modifyTable = true;
}
}
}
// Persist only if anything changed
if (modifyTable) {
modifyAnyTable = modifyTable;
hBaseAdmin.modifyTable(tableNameOptional.get(), tableDescriptorBuilder.build());
}
} catch (IOException e) {
LOG.error("Failed setting policies for " + tableName, e);
}
}
try {
hBaseAdmin.close();
} catch (IOException e) {
LOG.warn("Exception on HBaseAdmin close.", e);
}
}
return modifyAnyTable;
}