From ed8f1ae6022d34fdce420d86e8f31a0ece63f4ee Mon Sep 17 00:00:00 2001 From: Chen Liang Date: Wed, 2 Oct 2019 16:38:20 -0700 Subject: [PATCH] HDFS-14858. [SBN read] Allow configurably enable/disable AlignmentContext on NameNode. Contributed by Chen Liang. --- .../java/org/apache/hadoop/hdfs/DFSConfigKeys.java | 6 +++++- .../hdfs/server/namenode/NameNodeRpcServer.java | 14 +++++++++++++- .../src/main/resources/hdfs-default.xml | 11 +++++++++++ .../src/site/markdown/ObserverNameNode.md | 14 ++++++++++++++ .../hdfs/TestStateAlignmentContextWithHA.java | 1 + .../namenode/ha/TestConsistentReadsObserver.java | 2 ++ .../server/namenode/ha/TestMultiObserverNode.java | 2 ++ .../hdfs/server/namenode/ha/TestObserverNode.java | 2 ++ 8 files changed, 50 insertions(+), 2 deletions(-) diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/DFSConfigKeys.java b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/DFSConfigKeys.java index 56b0e9e63fc..cb26118f5dc 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/DFSConfigKeys.java +++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/DFSConfigKeys.java @@ -1081,7 +1081,11 @@ public class DFSConfigKeys extends CommonConfigurationKeys { "dfs.namenode.send.qop.enabled"; public static final boolean DFS_NAMENODE_SEND_QOP_ENABLED_DEFAULT = false; - // dfs.client.retry confs are moved to HdfsClientConfigKeys.Retry + public static final String DFS_NAMENODE_STATE_CONTEXT_ENABLED_KEY = + "dfs.namenode.state.context.enabled"; + public static final boolean DFS_NAMENODE_STATE_CONTEXT_ENABLED_DEFAULT = false; + + // dfs.client.retry confs are moved to HdfsClientConfigKeys.Retry @Deprecated public static final String DFS_CLIENT_RETRY_POLICY_ENABLED_KEY = HdfsClientConfigKeys.Retry.POLICY_ENABLED_KEY; diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/NameNodeRpcServer.java b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/NameNodeRpcServer.java index 2f1273c2fa5..972f4514bb0 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/NameNodeRpcServer.java +++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/NameNodeRpcServer.java @@ -27,6 +27,8 @@ import static org.apache.hadoop.hdfs.DFSConfigKeys.DFS_NAMENODE_SERVICE_HANDLER_COUNT_DEFAULT; import static org.apache.hadoop.hdfs.DFSConfigKeys.DFS_NAMENODE_SERVICE_HANDLER_COUNT_KEY; import static org.apache.hadoop.hdfs.DFSConfigKeys.DFS_NAMENODE_RPC_ADDRESS_AUXILIARY_KEY; +import static org.apache.hadoop.hdfs.DFSConfigKeys.DFS_NAMENODE_STATE_CONTEXT_ENABLED_DEFAULT; +import static org.apache.hadoop.hdfs.DFSConfigKeys.DFS_NAMENODE_STATE_CONTEXT_ENABLED_KEY; import static org.apache.hadoop.hdfs.server.common.HdfsServerConstants.MAX_PATH_DEPTH; import static org.apache.hadoop.hdfs.server.common.HdfsServerConstants.MAX_PATH_LENGTH; @@ -434,6 +436,16 @@ public NameNodeRpcServer(Configuration conf, NameNode nn) } LOG.info("RPC server is binding to " + bindHost + ":" + rpcAddr.getPort()); + boolean enableStateContext = conf.getBoolean( + DFS_NAMENODE_STATE_CONTEXT_ENABLED_KEY, + DFS_NAMENODE_STATE_CONTEXT_ENABLED_DEFAULT); + LOG.info("Enable NameNode state context:" + enableStateContext); + + GlobalStateIdContext stateIdContext = null; + if (enableStateContext) { + stateIdContext = new GlobalStateIdContext((namesystem)); + } + this.clientRpcServer = new RPC.Builder(conf) .setProtocol( org.apache.hadoop.hdfs.protocolPB.ClientNamenodeProtocolPB.class) @@ -441,7 +453,7 @@ public NameNodeRpcServer(Configuration conf, NameNode nn) .setPort(rpcAddr.getPort()).setNumHandlers(handlerCount) .setVerbose(false) .setSecretManager(namesystem.getDelegationTokenSecretManager()) - .setAlignmentContext(new GlobalStateIdContext(namesystem)) + .setAlignmentContext(stateIdContext) .build(); // Add all the RPC protocols that the namenode implements diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/resources/hdfs-default.xml b/hadoop-hdfs-project/hadoop-hdfs/src/main/resources/hdfs-default.xml index 2754a42f87d..f80131dbb65 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/main/resources/hdfs-default.xml +++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/resources/hdfs-default.xml @@ -2877,6 +2877,17 @@ + + dfs.namenode.state.context.enabled + false + + Whether enable namenode sending back its current txnid back to client. + Setting this to true is required by Consistent Read from Standby feature. + But for regular cases, this should be set to false to avoid the overhead + of updating and maintaining this state. + + + dfs.namenode.lease-recheck-interval-ms 2000 diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/site/markdown/ObserverNameNode.md b/hadoop-hdfs-project/hadoop-hdfs/src/site/markdown/ObserverNameNode.md index 07c384c1bcf..af1569c6d01 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/site/markdown/ObserverNameNode.md +++ b/hadoop-hdfs-project/hadoop-hdfs/src/site/markdown/ObserverNameNode.md @@ -120,6 +120,20 @@ Deployment To enable consistent reads from Observer NameNode, you'll need to add a few configurations to your **hdfs-site.xml**: +* **dfs.namenode.state.context.enabled** - to enable NameNode to maintain + and update server state and id. + + This will lead to NameNode creating alignment context instance, which + keeps track of current server state id. Server state id will be carried + back to client. It is disabled by default to optimize performance of + Observer read cases. But this is **required to be turned on** + for the Observer NameNode feature. + + + dfs.namenode.state.context.enabled + true + + * **dfs.ha.tail-edits.in-progress** - to enable fast tailing on in-progress edit logs. diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/TestStateAlignmentContextWithHA.java b/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/TestStateAlignmentContextWithHA.java index 3de22e12206..82adb9ad07e 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/TestStateAlignmentContextWithHA.java +++ b/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/TestStateAlignmentContextWithHA.java @@ -97,6 +97,7 @@ public static void startUpCluster() throws IOException { CONF.setBoolean(String.format( "fs.%s.impl.disable.cache", HdfsConstants.HDFS_URI_SCHEME), true); CONF.setInt(DFSConfigKeys.DFS_REPLICATION_KEY, NUMDATANODES); + CONF.setBoolean(DFSConfigKeys.DFS_NAMENODE_STATE_CONTEXT_ENABLED_KEY, true); qjmhaCluster = HATestUtil.setUpObserverCluster(CONF, 1, NUMDATANODES, true); cluster = qjmhaCluster.getDfsCluster(); diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/ha/TestConsistentReadsObserver.java b/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/ha/TestConsistentReadsObserver.java index 5c0a40189f2..1485dda83d9 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/ha/TestConsistentReadsObserver.java +++ b/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/ha/TestConsistentReadsObserver.java @@ -17,6 +17,7 @@ */ package org.apache.hadoop.hdfs.server.namenode.ha; +import static org.apache.hadoop.hdfs.DFSConfigKeys.DFS_NAMENODE_STATE_CONTEXT_ENABLED_KEY; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; @@ -69,6 +70,7 @@ public class TestConsistentReadsObserver { @BeforeClass public static void startUpCluster() throws Exception { conf = new Configuration(); + conf.setBoolean(DFS_NAMENODE_STATE_CONTEXT_ENABLED_KEY, true); // disable fast tailing here because this test's assertions are based on the // timing of explicitly called rollEditLogAndTail. Although this means this // test takes some time to run diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/ha/TestMultiObserverNode.java b/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/ha/TestMultiObserverNode.java index a8e124568d9..a0913e4c5e4 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/ha/TestMultiObserverNode.java +++ b/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/ha/TestMultiObserverNode.java @@ -17,6 +17,7 @@ */ package org.apache.hadoop.hdfs.server.namenode.ha; +import static org.apache.hadoop.hdfs.DFSConfigKeys.DFS_NAMENODE_STATE_CONTEXT_ENABLED_KEY; import static org.junit.Assert.assertTrue; import java.io.IOException; @@ -46,6 +47,7 @@ public class TestMultiObserverNode { @BeforeClass public static void startUpCluster() throws Exception { conf = new Configuration(); + conf.setBoolean(DFS_NAMENODE_STATE_CONTEXT_ENABLED_KEY, true); qjmhaCluster = HATestUtil.setUpObserverCluster(conf, 2, 0, true); dfsCluster = qjmhaCluster.getDfsCluster(); dfs = HATestUtil.configureObserverReadFs( diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/ha/TestObserverNode.java b/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/ha/TestObserverNode.java index b5294fbf424..61bc9a70974 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/ha/TestObserverNode.java +++ b/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/ha/TestObserverNode.java @@ -17,6 +17,7 @@ */ package org.apache.hadoop.hdfs.server.namenode.ha; +import static org.apache.hadoop.hdfs.DFSConfigKeys.DFS_NAMENODE_STATE_CONTEXT_ENABLED_KEY; import static org.apache.hadoop.hdfs.server.namenode.NameNodeAdapter.getServiceState; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; @@ -80,6 +81,7 @@ public class TestObserverNode { @BeforeClass public static void startUpCluster() throws Exception { conf = new Configuration(); + conf.setBoolean(DFS_NAMENODE_STATE_CONTEXT_ENABLED_KEY, true); qjmhaCluster = HATestUtil.setUpObserverCluster(conf, 1, 0, true); dfsCluster = qjmhaCluster.getDfsCluster(); }