HBASE-15172 Support setting storage policy in bulkload
This commit is contained in:
parent
e02ae7724d
commit
629b04f44f
|
@ -68,6 +68,7 @@ import org.apache.hadoop.hbase.regionserver.StoreFile;
|
||||||
import org.apache.hadoop.hbase.regionserver.StoreFileWriter;
|
import org.apache.hadoop.hbase.regionserver.StoreFileWriter;
|
||||||
import org.apache.hadoop.hbase.util.Bytes;
|
import org.apache.hadoop.hbase.util.Bytes;
|
||||||
import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;
|
import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;
|
||||||
|
import org.apache.hadoop.hdfs.DistributedFileSystem;
|
||||||
import org.apache.hadoop.io.NullWritable;
|
import org.apache.hadoop.io.NullWritable;
|
||||||
import org.apache.hadoop.io.SequenceFile;
|
import org.apache.hadoop.io.SequenceFile;
|
||||||
import org.apache.hadoop.io.Text;
|
import org.apache.hadoop.io.Text;
|
||||||
|
@ -125,6 +126,9 @@ public class HFileOutputFormat2
|
||||||
private static final String OUTPUT_TABLE_NAME_CONF_KEY =
|
private static final String OUTPUT_TABLE_NAME_CONF_KEY =
|
||||||
"hbase.mapreduce.hfileoutputformat.table.name";
|
"hbase.mapreduce.hfileoutputformat.table.name";
|
||||||
|
|
||||||
|
public static final String STORAGE_POLICY_PROPERTY = "hbase.hstore.storagepolicy";
|
||||||
|
public static final String STORAGE_POLICY_PROPERTY_CF_PREFIX = STORAGE_POLICY_PROPERTY + ".";
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public RecordWriter<ImmutableBytesWritable, Cell> getRecordWriter(
|
public RecordWriter<ImmutableBytesWritable, Cell> getRecordWriter(
|
||||||
final TaskAttemptContext context) throws IOException, InterruptedException {
|
final TaskAttemptContext context) throws IOException, InterruptedException {
|
||||||
|
@ -230,7 +234,9 @@ public class HFileOutputFormat2
|
||||||
|
|
||||||
// If this is a new column family, verify that the directory exists
|
// If this is a new column family, verify that the directory exists
|
||||||
if (wl == null) {
|
if (wl == null) {
|
||||||
fs.mkdirs(new Path(outputDir, Bytes.toString(family)));
|
Path cfPath = new Path(outputDir, Bytes.toString(family));
|
||||||
|
fs.mkdirs(cfPath);
|
||||||
|
configureStoragePolicy(conf, fs, family, cfPath);
|
||||||
}
|
}
|
||||||
|
|
||||||
// If any of the HFiles for the column families has reached
|
// If any of the HFiles for the column families has reached
|
||||||
|
@ -382,6 +388,29 @@ public class HFileOutputFormat2
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Configure block storage policy for CF after the directory is created.
|
||||||
|
*/
|
||||||
|
static void configureStoragePolicy(final Configuration conf, final FileSystem fs,
|
||||||
|
byte[] family, Path cfPath) {
|
||||||
|
if (null == conf || null == fs || null == family || null == cfPath) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
String policy =
|
||||||
|
conf.get(STORAGE_POLICY_PROPERTY_CF_PREFIX + Bytes.toString(family),
|
||||||
|
conf.get(STORAGE_POLICY_PROPERTY));
|
||||||
|
if (null != policy && !policy.trim().isEmpty()) {
|
||||||
|
try {
|
||||||
|
if (fs instanceof DistributedFileSystem) {
|
||||||
|
((DistributedFileSystem) fs).setStoragePolicy(cfPath, policy.trim());
|
||||||
|
}
|
||||||
|
} catch (Throwable e) {
|
||||||
|
LOG.warn("failed to set block storage policy of [" + cfPath + "] to [" + policy + "]", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Data structure to hold a Writer and amount of data written on it.
|
* Data structure to hold a Writer and amount of data written on it.
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -22,6 +22,7 @@ import static org.junit.Assert.assertEquals;
|
||||||
import static org.junit.Assert.assertFalse;
|
import static org.junit.Assert.assertFalse;
|
||||||
import static org.junit.Assert.assertNotNull;
|
import static org.junit.Assert.assertNotNull;
|
||||||
import static org.junit.Assert.assertNotSame;
|
import static org.junit.Assert.assertNotSame;
|
||||||
|
import static org.junit.Assert.assertNull;
|
||||||
import static org.junit.Assert.assertTrue;
|
import static org.junit.Assert.assertTrue;
|
||||||
import static org.junit.Assert.fail;
|
import static org.junit.Assert.fail;
|
||||||
|
|
||||||
|
@ -92,6 +93,10 @@ import org.apache.hadoop.hbase.util.Bytes;
|
||||||
import org.apache.hadoop.hbase.util.FSUtils;
|
import org.apache.hadoop.hbase.util.FSUtils;
|
||||||
import org.apache.hadoop.hbase.util.Threads;
|
import org.apache.hadoop.hbase.util.Threads;
|
||||||
import org.apache.hadoop.hbase.util.Writables;
|
import org.apache.hadoop.hbase.util.Writables;
|
||||||
|
import org.apache.hadoop.hdfs.DistributedFileSystem;
|
||||||
|
import org.apache.hadoop.hdfs.protocol.BlockStoragePolicy;
|
||||||
|
import org.apache.hadoop.hdfs.protocol.HdfsFileStatus;
|
||||||
|
import org.apache.hadoop.hdfs.server.blockmanagement.BlockStoragePolicySuite;
|
||||||
import org.apache.hadoop.io.NullWritable;
|
import org.apache.hadoop.io.NullWritable;
|
||||||
import org.apache.hadoop.mapreduce.Job;
|
import org.apache.hadoop.mapreduce.Job;
|
||||||
import org.apache.hadoop.mapreduce.Mapper;
|
import org.apache.hadoop.mapreduce.Mapper;
|
||||||
|
@ -1292,5 +1297,70 @@ public class TestHFileOutputFormat2 {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testBlockStoragePolicy() throws Exception {
|
||||||
|
util = new HBaseTestingUtility();
|
||||||
|
Configuration conf = util.getConfiguration();
|
||||||
|
conf.set(HFileOutputFormat2.STORAGE_POLICY_PROPERTY, "ALL_SSD");
|
||||||
|
conf.set(HFileOutputFormat2.STORAGE_POLICY_PROPERTY_CF_PREFIX + Bytes.toString(FAMILIES[0]),
|
||||||
|
"ONE_SSD");
|
||||||
|
Path cf1Dir = new Path(util.getDataTestDir(), Bytes.toString(FAMILIES[0]));
|
||||||
|
Path cf2Dir = new Path(util.getDataTestDir(), Bytes.toString(FAMILIES[1]));
|
||||||
|
util.startMiniDFSCluster(3);
|
||||||
|
FileSystem fs = util.getDFSCluster().getFileSystem();
|
||||||
|
try {
|
||||||
|
fs.mkdirs(cf1Dir);
|
||||||
|
fs.mkdirs(cf2Dir);
|
||||||
|
|
||||||
|
// the original block storage policy would be NULL
|
||||||
|
String spA = getStoragePolicyName(fs, cf1Dir);
|
||||||
|
String spB = getStoragePolicyName(fs, cf2Dir);
|
||||||
|
LOG.debug("Storage policy of cf 0: [" + spA + "].");
|
||||||
|
LOG.debug("Storage policy of cf 1: [" + spB + "].");
|
||||||
|
assertNull(spA);
|
||||||
|
assertNull(spB);
|
||||||
|
|
||||||
|
// alter table cf schema to change storage policies
|
||||||
|
HFileOutputFormat2.configureStoragePolicy(conf, fs, FAMILIES[0], cf1Dir);
|
||||||
|
HFileOutputFormat2.configureStoragePolicy(conf, fs, FAMILIES[1], cf2Dir);
|
||||||
|
spA = getStoragePolicyName(fs, cf1Dir);
|
||||||
|
spB = getStoragePolicyName(fs, cf2Dir);
|
||||||
|
LOG.debug("Storage policy of cf 0: [" + spA + "].");
|
||||||
|
LOG.debug("Storage policy of cf 1: [" + spB + "].");
|
||||||
|
assertNotNull(spA);
|
||||||
|
assertEquals("ONE_SSD", spA);
|
||||||
|
assertNotNull(spB);
|
||||||
|
assertEquals("ALL_SSD", spB);
|
||||||
|
} finally {
|
||||||
|
fs.delete(cf1Dir, true);
|
||||||
|
fs.delete(cf2Dir, true);
|
||||||
|
util.shutdownMiniDFSCluster();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private String getStoragePolicyName(FileSystem fs, Path path) {
|
||||||
|
try {
|
||||||
|
if (fs instanceof DistributedFileSystem) {
|
||||||
|
DistributedFileSystem dfs = (DistributedFileSystem) fs;
|
||||||
|
HdfsFileStatus status = dfs.getClient().getFileInfo(path.toUri().getPath());
|
||||||
|
if (null != status) {
|
||||||
|
byte storagePolicyId = status.getStoragePolicy();
|
||||||
|
if (storagePolicyId != BlockStoragePolicySuite.ID_UNSPECIFIED) {
|
||||||
|
BlockStoragePolicy[] policies = dfs.getStoragePolicies();
|
||||||
|
for (BlockStoragePolicy policy : policies) {
|
||||||
|
if (policy.getId() == storagePolicyId) {
|
||||||
|
return policy.getName();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (Throwable e) {
|
||||||
|
LOG.warn("failed to get block storage policy of [" + path + "]", e);
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue