code: public T addSparkArg(String name, String value) {
      SparkSubmitOptionParser validator = new ArgumentValidator(true);
      if (validator.MASTER.equals(name)) {
        setMaster(value);
      } else if (validator.PROPERTIES_FILE.equals(name)) {
        setPropertiesFile(value);
      } else if (validator.CONF.equals(name)) {
        String[] vals = value.split("=", 2);
        setConf(vals[0], vals[1]);
      } else if (validator.CLASS.equals(name)) {
        setMainClass(value);
      } else if (validator.JARS.equals(name)) {
        builder.jars.clear();
        for (String jar : value.split(",")) {
          addJar(jar);
        }
      } else if (validator.FILES.equals(name)) {
        builder.files.clear();
        for (String file : value.split(",")) {
          addFile(file);
        }
      } else if (validator.PY_FILES.equals(name)) {
        builder.pyFiles.clear();
        for (String file : value.split(",")) {
          addPyFile(file);
        }
      } else {
        validator.parse(Arrays.asList(name, value));
        builder.userArgs.add(name);
        builder.userArgs.add(value);
      }
      return self();
    }
docs: Adds an argument with a value to the Spark invocation. If the argument name corresponds to
  a known argument, the code validates that the argument actually expects a value, and throws
  an exception otherwise.
  <p>
  It is safe to add arguments modified by other methods in this class (such as
  {@link #setMaster(String)} - the last invocation will be the one to take effect.
  <p>
  Use this method with caution. It is possible to create an invalid Spark command by passing
  unknown arguments to this method, since those are allowed for forward compatibility.
  
  @since 1.5.0
  @param name Name of argument to add.
  @param value Value of the argument.
  @return This launcher.