Repository: knox Updated Branches: refs/heads/master 11796c96b -> 691a21212
KNOX-1293 - Support for Ambari discovery of SPARK2 services Project: http://git-wip-us.apache.org/repos/asf/knox/repo Commit: http://git-wip-us.apache.org/repos/asf/knox/commit/691a2121 Tree: http://git-wip-us.apache.org/repos/asf/knox/tree/691a2121 Diff: http://git-wip-us.apache.org/repos/asf/knox/diff/691a2121 Branch: refs/heads/master Commit: 691a212129fbf50a091d2b5c05e070d88929eaf8 Parents: 11796c9 Author: Phil Zampino <pzamp...@apache.org> Authored: Tue May 1 22:57:22 2018 -0400 Committer: Phil Zampino <pzamp...@apache.org> Committed: Mon May 7 09:35:16 2018 -0400 ---------------------------------------------------------------------- .../discovery/ambari/LivyServiceURLCreator.java | 36 +++++ .../ambari/SparkCommonServiceURLCreator.java | 64 ++++++++ .../ambari/SparkHistoryUIServiceURLCreator.java | 36 +++++ ....topology.discovery.ambari.ServiceURLCreator | 4 +- ...iscovery-component-config-mapping.properties | 2 + .../ambari-service-discovery-url-mappings.xml | 28 ---- .../ambari/SparkServiceURLCreatorTest.java | 160 +++++++++++++++++++ 7 files changed, 301 insertions(+), 29 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/knox/blob/691a2121/gateway-discovery-ambari/src/main/java/org/apache/knox/gateway/topology/discovery/ambari/LivyServiceURLCreator.java ---------------------------------------------------------------------- diff --git a/gateway-discovery-ambari/src/main/java/org/apache/knox/gateway/topology/discovery/ambari/LivyServiceURLCreator.java b/gateway-discovery-ambari/src/main/java/org/apache/knox/gateway/topology/discovery/ambari/LivyServiceURLCreator.java new file mode 100644 index 0000000..6c12b18 --- /dev/null +++ b/gateway-discovery-ambari/src/main/java/org/apache/knox/gateway/topology/discovery/ambari/LivyServiceURLCreator.java @@ -0,0 +1,36 @@ +/** + * 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 + * <p> + * http://www.apache.org/licenses/LICENSE-2.0 + * <p> + * 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.knox.gateway.topology.discovery.ambari; + +public class LivyServiceURLCreator extends SparkCommonServiceURLCreator { + + private static final String RESOURCE_ROLE = "LIVYSERVER"; + + @Override + public void init(AmbariCluster cluster) { + super.init(cluster); + primaryComponentName = "LIVY_SERVER"; + secondaryComponentName = "LIVY2_SERVER"; + portConfigProperty = "livy.server.port"; + } + + @Override + public String getTargetService() { + return RESOURCE_ROLE; + } + +} http://git-wip-us.apache.org/repos/asf/knox/blob/691a2121/gateway-discovery-ambari/src/main/java/org/apache/knox/gateway/topology/discovery/ambari/SparkCommonServiceURLCreator.java ---------------------------------------------------------------------- diff --git a/gateway-discovery-ambari/src/main/java/org/apache/knox/gateway/topology/discovery/ambari/SparkCommonServiceURLCreator.java b/gateway-discovery-ambari/src/main/java/org/apache/knox/gateway/topology/discovery/ambari/SparkCommonServiceURLCreator.java new file mode 100644 index 0000000..ae223d3 --- /dev/null +++ b/gateway-discovery-ambari/src/main/java/org/apache/knox/gateway/topology/discovery/ambari/SparkCommonServiceURLCreator.java @@ -0,0 +1,64 @@ +/** + * 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 + * <p> + * http://www.apache.org/licenses/LICENSE-2.0 + * <p> + * 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.knox.gateway.topology.discovery.ambari; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +public abstract class SparkCommonServiceURLCreator implements ServiceURLCreator { + + private static final String URL_TEMPLATE = "http://%s:%s"; + + protected AmbariCluster cluster = null; + + String primaryComponentName = null; + + String secondaryComponentName = null; + + String portConfigProperty = null; + + @Override + public void init(AmbariCluster cluster) { + this.cluster = cluster; + } + + @Override + public List<String> create(String service, Map<String, String> serviceParams) { + List<String> urls = new ArrayList<>(); + + if (getTargetService().equalsIgnoreCase(service)) { + AmbariComponent comp = cluster.getComponent(primaryComponentName); + if (comp == null) { + comp = cluster.getComponent(secondaryComponentName); + } + + if (comp != null) { + String port = comp.getConfigProperty(portConfigProperty); + List<String> hostNames = comp.getHostNames(); + for (String host : hostNames) { + urls.add(String.format(URL_TEMPLATE, host, port)); + } + } + } + + return urls; + } + + + +} http://git-wip-us.apache.org/repos/asf/knox/blob/691a2121/gateway-discovery-ambari/src/main/java/org/apache/knox/gateway/topology/discovery/ambari/SparkHistoryUIServiceURLCreator.java ---------------------------------------------------------------------- diff --git a/gateway-discovery-ambari/src/main/java/org/apache/knox/gateway/topology/discovery/ambari/SparkHistoryUIServiceURLCreator.java b/gateway-discovery-ambari/src/main/java/org/apache/knox/gateway/topology/discovery/ambari/SparkHistoryUIServiceURLCreator.java new file mode 100644 index 0000000..a0de1d5 --- /dev/null +++ b/gateway-discovery-ambari/src/main/java/org/apache/knox/gateway/topology/discovery/ambari/SparkHistoryUIServiceURLCreator.java @@ -0,0 +1,36 @@ +/** + * 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 + * <p> + * http://www.apache.org/licenses/LICENSE-2.0 + * <p> + * 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.knox.gateway.topology.discovery.ambari; + +public class SparkHistoryUIServiceURLCreator extends SparkCommonServiceURLCreator { + + private static final String RESOURCE_ROLE = "SPARKHISTORYUI"; + + @Override + public void init(AmbariCluster cluster) { + super.init(cluster); + primaryComponentName = "SPARK_JOBHISTORYSERVER"; + secondaryComponentName = "SPARK2_JOBHISTORYSERVER"; + portConfigProperty = "spark.history.ui.port"; + } + + @Override + public String getTargetService() { + return RESOURCE_ROLE; + } + +} http://git-wip-us.apache.org/repos/asf/knox/blob/691a2121/gateway-discovery-ambari/src/main/resources/META-INF/services/org.apache.knox.gateway.topology.discovery.ambari.ServiceURLCreator ---------------------------------------------------------------------- diff --git a/gateway-discovery-ambari/src/main/resources/META-INF/services/org.apache.knox.gateway.topology.discovery.ambari.ServiceURLCreator b/gateway-discovery-ambari/src/main/resources/META-INF/services/org.apache.knox.gateway.topology.discovery.ambari.ServiceURLCreator index a6e2a7e..89edbfc 100644 --- a/gateway-discovery-ambari/src/main/resources/META-INF/services/org.apache.knox.gateway.topology.discovery.ambari.ServiceURLCreator +++ b/gateway-discovery-ambari/src/main/resources/META-INF/services/org.apache.knox.gateway.topology.discovery.ambari.ServiceURLCreator @@ -21,4 +21,6 @@ org.apache.knox.gateway.topology.discovery.ambari.WebHdfsUrlCreator org.apache.knox.gateway.topology.discovery.ambari.HdfsUIUrlCreator org.apache.knox.gateway.topology.discovery.ambari.ResourceManagerURLCreator org.apache.knox.gateway.topology.discovery.ambari.YarnUIURLCreator -org.apache.knox.gateway.topology.discovery.ambari.YarnUIV2URLCreator \ No newline at end of file +org.apache.knox.gateway.topology.discovery.ambari.YarnUIV2URLCreator +org.apache.knox.gateway.topology.discovery.ambari.SparkHistoryUIServiceURLCreator +org.apache.knox.gateway.topology.discovery.ambari.LivyServiceURLCreator \ No newline at end of file http://git-wip-us.apache.org/repos/asf/knox/blob/691a2121/gateway-discovery-ambari/src/main/resources/ambari-service-discovery-component-config-mapping.properties ---------------------------------------------------------------------- diff --git a/gateway-discovery-ambari/src/main/resources/ambari-service-discovery-component-config-mapping.properties b/gateway-discovery-ambari/src/main/resources/ambari-service-discovery-component-config-mapping.properties index bf53db0..884e143 100644 --- a/gateway-discovery-ambari/src/main/resources/ambari-service-discovery-component-config-mapping.properties +++ b/gateway-discovery-ambari/src/main/resources/ambari-service-discovery-component-config-mapping.properties @@ -32,11 +32,13 @@ HISTORYSERVER=mapred-site HIVE_SERVER=hive-site INFRA_SOLR=infra-solr-env LIVY_SERVER=livy-conf +LIVY2_SERVER=livy2-conf NAMENODE=hdfs-site OOZIE_SERVER=oozie-site RANGER_ADMIN=ranger-admin-site RESOURCEMANAGER=yarn-site SPARK_JOBHISTORYSERVER=spark-defaults +SPARK2_JOBHISTORYSERVER=spark2-defaults STORM_UI_SERVER=storm-site WEBHCAT_SERVER=webhcat-site ZEPPELIN_MASTER=zeppelin-config http://git-wip-us.apache.org/repos/asf/knox/blob/691a2121/gateway-discovery-ambari/src/main/resources/ambari-service-discovery-url-mappings.xml ---------------------------------------------------------------------- diff --git a/gateway-discovery-ambari/src/main/resources/ambari-service-discovery-url-mappings.xml b/gateway-discovery-ambari/src/main/resources/ambari-service-discovery-url-mappings.xml index a1f1c88..a3e1def 100644 --- a/gateway-discovery-ambari/src/main/resources/ambari-service-discovery-url-mappings.xml +++ b/gateway-discovery-ambari/src/main/resources/ambari-service-discovery-url-mappings.xml @@ -485,34 +485,6 @@ </properties> </service> - <service name="SPARKHISTORYUI"> - <url-pattern>http://{HOST}:{PORT}</url-pattern> - <properties> - <property name="HOST"> - <component>SPARK_JOBHISTORYSERVER</component> - <hostname/> - </property> - <property name="PORT"> - <component>SPARK_JOBHISTORYSERVER</component> - <config-property>spark.history.ui.port</config-property> - </property> - </properties> - </service> - - <service name="LIVYSERVER"> - <url-pattern>http://{HOST}:{PORT}</url-pattern> - <properties> - <property name="HOST"> - <component>LIVY_SERVER</component> - <hostname/> - </property> - <property name="PORT"> - <component>LIVY_SERVER</component> - <config-property>livy.server.port</config-property> - </property> - </properties> - </service> - <service name="SOLR"> <url-pattern>http://{HOST}:{PORT}</url-pattern> <properties> http://git-wip-us.apache.org/repos/asf/knox/blob/691a2121/gateway-discovery-ambari/src/test/java/org/apache/knox/gateway/topology/discovery/ambari/SparkServiceURLCreatorTest.java ---------------------------------------------------------------------- diff --git a/gateway-discovery-ambari/src/test/java/org/apache/knox/gateway/topology/discovery/ambari/SparkServiceURLCreatorTest.java b/gateway-discovery-ambari/src/test/java/org/apache/knox/gateway/topology/discovery/ambari/SparkServiceURLCreatorTest.java new file mode 100644 index 0000000..e12b653 --- /dev/null +++ b/gateway-discovery-ambari/src/test/java/org/apache/knox/gateway/topology/discovery/ambari/SparkServiceURLCreatorTest.java @@ -0,0 +1,160 @@ +/** + * 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 + * <p> + * http://www.apache.org/licenses/LICENSE-2.0 + * <p> + * 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.knox.gateway.topology.discovery.ambari; + +import org.easymock.EasyMock; +import org.junit.Test; + +import java.util.Arrays; +import java.util.List; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; + +public class SparkServiceURLCreatorTest { + + @Test + public void testSparkHistoryUI() { + doTestSparkHistoryUI("SPARK_JOBHISTORYSERVER"); + } + + @Test + public void testSpark2HistoryUI() { + doTestSparkHistoryUI("SPARK2_JOBHISTORYSERVER"); + } + + private void doTestSparkHistoryUI(String componentName) { + final String PORT = "4545"; + + AmbariComponent ac = EasyMock.createNiceMock(AmbariComponent.class); + List<String> hostNames = Arrays.asList("host1", "host2"); + EasyMock.expect(ac.getHostNames()).andReturn(hostNames).anyTimes(); + EasyMock.expect(ac.getConfigProperty("spark.history.ui.port")).andReturn(PORT).anyTimes(); + EasyMock.replay(ac); + + AmbariCluster cluster = EasyMock.createNiceMock(AmbariCluster.class); + EasyMock.expect(cluster.getComponent(componentName)).andReturn(ac).anyTimes(); + EasyMock.replay(cluster); + + SparkHistoryUIServiceURLCreator c = new SparkHistoryUIServiceURLCreator(); + c.init(cluster); + List<String> urls = c.create("SPARKHISTORYUI", null); + assertNotNull(urls); + assertFalse(urls.isEmpty()); + assertEquals(2, urls.size()); + assertEquals("http://host1:" + PORT, urls.get(0)); + assertEquals("http://host2:" + PORT, urls.get(1)); + } + + + @Test + public void testSparkAndSpark2HistoryUI() { + final String PORT = "4545"; + final String PORT2 = "6767"; + + AmbariComponent ac = EasyMock.createNiceMock(AmbariComponent.class); + EasyMock.expect(ac.getHostNames()).andReturn(Arrays.asList("host1", "host2")).anyTimes(); + EasyMock.expect(ac.getConfigProperty("spark.history.ui.port")).andReturn(PORT).anyTimes(); + EasyMock.replay(ac); + + AmbariComponent ac2 = EasyMock.createNiceMock(AmbariComponent.class); + EasyMock.expect(ac2.getHostNames()).andReturn(Arrays.asList("host3", "host4")).anyTimes(); + EasyMock.expect(ac2.getConfigProperty("spark.history.ui.port")).andReturn(PORT2).anyTimes(); + EasyMock.replay(ac2); + + AmbariCluster cluster = EasyMock.createNiceMock(AmbariCluster.class); + EasyMock.expect(cluster.getComponent("SPARK_JOBHISTORYSERVER")).andReturn(ac).anyTimes(); + EasyMock.expect(cluster.getComponent("SPARK2_JOBHISTORYSERVER")).andReturn(ac2).anyTimes(); + EasyMock.replay(cluster); + + SparkHistoryUIServiceURLCreator c = new SparkHistoryUIServiceURLCreator(); + c.init(cluster); + List<String> urls = c.create("SPARKHISTORYUI", null); + assertNotNull(urls); + assertFalse(urls.isEmpty()); + assertEquals(2, urls.size()); + assertEquals("http://host1:" + PORT, urls.get(0)); + assertEquals("http://host2:" + PORT, urls.get(1)); + } + + + @Test + public void testLivyServer() { + doTestLivyServer("LIVY_SERVER"); + } + + @Test + public void testLivy2Server() { + doTestLivyServer("LIVY2_SERVER"); + } + + private void doTestLivyServer(String componentName) { + final String PORT = "4545"; + + AmbariComponent ac = EasyMock.createNiceMock(AmbariComponent.class); + List<String> hostNames = Arrays.asList("host1", "host2"); + EasyMock.expect(ac.getHostNames()).andReturn(hostNames).anyTimes(); + EasyMock.expect(ac.getConfigProperty("livy.server.port")).andReturn(PORT).anyTimes(); + EasyMock.replay(ac); + + AmbariCluster cluster = EasyMock.createNiceMock(AmbariCluster.class); + EasyMock.expect(cluster.getComponent(componentName)).andReturn(ac).anyTimes(); + EasyMock.replay(cluster); + + LivyServiceURLCreator c = new LivyServiceURLCreator(); + c.init(cluster); + List<String> urls = c.create("LIVYSERVER", null); + assertNotNull(urls); + assertFalse(urls.isEmpty()); + assertEquals(2, urls.size()); + assertEquals("http://host1:" + PORT, urls.get(0)); + assertEquals("http://host2:" + PORT, urls.get(1)); + } + + @Test + public void testLivyAndLivy2Server() { + final String PORT = "4545"; + final String PORT2 = "2323"; + + AmbariComponent ac = EasyMock.createNiceMock(AmbariComponent.class); + EasyMock.expect(ac.getHostNames()).andReturn(Arrays.asList("host1", "host2")).anyTimes(); + EasyMock.expect(ac.getConfigProperty("livy.server.port")).andReturn(PORT).anyTimes(); + EasyMock.replay(ac); + + AmbariComponent ac2 = EasyMock.createNiceMock(AmbariComponent.class); + EasyMock.expect(ac2.getHostNames()).andReturn(Arrays.asList("host3", "host4")).anyTimes(); + EasyMock.expect(ac2.getConfigProperty("livy.server.port")).andReturn(PORT2).anyTimes(); + EasyMock.replay(ac2); + + AmbariCluster cluster = EasyMock.createNiceMock(AmbariCluster.class); + EasyMock.expect(cluster.getComponent("LIVY_SERVER")).andReturn(ac).anyTimes(); + EasyMock.expect(cluster.getComponent("LIVY2_SERVER")).andReturn(ac2).anyTimes(); + EasyMock.replay(cluster); + + LivyServiceURLCreator c = new LivyServiceURLCreator(); + c.init(cluster); + List<String> urls = c.create("LIVYSERVER", null); + assertNotNull(urls); + assertFalse(urls.isEmpty()); + assertEquals(2, urls.size()); + assertEquals("http://host1:" + PORT, urls.get(0)); + assertEquals("http://host2:" + PORT, urls.get(1)); + } + + +}