如何将配置属性传递给SparkListener?

时间:2017-05-22 16:44:11

标签: java apache-spark

Stack:

  • Java 8
  • Spark 2.1.0
  • Kafka 0.10.2
  • HDP 2.5.2

我正在创建一个自定义SparkListener,当Spark作业在特定任务中失败时,它将写入Kafka。为了做到这一点,我使用KafkaProducer类,它接受属性。但是,我们正在尝试将其投入生产,并且Kafka代理地址无法硬编码到自定义SparkListener类中。因此需要使用外部属性。

似乎在SparkListener的生命周期中,首先调用onApplicationStart方法(在构造函数之后)。另外,我熟悉在通过Spark-Submit实例化Spark Conf / Context之前将自定义属性传递给Spark驱动程序。

有没有办法将外部信息传递给SparkListener?

`public class TestingSparkListener {
    public static void main(String[] a) {
        SparkConf sc = new SparkConf().setAppName("Testing Custom Spark Listener");
        sc.set("spark.extraListeners", "my.package.TestSparkListener");
        JavaSparkContext jsc = new JavaSparkContext(sc);
    }
}`

`public class CustomSparkListener {
    static KafkaProducer<String, String> prod;
    @Override
    public void onApplicationStart(SparkListenerApplicationStart applicationStart) {
        SparkConf conf = SparkContext.getOrCreate().getConf(); //problem here
    }
}`

已编辑添加示例代码

1 个答案:

答案 0 :(得分:0)

  

有没有办法将外部信息传递给SparkListener?

spark.extraListeners属性

如果使用spark.extraListeners属性,则应定义一个接受SparkConf的构造函数:

  

Spark应用程序的配置。用于将各种Spark参数设置为键值对。

使用SparkConf,伪代码可能如下所示:

val sparkConf: SparkConf = ...
val kafkaConfig = sparkConf.getAllWithPrefix("spark.myapp.kafka")

请参阅relevant code in SparkContext了解它的外观:

val constructorTakingSparkConf = constructors.find { c =>
  c.getParameterTypes.sameElements(Array(classOf[SparkConf]))

SparkContext.addSparkListener

如果您想在Spark应用程序中注册SparkListener(在代码中),则可以改为使用SparkContext.addSparkListener方法:

  

addSparkListener(listener:SparkListenerInterface):单位

     

注册一个侦听器以接收执行期间发生的事件的上调。

这为您提供了一种根据需要初始化SparkListener的方法。您可以创建一个明确接受其他参数的构造函数。

我不推荐它,因为它对SparkListener进行了硬编码,没有重新编译就无法禁用它。