You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@oozie.apache.org by pb...@apache.org on 2017/03/22 11:23:46 UTC

[41/50] [abbrv] oozie git commit: OOZIE-2811 Add support for filtering out properties from SparkConfigurationService (gezapeti via rkanter)

OOZIE-2811 Add support for filtering out properties from SparkConfigurationService (gezapeti via rkanter)


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

Branch: refs/heads/oya
Commit: 98ad14bdc021132bd4b0ad54e8edc9f71e0e2636
Parents: e8bd9fc
Author: Robert Kanter <rk...@apache.org>
Authored: Tue Mar 7 15:18:14 2017 -0800
Committer: Robert Kanter <rk...@apache.org>
Committed: Tue Mar 7 15:18:14 2017 -0800

----------------------------------------------------------------------
 .../action/hadoop/SparkActionExecutor.java      |  10 +-
 .../service/SparkConfigurationService.java      | 144 +++++++++++--------
 core/src/main/resources/oozie-default.xml       |  18 ++-
 .../service/TestSparkConfigurationService.java  | 130 +++++++++--------
 release-log.txt                                 |   1 +
 5 files changed, 176 insertions(+), 127 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/oozie/blob/98ad14bd/core/src/main/java/org/apache/oozie/action/hadoop/SparkActionExecutor.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/oozie/action/hadoop/SparkActionExecutor.java b/core/src/main/java/org/apache/oozie/action/hadoop/SparkActionExecutor.java
index e2e023e..1a3197a 100644
--- a/core/src/main/java/org/apache/oozie/action/hadoop/SparkActionExecutor.java
+++ b/core/src/main/java/org/apache/oozie/action/hadoop/SparkActionExecutor.java
@@ -32,7 +32,7 @@ import org.jdom.Namespace;
 
 import java.util.ArrayList;
 import java.util.List;
