Stack:
我正在创建一个自定义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
}
}`
已编辑添加示例代码
答案 0 :(得分:0)
有没有办法将外部信息传递给SparkListener?
如果使用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]))
如果您想在Spark应用程序中注册SparkListener
(在代码中),则可以改为使用SparkContext.addSparkListener方法:
addSparkListener(listener:SparkListenerInterface):单位
注册一个侦听器以接收执行期间发生的事件的上调。
这为您提供了一种根据需要初始化SparkListener的方法。您可以创建一个明确接受其他参数的构造函数。
我不推荐它,因为它对SparkListener进行了硬编码,没有重新编译就无法禁用它。