HDFS-10660. Expose storage policy apis via HDFSAdmin interface. (Contributed by Rakesh R)
This commit is contained in:
parent
ea10e1384f
commit
2f1e352912
|
@ -20,12 +20,14 @@ package org.apache.hadoop.hdfs.client;
|
||||||
import java.io.FileNotFoundException;
|
import java.io.FileNotFoundException;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.net.URI;
|
import java.net.URI;
|
||||||
|
import java.util.Collection;
|
||||||
import java.util.EnumSet;
|
import java.util.EnumSet;
|
||||||
|
|
||||||
import org.apache.hadoop.HadoopIllegalArgumentException;
|
import org.apache.hadoop.HadoopIllegalArgumentException;
|
||||||
import org.apache.hadoop.classification.InterfaceAudience;
|
import org.apache.hadoop.classification.InterfaceAudience;
|
||||||
import org.apache.hadoop.classification.InterfaceStability;
|
import org.apache.hadoop.classification.InterfaceStability;
|
||||||
import org.apache.hadoop.conf.Configuration;
|
import org.apache.hadoop.conf.Configuration;
|
||||||
|
import org.apache.hadoop.fs.BlockStoragePolicySpi;
|
||||||
import org.apache.hadoop.fs.CacheFlag;
|
import org.apache.hadoop.fs.CacheFlag;
|
||||||
import org.apache.hadoop.fs.FileStatus;
|
import org.apache.hadoop.fs.FileStatus;
|
||||||
import org.apache.hadoop.fs.FileSystem;
|
import org.apache.hadoop.fs.FileSystem;
|
||||||
|
@ -412,6 +414,39 @@ public class HdfsAdmin {
|
||||||
dfs.setStoragePolicy(src, policyName);
|
dfs.setStoragePolicy(src, policyName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Unset the storage policy set for a given file or directory.
|
||||||
|
*
|
||||||
|
* @param src file or directory path.
|
||||||
|
* @throws IOException
|
||||||
|
*/
|
||||||
|
public void unsetStoragePolicy(final Path src) throws IOException {
|
||||||
|
dfs.unsetStoragePolicy(src);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Query the effective storage policy ID for the given file or directory.
|
||||||
|
*
|
||||||
|
* @param src file or directory path.
|
||||||
|
* @return storage policy for the given file or directory.
|
||||||
|
* @throws IOException
|
||||||
|
*/
|
||||||
|
public BlockStoragePolicySpi getStoragePolicy(final Path src)
|
||||||
|
throws IOException {
|
||||||
|
return dfs.getStoragePolicy(src);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Retrieve all the storage policies supported by HDFS file system.
|
||||||
|
*
|
||||||
|
* @return all storage policies supported by HDFS file system.
|
||||||
|
* @throws IOException
|
||||||
|
*/
|
||||||
|
public Collection<? extends BlockStoragePolicySpi> getAllStoragePolicies()
|
||||||
|
throws IOException {
|
||||||
|
return dfs.getAllStoragePolicies();
|
||||||
|
}
|
||||||
|
|
||||||
private void provisionEZTrash(Path path) throws IOException {
|
private void provisionEZTrash(Path path) throws IOException {
|
||||||
// make sure the path is an EZ
|
// make sure the path is an EZ
|
||||||
EncryptionZone ez = dfs.getEZForPath(path);
|
EncryptionZone ez = dfs.getEZForPath(path);
|
||||||
|
|
|
@ -23,24 +23,35 @@ import static org.junit.Assert.assertTrue;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.net.URI;
|
import java.net.URI;
|
||||||
import java.net.URISyntaxException;
|
import java.net.URISyntaxException;
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
import org.apache.hadoop.conf.Configuration;
|
import org.apache.hadoop.conf.Configuration;
|
||||||
|
import org.apache.hadoop.fs.BlockStoragePolicySpi;
|
||||||
import org.apache.hadoop.fs.FileSystem;
|
import org.apache.hadoop.fs.FileSystem;
|
||||||
import org.apache.hadoop.fs.Path;
|
import org.apache.hadoop.fs.Path;
|
||||||
import org.apache.hadoop.hdfs.client.HdfsAdmin;
|
import org.apache.hadoop.hdfs.client.HdfsAdmin;
|
||||||
|
import org.apache.hadoop.hdfs.protocol.BlockStoragePolicy;
|
||||||
|
import org.apache.hadoop.hdfs.server.blockmanagement.BlockStoragePolicySuite;
|
||||||
import org.junit.After;
|
import org.junit.After;
|
||||||
|
import org.junit.Assert;
|
||||||
import org.junit.Before;
|
import org.junit.Before;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import com.google.common.collect.Sets;
|
||||||
|
|
||||||
public class TestHdfsAdmin {
|
public class TestHdfsAdmin {
|
||||||
|
|
||||||
private static final Path TEST_PATH = new Path("/test");
|
private static final Path TEST_PATH = new Path("/test");
|
||||||
|
private static final short REPL = 1;
|
||||||
|
private static final int SIZE = 128;
|
||||||
private final Configuration conf = new Configuration();
|
private final Configuration conf = new Configuration();
|
||||||
private MiniDFSCluster cluster;
|
private MiniDFSCluster cluster;
|
||||||
|
|
||||||
@Before
|
@Before
|
||||||
public void setUpCluster() throws IOException {
|
public void setUpCluster() throws IOException {
|
||||||
cluster = new MiniDFSCluster.Builder(conf).numDataNodes(0).build();
|
cluster = new MiniDFSCluster.Builder(conf).numDataNodes(2).build();
|
||||||
|
cluster.waitActive();
|
||||||
}
|
}
|
||||||
|
|
||||||
@After
|
@After
|
||||||
|
@ -94,4 +105,71 @@ public class TestHdfsAdmin {
|
||||||
public void testHdfsAdminWithBadUri() throws IOException, URISyntaxException {
|
public void testHdfsAdminWithBadUri() throws IOException, URISyntaxException {
|
||||||
new HdfsAdmin(new URI("file:///bad-scheme"), conf);
|
new HdfsAdmin(new URI("file:///bad-scheme"), conf);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test that we can set, get, unset storage policies via {@link HdfsAdmin}.
|
||||||
|
*/
|
||||||
|
@Test
|
||||||
|
public void testHdfsAdminStoragePolicies() throws Exception {
|
||||||
|
HdfsAdmin hdfsAdmin = new HdfsAdmin(FileSystem.getDefaultUri(conf), conf);
|
||||||
|
FileSystem fs = FileSystem.get(conf);
|
||||||
|
final Path foo = new Path("/foo");
|
||||||
|
final Path bar = new Path(foo, "bar");
|
||||||
|
final Path wow = new Path(bar, "wow");
|
||||||
|
DFSTestUtil.createFile(fs, wow, SIZE, REPL, 0);
|
||||||
|
|
||||||
|
final BlockStoragePolicySuite suite = BlockStoragePolicySuite
|
||||||
|
.createDefaultSuite();
|
||||||
|
final BlockStoragePolicy warm = suite.getPolicy("WARM");
|
||||||
|
final BlockStoragePolicy cold = suite.getPolicy("COLD");
|
||||||
|
final BlockStoragePolicy hot = suite.getPolicy("HOT");
|
||||||
|
|
||||||
|
/*
|
||||||
|
* test: set storage policy
|
||||||
|
*/
|
||||||
|
hdfsAdmin.setStoragePolicy(foo, warm.getName());
|
||||||
|
hdfsAdmin.setStoragePolicy(bar, cold.getName());
|
||||||
|
hdfsAdmin.setStoragePolicy(wow, hot.getName());
|
||||||
|
|
||||||
|
/*
|
||||||
|
* test: get storage policy after set
|
||||||
|
*/
|
||||||
|
assertEquals(hdfsAdmin.getStoragePolicy(foo), warm);
|
||||||
|
assertEquals(hdfsAdmin.getStoragePolicy(bar), cold);
|
||||||
|
assertEquals(hdfsAdmin.getStoragePolicy(wow), hot);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* test: unset storage policy
|
||||||
|
*/
|
||||||
|
hdfsAdmin.unsetStoragePolicy(foo);
|
||||||
|
hdfsAdmin.unsetStoragePolicy(bar);
|
||||||
|
hdfsAdmin.unsetStoragePolicy(wow);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* test: get storage policy after unset. HOT by default.
|
||||||
|
*/
|
||||||
|
assertEquals(hdfsAdmin.getStoragePolicy(foo), hot);
|
||||||
|
assertEquals(hdfsAdmin.getStoragePolicy(bar), hot);
|
||||||
|
assertEquals(hdfsAdmin.getStoragePolicy(wow), hot);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* test: get all storage policies
|
||||||
|
*/
|
||||||
|
// Get policies via HdfsAdmin
|
||||||
|
Set<String> policyNamesSet1 = new HashSet<>();
|
||||||
|
for (BlockStoragePolicySpi policy : hdfsAdmin.getAllStoragePolicies()) {
|
||||||
|
policyNamesSet1.add(policy.getName());
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get policies via BlockStoragePolicySuite
|
||||||
|
Set<String> policyNamesSet2 = new HashSet<>();
|
||||||
|
for (BlockStoragePolicy policy : suite.getAllPolicies()) {
|
||||||
|
policyNamesSet2.add(policy.getName());
|
||||||
|
}
|
||||||
|
// Ensure that we got the same set of policies in both cases.
|
||||||
|
Assert.assertTrue(
|
||||||
|
Sets.difference(policyNamesSet1, policyNamesSet2).isEmpty());
|
||||||
|
Assert.assertTrue(
|
||||||
|
Sets.difference(policyNamesSet2, policyNamesSet1).isEmpty());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue