AMBARI-14669. Add yarn-site properties for Spark Shuffle Aux services (2.2->2.4 
upgrade path). (Dmytro Grinenko via mpapirkovskyy)


Project: http://git-wip-us.apache.org/repos/asf/ambari/repo
Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/e0957d39
Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/e0957d39
Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/e0957d39

Branch: refs/heads/branch-dev-patch-upgrade
Commit: e0957d397a2780683cc3387c30359c68669a9343
Parents: 672fb60
Author: Myroslav Papirkovskyy <mpapyrkovs...@hortonworks.com>
Authored: Fri Jan 15 16:24:56 2016 +0200
Committer: Myroslav Papirkovskyy <mpapyrkovs...@hortonworks.com>
Committed: Fri Jan 15 16:25:41 2016 +0200

----------------------------------------------------------------------
 .../HDP/2.2/upgrades/nonrolling-upgrade-2.4.xml |   4 +
 .../stacks/HDP/2.2/upgrades/upgrade-2.4.xml     |   1 +
 .../SparkShufflePropertyConfigTest.java         | 169 +++++++++++++++++++
 3 files changed, 174 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/e0957d39/ambari-server/src/main/resources/stacks/HDP/2.2/upgrades/nonrolling-upgrade-2.4.xml
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/resources/stacks/HDP/2.2/upgrades/nonrolling-upgrade-2.4.xml
 
b/ambari-server/src/main/resources/stacks/HDP/2.2/upgrades/nonrolling-upgrade-2.4.xml
index 1efeb6c..00b9e96 100644
--- 
a/ambari-server/src/main/resources/stacks/HDP/2.2/upgrades/nonrolling-upgrade-2.4.xml
+++ 
b/ambari-server/src/main/resources/stacks/HDP/2.2/upgrades/nonrolling-upgrade-2.4.xml
@@ -395,6 +395,10 @@
         <task xsi:type="configure" 
id="hdp_2_3_0_0_yarn_rm_check_cs_root_max_capacity"/>
       </execute-stage>
 
+      <execute-stage service="YARN" component="RESOURCEMANAGER" 
title="Calculating Yarn Properties for Spark">
+        <task xsi:type="server_action" summary="Calculating Yarn Properties 
for Spark" 
class="org.apache.ambari.server.serveraction.upgrades.SparkShufflePropertyConfig"
 />
+      </execute-stage>
+
       <!--HBASE-->
       <execute-stage service="HBASE" component="HBASE_MASTER" title="Apply 
config changes for HBase Master">
         <task xsi:type="configure" 
id="hdp_2_3_0_0_hbase_master_adjust_phoenix_scheduler_factory"/>

http://git-wip-us.apache.org/repos/asf/ambari/blob/e0957d39/ambari-server/src/main/resources/stacks/HDP/2.2/upgrades/upgrade-2.4.xml
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/resources/stacks/HDP/2.2/upgrades/upgrade-2.4.xml 
b/ambari-server/src/main/resources/stacks/HDP/2.2/upgrades/upgrade-2.4.xml
index acebdd8..7637830 100644
--- a/ambari-server/src/main/resources/stacks/HDP/2.2/upgrades/upgrade-2.4.xml
+++ b/ambari-server/src/main/resources/stacks/HDP/2.2/upgrades/upgrade-2.4.xml
@@ -566,6 +566,7 @@
 
           <task xsi:type="configure" 
id="hdp_2_3_0_0_yarn_rm_check_cs_root_max_capacity"/>
 
+          <task xsi:type="server_action" summary="Calculating Yarn Properties 
for Spark" 
class="org.apache.ambari.server.serveraction.upgrades.SparkShufflePropertyConfig"
 />
         </pre-upgrade>
         <upgrade>
           <task xsi:type="restart-task"/>

http://git-wip-us.apache.org/repos/asf/ambari/blob/e0957d39/ambari-server/src/test/java/org/apache/ambari/server/serveraction/upgrades/SparkShufflePropertyConfigTest.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/test/java/org/apache/ambari/server/serveraction/upgrades/SparkShufflePropertyConfigTest.java
 
b/ambari-server/src/test/java/org/apache/ambari/server/serveraction/upgrades/SparkShufflePropertyConfigTest.java
new file mode 100644
index 0000000..edba6f0
--- /dev/null
+++ 
b/ambari-server/src/test/java/org/apache/ambari/server/serveraction/upgrades/SparkShufflePropertyConfigTest.java
@@ -0,0 +1,169 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ambari.server.serveraction.upgrades;
+
+import static org.easymock.EasyMock.anyObject;
+import static org.easymock.EasyMock.expect;
+import static org.easymock.EasyMock.replay;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+
+import java.lang.reflect.Field;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.ambari.server.ServiceNotFoundException;
+import org.apache.ambari.server.actionmanager.ExecutionCommandWrapper;
+import org.apache.ambari.server.actionmanager.HostRoleCommand;
+import org.apache.ambari.server.agent.CommandReport;
+import org.apache.ambari.server.agent.ExecutionCommand;
+import org.apache.ambari.server.state.Cluster;
+import org.apache.ambari.server.state.Clusters;
+import org.apache.ambari.server.state.Config;
+import org.apache.ambari.server.state.ConfigImpl;
+import org.apache.ambari.server.state.Service;
+import org.easymock.EasyMock;
+import org.junit.Before;
+import org.junit.Test;
+
+import com.google.inject.Injector;
+
+/**
+ * Tests upgrade-related server side actions for SparkShufflePropertyConfig
+ */
+public class SparkShufflePropertyConfigTest {
+  private Injector m_injector;
+  private Clusters m_clusters;
+  private Cluster cluster;
+  private Field clusterField;
+
+  @Before
+  public void setup() throws Exception {
+    m_injector = EasyMock.createMock(Injector.class);
+    m_clusters = EasyMock.createMock(Clusters.class);
+    cluster = EasyMock.createMock(Cluster.class);
+
+
+    Config adminConfig = new ConfigImpl("yarn-site") {
+      Map<String, String> mockProperties = new HashMap<String, String>() {{
+        put("yarn.nodemanager.aux-services", "some_service");
+      }};
+      @Override
+      public Map<String, String> getProperties() {
+        return mockProperties;
+      }
+
+      @Override
+      public void setProperties(Map<String, String> properties) {
+        mockProperties.putAll(properties);
+      }
+
+      @Override
+      public void persist(boolean newConfig) {
+        // no-op
+      }
+    };
+
+    
expect(cluster.getDesiredConfigByType("yarn-site")).andReturn(adminConfig).atLeastOnce();
+
+    expect(m_clusters.getCluster((String) 
anyObject())).andReturn(cluster).anyTimes();
+    
expect(m_injector.getInstance(Clusters.class)).andReturn(m_clusters).atLeastOnce();
+
+    replay(m_injector, m_clusters);
+
+    clusterField = 
SparkShufflePropertyConfig.class.getDeclaredField("clusters");
+    clusterField.setAccessible(true);
+  }
+
+  @Test
+  public void testSparkPresent() throws Exception {
+    ExecutionCommand executionCommand = new ExecutionCommand();
+    Map<String, String> commandParams = new HashMap<>();
+    HostRoleCommand hrc = EasyMock.createMock(HostRoleCommand.class);
+    Service sparkService = EasyMock.createMock(Service.class);
+    SparkShufflePropertyConfig action = new SparkShufflePropertyConfig();
+
+    commandParams.put("clusterName", "c1");
+    executionCommand.setCommandParams(commandParams);
+    executionCommand.setClusterName("c1");
+
+    // test calculations when spark service present
+    expect(cluster.getService("SPARK")).andReturn(sparkService).atLeastOnce();
+
+    expect(hrc.getRequestId()).andReturn(1L).anyTimes();
+    expect(hrc.getStageId()).andReturn(2L).anyTimes();
+    expect(hrc.getExecutionCommandWrapper()).andReturn(new 
ExecutionCommandWrapper(executionCommand)).anyTimes();
+    replay(cluster, hrc);
+
+    clusterField.set(action, m_clusters);
+    action.setExecutionCommand(executionCommand);
+    action.setHostRoleCommand(hrc);
+
+    CommandReport report = action.execute(null);
+    assertNotNull(report);
+
+    Cluster c = m_clusters.getCluster("c1");
+    Config config = c.getDesiredConfigByType("yarn-site");
+    Map<String, String> map = config.getProperties();
+
+    assertTrue(map.containsKey("yarn.nodemanager.aux-services"));
+    
assertTrue(map.containsKey("yarn.nodemanager.aux-services.spark_shuffle.class"));
+
+    assertEquals("some_service,spark_shuffle", 
map.get("yarn.nodemanager.aux-services"));
+    assertEquals("org.apache.spark.network.yarn.YarnShuffleService", 
map.get("yarn.nodemanager.aux-services.spark_shuffle.class"));
+  }
+
+  @Test
+  public void testSparkNotPresent() throws Exception{
+    SparkShufflePropertyConfig action = new SparkShufflePropertyConfig();
+    Map<String, String> commandParams = new HashMap<>();
+    ExecutionCommand executionCommand = new ExecutionCommand();
+    HostRoleCommand hrc = EasyMock.createMock(HostRoleCommand.class);
+    ServiceNotFoundException notFoundException = new 
ServiceNotFoundException("c1", "SPARK");
+
+    commandParams.put("clusterName", "c1");
+    executionCommand.setCommandParams(commandParams);
+    executionCommand.setClusterName("c1");
+
+    //no spark service present
+    
expect(cluster.getService("SPARK")).andThrow(notFoundException).atLeastOnce();
+
+    expect(hrc.getRequestId()).andReturn(1L).anyTimes();
+    expect(hrc.getStageId()).andReturn(2L).anyTimes();
+    expect(hrc.getExecutionCommandWrapper()).andReturn(new 
ExecutionCommandWrapper(executionCommand)).anyTimes();
+    replay(cluster, hrc);
+
+    clusterField.set(action, m_clusters);
+    action.setExecutionCommand(executionCommand);
+    action.setHostRoleCommand(hrc);
+
+    CommandReport report = action.execute(null);
+    assertNotNull(report);
+
+    Cluster c = m_clusters.getCluster("c1");
+    Config config = c.getDesiredConfigByType("yarn-site");
+    Map<String, String> map = config.getProperties();
+
+    assertTrue(map.containsKey("yarn.nodemanager.aux-services"));
+    
assertFalse(map.containsKey("yarn.nodemanager.aux-services.spark_shuffle.class"));
+    assertEquals("some_service", map.get("yarn.nodemanager.aux-services"));
+  }
+}

Reply via email to