-import java.util.Map;
+import java.util.Properties;
 
 public class SparkActionExecutor extends JavaActionExecutor {
     public static final String SPARK_MAIN_CLASS_NAME = "org.apache.oozie.action.hadoop.SparkMain";
@@ -79,9 +79,11 @@ public class SparkActionExecutor extends JavaActionExecutor {
         StringBuilder sparkOptsSb = new StringBuilder();
         if (master.startsWith("yarn")) {
             String resourceManager = actionConf.get(HADOOP_JOB_TRACKER);
-            Map<String, String> sparkConfig = Services.get().get(SparkConfigurationService.class).getSparkConfig(resourceManager);
-            for (Map.Entry<String, String> entry : sparkConfig.entrySet()) {
-                sparkOptsSb.append("--conf ").append(entry.getKey()).append("=").append(entry.getValue()).append(" ");
+            Properties sparkConfig =
+                    Services.get().get(SparkConfigurationService.class).getSparkConfig(resourceManager);
+            for (String property : sparkConfig.stringPropertyNames()) {
+                sparkOptsSb.append("--conf ")
+                        .append(property).append("=").append(sparkConfig.getProperty(property)).append(" ");
             }
         }
         String sparkOpts = actionXml.getChildTextTrim("spark-opts", ns);

http://git-wip-us.apache.org/repos/asf/oozie/blob/98ad14bd/core/src/main/java/org/apache/oozie/service/SparkConfigurationService.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/oozie/service/SparkConfigurationService.java b/core/src/main/java/org/apache/oozie/service/SparkConfigurationService.java
index b29ab8d..b15cce0 100644
--- a/core/src/main/java/org/apache/oozie/service/SparkConfigurationService.java
+++ b/core/src/main/java/org/apache/oozie/service/SparkConfigurationService.java
@@ -18,19 +18,19 @@
 
 package org.apache.oozie.service;
 
-import org.apache.hadoop.conf.Configuration;
-import org.apache.oozie.ErrorCode;
-import org.apache.oozie.util.IOUtils;
-import org.apache.oozie.util.XConfiguration;
 import org.apache.oozie.util.XLog;
 
 import java.io.File;
+import java.io.FileInputStream;
 import java.io.FileReader;
 import java.io.IOException;
-import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.nio.charset.StandardCharsets;
 import java.util.HashMap;
+import java.util.HashSet;
 import java.util.Map;
 import java.util.Properties;
+import java.util.Set;
 
 public class SparkConfigurationService implements Service {
 
@@ -39,20 +39,25 @@ public class SparkConfigurationService implements Service {
     public static final String CONF_PREFIX = Service.CONF_PREFIX + "SparkConfigurationService.";
     public static final String SPARK_CONFIGURATIONS = CONF_PREFIX + "spark.configurations";
     public static final String SPARK_CONFIGURATIONS_IGNORE_SPARK_YARN_JAR
-            = CONF_PREFIX + "spark.configurations.ignore.spark.yarn.jar";
+            = SPARK_CONFIGURATIONS + ".ignore.spark.yarn.jar";
+    public static final String SPARK_CONFIGURATIONS_BLACKLIST = SPARK_CONFIGURATIONS + ".blacklist";
 
-    private Map<String, Map<String, String>> sparkConfigs;
     private static final String SPARK_CONFIG_FILE = "spark-defaults.conf";
     private static final String SPARK_YARN_JAR_PROP = "spark.yarn.jar";
+    private static final String HOST_WILDCARD = "*";
+    private Map<String, Properties> sparkConfigs;
+    private Set<String> blacklist;
 
     @Override
     public void init(Services services) throws ServiceException {
+        loadBlacklist();
         loadSparkConfigs();
     }
 
     @Override
     public void destroy() {
         sparkConfigs.clear();
+        blacklist.clear();
     }
 
     @Override
@@ -60,76 +65,89 @@ public class SparkConfigurationService implements Service {
         return SparkConfigurationService.class;
     }
 
+    private void loadBlacklist() {
+        blacklist = new HashSet<>();
+        for(String s : ConfigurationService.getStrings(SPARK_CONFIGURATIONS_BLACKLIST)) {
+            blacklist.add(s.trim());
+        }
+        // spark.yarn.jar is added if the old property to ignore it is set.
+        if(ConfigurationService.getBoolean(SPARK_CONFIGURATIONS_IGNORE_SPARK_YARN_JAR)){
+            LOG.warn("Deprecated property found in configuration: " + SPARK_CONFIGURATIONS_IGNORE_SPARK_YARN_JAR +
+                    "Use "+SPARK_CONFIGURATIONS_BLACKLIST+" instead.");
+            blacklist.add(SPARK_YARN_JAR_PROP);
+        }
+    }
+
     private void loadSparkConfigs() throws ServiceException {
-        sparkConfigs = new HashMap<String, Map<String, String>>();
-        File configDir = new File(ConfigurationService.getConfigurationDirectory());
+        sparkConfigs = new HashMap<>();
         String[] confDefs = ConfigurationService.getStrings(SPARK_CONFIGURATIONS);
-        if (confDefs != null) {
-            boolean ignoreSparkYarnJar = ConfigurationService.getBoolean(SPARK_CONFIGURATIONS_IGNORE_SPARK_YARN_JAR);
-            for (String confDef : confDefs) {
-                if (confDef.trim().length() > 0) {
-                    String[] parts = confDef.split("=");
-                    if (parts.length == 2) {
-                        String hostPort = parts[0];
-                        String confDir = parts[1];
-                        File dir = new File(confDir);
-                        if (!dir.isAbsolute()) {
-                            dir = new File(configDir, confDir);
-                        }
-                        if (dir.exists()) {
-                            File file = new File(dir, SPARK_CONFIG_FILE);
-                            if (file.exists()) {
-                                Properties props = new Properties();
-                                FileReader fr = null;
-                                try {
-                                    fr = new FileReader(file);
-                                    props.load(fr);
-                                    fr.close();
-                                    if (ignoreSparkYarnJar) {
-                                        // Ignore spark.yarn.jar because it may interfere with the Spark Sharelib jars
-                                        props.remove(SPARK_YARN_JAR_PROP);
-                                    }
-                                    sparkConfigs.put(hostPort, propsToMap(props));
-                                    LOG.info("Loaded Spark Configuration: {0}={1}", hostPort, file.getAbsolutePath());
-                                } catch (IOException ioe) {
-                                    LOG.warn("Spark Configuration could not be loaded for {0}: {1}",
-                                            hostPort, ioe.getMessage(), ioe);
-                                } finally {
-                                    IOUtils.closeSafely(fr);
-                                }
-                            } else {
-                                LOG.warn("Spark Configuration could not be loaded for {0}: {1} does not exist",
-                                        hostPort, file.getAbsolutePath());
-                            }
-                        } else {
-                            LOG.warn("Spark Configuration could not be loaded for {0}: {1} does not exist",
-                                    hostPort, dir.getAbsolutePath());
-                        }
-                    } else {
-                        LOG.warn("Spark Configuration could not be loaded: invalid value found: {0}", confDef);
-                    }
+        for (String confDef : confDefs) {
+            readEntry(confDef.trim());
+        }
+    }
+
+    private void readEntry(String confDef) throws ServiceException {
+        String[] parts = confDef.split("=");
+        if (parts.length == 2) {
+            String hostPort = parts[0];
+            String confDir = parts[1];
+            File dir = getAbsoluteDir(confDir);
+            if (dir.exists()) {
+                Properties sparkDefaults = readSparkConfigFile(hostPort, dir);
+                filterBlackList(sparkDefaults);
+                if(!sparkDefaults.isEmpty()) {
+                    sparkConfigs.put(hostPort, sparkDefaults);
                 }
+            } else {
+                LOG.warn("Spark Configuration could not be loaded for {0}: {1} does not exist",
+                        hostPort, dir.getAbsolutePath());
             }
         } else {
-            LOG.info("Spark Configuration(s) not specified");
+            LOG.warn("Spark Configuration could not be loaded: invalid value found: {0}", confDef);
         }
     }
 
-    private Map<String, String> propsToMap(Properties props) {
-        Map<String, String> map = new HashMap<String, String>(props.size());
-        for (String key : props.stringPropertyNames()) {
-            map.put(key, props.getProperty(key));
+    private File getAbsoluteDir(String confDir) throws ServiceException {
+        File dir = new File(confDir);
+        if (!dir.isAbsolute()) {
+            File configDir = new File(ConfigurationService.getConfigurationDirectory());
+            dir = new File(configDir, confDir);
+        }
+        return dir;
+    }
+
+    private void filterBlackList(Properties sparkDefaults) {
+        for(String property : blacklist){
+            sparkDefaults.remove(property);
+        }
+    }
+
+    private Properties readSparkConfigFile(String hostPort, File dir) {
+        File file = new File(dir, SPARK_CONFIG_FILE);
+        Properties props = new Properties();
+        if (file.exists()) {
+            try (FileInputStream stream = new FileInputStream(file);
+                 InputStreamReader reader = new InputStreamReader(stream, StandardCharsets.UTF_8.name())) {
+                props.load(reader);
+                LOG.info("Loaded Spark Configuration: {0}={1}", hostPort, file.getAbsolutePath());
+            } catch (IOException ioe) {
+                LOG.warn("Spark Configuration could not be loaded for {0}: {1}",
+                        hostPort, ioe.getMessage(), ioe);
+            }
+        } else {
+            LOG.warn("Spark Configuration could not be loaded for {0}: {1} does not exist",
+                    hostPort, file.getAbsolutePath());
         }
-        return map;
+        return props;
     }
 
-    public Map<String, String> getSparkConfig(String resourceManagerHostPort) {
+    public Properties getSparkConfig(String resourceManagerHostPort) {
         resourceManagerHostPort = (resourceManagerHostPort != null) ? resourceManagerHostPort.toLowerCase() : null;
-        Map<String, String> config = sparkConfigs.get(resourceManagerHostPort);
+        Properties config = sparkConfigs.get(resourceManagerHostPort);
         if (config == null) {
-            config = sparkConfigs.get("*");
+            config = sparkConfigs.get(HOST_WILDCARD);
             if (config == null) {
-                config = new HashMap<String, String>();
+                config = new Properties();
             }
         }
         return config;

http://git-wip-us.apache.org/repos/asf/oozie/blob/98ad14bd/core/src/main/resources/oozie-default.xml
----------------------------------------------------------------------
diff --git a/core/src/main/resources/oozie-default.xml b/core/src/main/resources/oozie-default.xml
index 95e0c36..b481887 100644
--- a/core/src/main/resources/oozie-default.xml
+++ b/core/src/main/resources/oozie-default.xml
@@ -2881,13 +2881,23 @@ will be the requeue interval for the actions which are waiting for a long time w
     </property>
 
     <property>
+        <name>oozie.service.SparkConfigurationService.spark.configurations.blacklist</name>
+        <value>spark.yarn.jar,spark.yarn.jars</value>
+        <description>
+             Comma separated list of properties to ignore from any Spark configurations specified in
+             oozie.service.SparkConfigurationService.spark.configurations property.
+        </description>
+    </property>
+
+    <property>
         <name>oozie.service.SparkConfigurationService.spark.configurations.ignore.spark.yarn.jar</name>
         <value>true</value>
         <description>
-            If true, Oozie will ignore the "spark.yarn.jar" property from any Spark configurations specified in
-            oozie.service.SparkConfigurationService.spark.configurations.  If false, Oozie will not ignore it.  It is recommended
-            to leave this as true because it can interfere with the jars in the Spark sharelib.
-        </description>
+             Deprecated. Use oozie.service.SparkConfigurationService.spark.configurations.blacklist instead.
+             If true, Oozie will ignore the "spark.yarn.jar" property from any Spark configurations specified in
+             oozie.service.SparkConfigurationService.spark.configurations.  If false, Oozie will not ignore it.  It is recommended
+             to leave this as true because it can interfere with the jars in the Spark sharelib.
+         </description>
     </property>
 
     <property>

http://git-wip-us.apache.org/repos/asf/oozie/blob/98ad14bd/core/src/test/java/org/apache/oozie/service/TestSparkConfigurationService.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/oozie/service/TestSparkConfigurationService.java b/core/src/test/java/org/apache/oozie/service/TestSparkConfigurationService.java
index 9d82fdc..0e00a45 100644
--- a/core/src/test/java/org/apache/oozie/service/TestSparkConfigurationService.java
+++ b/core/src/test/java/org/apache/oozie/service/TestSparkConfigurationService.java
@@ -6,9 +6,9 @@
  * 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
- *
+ * <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.
@@ -18,21 +18,11 @@
 
 package org.apache.oozie.service;
 
-import org.apache.hadoop.conf.Configuration;
-import org.apache.hadoop.fs.FileSystem;
-import org.apache.hadoop.io.Text;
-import org.apache.hadoop.mapred.JobClient;
-import org.apache.hadoop.mapred.JobConf;
-import org.apache.oozie.ErrorCode;
 import org.apache.oozie.test.XTestCase;
-import org.apache.oozie.util.IOUtils;
 
 import java.io.File;
 import java.io.FileOutputStream;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.net.URI;
-import java.util.Map;
+import java.io.IOException;
 import java.util.Properties;
 
 public class TestSparkConfigurationService extends XTestCase {
@@ -53,40 +43,14 @@ public class TestSparkConfigurationService extends XTestCase {
         scs.destroy();
         ConfigurationService.set("oozie.service.SparkConfigurationService.spark.configurations", "");
         scs.init(Services.get());
-        Map<String, String> sparkConfigs = scs.getSparkConfig("foo");
+        Properties sparkConfigs = scs.getSparkConfig("foo");
         assertEquals(0, sparkConfigs.size());
     }
 
     public void testSparkConfigs() throws Exception {
-        File sparkConf1Dir = new File(getTestCaseConfDir(), "spark-conf-1");
-        File sparkConf3Dir = new File(getTestCaseConfDir(), "spark-conf-3");
-        File sparkConf4Dir = new File(getTestCaseConfDir(), "spark-conf-4");
-        sparkConf1Dir.mkdirs();
-        sparkConf3Dir.mkdirs();
-        sparkConf4Dir.mkdirs();
-        File sparkConf1 = new File(sparkConf1Dir, "spark-defaults.conf");
-        Properties sparkConf1Props = new Properties();
-        sparkConf1Props.setProperty("a", "A");
-        sparkConf1Props.setProperty("b", "B");
-        sparkConf1Props.setProperty("spark.yarn.jar", "foo");   // should be ignored by default
-        FileOutputStream fos = null;
-        try {
-            fos = new FileOutputStream(sparkConf1);
-            sparkConf1Props.store(fos, "");
-        } finally {
-            IOUtils.closeSafely(fos);
-        }
-        File sparkConf4 = new File(sparkConf4Dir, "spark-defaults.conf");
-        Properties sparkConf4Props = new Properties();
-        sparkConf4Props.setProperty("y", "Y");
-        sparkConf4Props.setProperty("z", "Z");
-        fos = null;
-        try {
-            fos = new FileOutputStream(sparkConf4);
-            sparkConf4Props.store(fos, "");
-        } finally {
-            IOUtils.closeSafely(fos);
-        }
+        File sparkConf1Dir = createSparkConfsInDir("spark-conf-1", "a", "A", "b", "B", "spark.yarn.jar", "foo");
+        File sparkConf3Dir = createSparkConfsInDir("spark-conf-3");
+        File sparkConf4Dir = createSparkConfsInDir("spark-conf-4", "y", "Y", "z", "Z", "spark.yarn.jars", "foo2");
 
         SparkConfigurationService scs = Services.get().get(SparkConfigurationService.class);
         scs.destroy();
@@ -96,48 +60,102 @@ public class TestSparkConfigurationService extends XTestCase {
                 ",rm3=" + sparkConf3Dir.getAbsolutePath() +  // missing file
                 ",rm4=" + sparkConf4Dir.getName());          // relative path
         scs.init(Services.get());
-        Map<String, String> sparkConfigs = scs.getSparkConfig("foo");
-        assertEquals(0, sparkConfigs.size());
+        Properties sparkConfigs = scs.getSparkConfig("foo");
+        assertEquals(sparkConfigs.toString(), 0, sparkConfigs.size());
         sparkConfigs = scs.getSparkConfig("rm1");
-        assertEquals(2, sparkConfigs.size());
+        assertEquals(sparkConfigs.toString(), 2, sparkConfigs.size());
         assertEquals("A", sparkConfigs.get("a"));
         assertEquals("B", sparkConfigs.get("b"));
         sparkConfigs = scs.getSparkConfig("rm2");
-        assertEquals(0, sparkConfigs.size());
+        assertEquals(sparkConfigs.toString(), 0, sparkConfigs.size());
         sparkConfigs = scs.getSparkConfig("rm3");
-        assertEquals(0, sparkConfigs.size());
+        assertEquals(sparkConfigs.toString(), 0, sparkConfigs.size());
         sparkConfigs = scs.getSparkConfig("rm4");
-        assertEquals(2, sparkConfigs.size());
+        assertEquals(sparkConfigs.toString(), 2, sparkConfigs.size());
         assertEquals("Y", sparkConfigs.get("y"));
         assertEquals("Z", sparkConfigs.get("z"));
         scs.destroy();
         // Setting this to false should make it not ignore spark.yarn.jar
         ConfigurationService.setBoolean("oozie.service.SparkConfigurationService.spark.configurations.ignore.spark.yarn.jar",
                 false);
+        ConfigurationService.set("oozie.service.SparkConfigurationService.spark.configurations.blacklist", " ");
         scs.init(Services.get());
         sparkConfigs = scs.getSparkConfig("rm1");
-        assertEquals(3, sparkConfigs.size());
+        assertEquals(sparkConfigs.toString(), 3, sparkConfigs.size());
         assertEquals("A", sparkConfigs.get("a"));
         assertEquals("B", sparkConfigs.get("b"));
         assertEquals("foo", sparkConfigs.get("spark.yarn.jar"));
         ConfigurationService.setBoolean("oozie.service.SparkConfigurationService.spark.configurations.ignore.spark.yarn.jar", true);
-
+        ConfigurationService.set("oozie.service.SparkConfigurationService.spark.configurations.blacklist", "spark.yarn.jar,spark.yarn.jars");
         scs.destroy();
         ConfigurationService.set("oozie.service.SparkConfigurationService.spark.configurations",
-                "rm1=" + sparkConf1Dir.getAbsolutePath() +   // defined
+                "rm1=" + sparkConf1Dir.getAbsolutePath() +   // define
                 ",*=" + sparkConf4Dir.getAbsolutePath());    // wildcard
         scs.init(Services.get());
         sparkConfigs = scs.getSparkConfig("rm1");
-        assertEquals(2, sparkConfigs.size());
+        assertEquals(sparkConfigs.toString(), 2, sparkConfigs.size());
         assertEquals("A", sparkConfigs.get("a"));
         assertEquals("B", sparkConfigs.get("b"));
         sparkConfigs = scs.getSparkConfig("rm2");
-        assertEquals(2, sparkConfigs.size());
+        assertEquals(sparkConfigs.toString(), 2, sparkConfigs.size());
         assertEquals("Y", sparkConfigs.get("y"));
         assertEquals("Z", sparkConfigs.get("z"));
         sparkConfigs = scs.getSparkConfig("foo");
-        assertEquals(2, sparkConfigs.size());
+        assertEquals(sparkConfigs.toString(), 2, sparkConfigs.size());
         assertEquals("Y", sparkConfigs.get("y"));
         assertEquals("Z", sparkConfigs.get("z"));
     }
+
+    private File createSparkConfsInDir(String directory, String... props) throws IOException {
+        File sparkConf1Dir = new File(getTestCaseConfDir(), directory);
+        sparkConf1Dir.mkdirs();
+        File sparkConf1 = new File(sparkConf1Dir, "spark-defaults.conf");
+        Properties sparkConf1Props = new Properties();
+        for (int i = 0; i < props.length; i += 2) {
+            sparkConf1Props.setProperty(props[i], props[i + 1]);
+        }
+        if (!sparkConf1Props.isEmpty()) {
+            try (FileOutputStream fos = new FileOutputStream(sparkConf1)) {
+                sparkConf1Props.store(fos, "");
+            }
+        }
+        return sparkConf1Dir;
+    }
+
+    public void testBlackList() throws Exception {
+        File sparkConf1Dir = createSparkConfsInDir("spark-conf-1", "a", "A", "b", "B",
+                "spark.yarn.jar", "foo");
+        File sparkConf3Dir = createSparkConfsInDir("spark-conf-3");
+        File sparkConf4Dir = createSparkConfsInDir("spark-conf-4", "y", "Y", "z", "Z",
+                "spark.yarn.jars", "foo2");
+
+        SparkConfigurationService scs = Services.get().get(SparkConfigurationService.class);
+        scs.destroy();
+        ConfigurationService.set("oozie.service.SparkConfigurationService.spark.configurations",
+                "rm1=" + sparkConf1Dir.getAbsolutePath() +   // absolute path
+                ",rm2" +                                     // invalid entry
+                ",rm3=" + sparkConf3Dir.getAbsolutePath() +  // missing file
+                ",rm4=" + sparkConf4Dir.getName());          // relative path
+        ConfigurationService.setBoolean("oozie.service.SparkConfigurationService.spark.configurations.ignore.spark.yarn.jar",
+                false);
+        ConfigurationService.set("oozie.service.SparkConfigurationService.spark.configurations.blacklist", "a,z");
+        scs.init(Services.get());
+        Properties sparkConfigs = scs.getSparkConfig("foo");
+        assertEquals(sparkConfigs.toString(), 0, sparkConfigs.size());
+        sparkConfigs = scs.getSparkConfig("rm1");
+        assertEquals(sparkConfigs.toString(), 2, sparkConfigs.size());
+        assertEquals("B", sparkConfigs.get("b"));
+        assertEquals("foo", sparkConfigs.get("spark.yarn.jar"));
+        sparkConfigs = scs.getSparkConfig("rm2");
+        assertEquals(sparkConfigs.toString(), 0, sparkConfigs.size());
+        sparkConfigs = scs.getSparkConfig("rm3");
+        assertEquals(sparkConfigs.toString(), 0, sparkConfigs.size());
+        sparkConfigs = scs.getSparkConfig("rm4");
+        assertEquals(sparkConfigs.toString(), 2, sparkConfigs.size());
+        assertEquals("Y", sparkConfigs.get("y"));
+        assertEquals("foo2", sparkConfigs.get("spark.yarn.jars"));
+        scs.destroy();
+    }
+
+
 }

http://git-wip-us.apache.org/repos/asf/oozie/blob/98ad14bd/release-log.txt
----------------------------------------------------------------------
diff --git a/release-log.txt b/release-log.txt
index 6937e24..0fe1e1d 100644
--- a/release-log.txt
+++ b/release-log.txt
@@ -1,5 +1,6 @@
 -- Oozie 4.4.0 release (trunk - unreleased)
 
+OOZIE-2811 Add support for filtering out properties from SparkConfigurationService (gezapeti via rkanter)
 OOZIE-2802 Spark action failure on Spark 2.1.0 due to duplicate sharelibs (gezapeti via rkanter)
 OOZIE-2803 Mask passwords when printing out configs/args in MapReduceMain and SparkMain (pbacsko via rkanter)
 OOZIE-2799 Setting log location for spark sql on hive (satishsaley)