如何使用 Apache Livy 设置 Spark 配置属性?

How to set Spark configuration properties using Apache Livy?

我不知道如何在将 Spark 作业提交给 Apache Livy 时以编程方式传递 SparkSession 参数:

这是 Test Spark 作业:

class Test extends Job[Int]{

  override def call(jc: JobContext): Int = {

    val spark = jc.sparkSession()

    // ...

  }
}

这是将此 Spark 作业提交给 Livy 的方式:

val client = new LivyClientBuilder()
  .setURI(new URI(livyUrl))
  .build()

try {
  client.uploadJar(new File(testJarPath)).get()

  client.submit(new Test())

} finally {
  client.stop(true)
}

如何将以下配置参数传递给 SparkSession?

  .config("es.nodes","1localhost")
  .config("es.port",9200)
  .config("es.nodes.wan.only","true")
  .config("es.index.auto.create","true")

您可以像这样通过 LivyClientBuilder 轻松做到这一点:

val client = new LivyClientBuilder()
  .setURI(new URI(livyUrl))
  .setConf("es.nodes","1localhost")
  .setConf("key", "value")
  .build()

可以使用

将配置参数设置为 LivyClientBuilder
public LivyClientBuilder setConf(String key, String value)

以便您的代码以:

开头
val client = new LivyClientBuilder()
  .setURI(new URI(livyUrl))
  .setConf("es.nodes","1localhost")
  .setConf("es.port",9200)
  .setConf("es.nodes.wan.only","true")
  .setConf("es.index.auto.create","true")
  .build()

LivyClientBuilder.setConf 我觉得不行。因为 Livy 会修改所有不以 spark. 开头的配置。并且 Spark 无法读取修改后的配置。 See here

private static File writeConfToFile(RSCConf conf) throws IOException {
    Properties confView = new Properties();
    for (Map.Entry<String, String> e : conf) {
      String key = e.getKey();
      if (!key.startsWith(RSCConf.SPARK_CONF_PREFIX)) {
        key = RSCConf.LIVY_SPARK_PREFIX + key;
      }
      confView.setProperty(key, e.getValue());
    }
 ...
}

所以答案很简单:将spark.添加到所有es配置中,像这样,

  .config("spark.es.nodes","1localhost")
  .config("spark.es.port",9200)
  .config("spark.es.nodes.wan.only","true")
  .config("spark.es.index.auto.create","true")

不知道是elastic-spark做兼容性工作,还是spark。它只是工作。

PS:我已经尝试使用 REST API,它可以工作。但不是程序化的 API.