Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/385.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何将配置属性传递给SparkListener?_Java_Apache Spark - Fatal编程技术网

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

Java 如何将配置属性传递给SparkListener?,java,apache-spark,Java,Apache Spark,堆栈: 爪哇8 Spark 2.1.0 卡夫卡0.10.2 HDP 2.5.2 我正在创建一个自定义SparkListener,当Spark作业在特定任务中失败时,它将向Kafka写入。为了做到这一点,我使用KafkaProducer类,它接受属性。但是,我们正在尝试将其投入生产,而Kafka代理地址不能硬编码到定制的SparkListener类中。因此需要使用外部属性 似乎在SparkListener的生命周期中,首先调用onApplicationStart方法(在构造函数之后)。此外,我

堆栈:

  • 爪哇8
  • Spark 2.1.0
  • 卡夫卡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
    }
}`
`公共类测试SparkListener{
公共静态void main(字符串[]a){
SparkConf sc=new SparkConf().setAppName(“测试自定义Spark侦听器”);
sc.set(“spark.extrallisteners”、“my.package.TestSparkListener”);
JavaSparkContext jsc=新的JavaSparkContext(sc);
}
}`
`公共类CustomListener{
静态卡夫卡生产商产品;
@凌驾
Application Start(SparkListeneraApplication Start Application Start)上的公共无效{
SparkConf conf=SparkContext.getOrCreate().getConf();//这里有问题
}
}`
编辑以添加示例代码

有没有办法将外部信息传递给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
    }
}`
spark.extraListeners属性 如果使用
spark.extraListeners
属性,则应定义一个接受以下内容的构造函数:

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

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

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

请参阅以了解封面下的外观:

val constructorTakingSparkConf = constructors.find { c =>
  c.getParameterTypes.sameElements(Array(classOf[SparkConf]))
SparkContext.addSparkListener 但是,如果要在Spark应用程序(在代码中)中注册
SparkListener
,可以使用以下方法:

addSparkListener(监听器:SparkListenerInterface):单位

注册侦听器以接收来自执行期间发生的事件的up调用

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

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

有没有办法将外部信息传递给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
    }
}`
spark.extraListeners属性 如果使用
spark.extraListeners
属性,则应定义一个接受以下内容的构造函数:

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

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

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

请参阅以了解封面下的外观:

val constructorTakingSparkConf = constructors.find { c =>
  c.getParameterTypes.sameElements(Array(classOf[SparkConf]))
SparkContext.addSparkListener 但是,如果要在Spark应用程序(在代码中)中注册
SparkListener
,可以使用以下方法:

addSparkListener(监听器:SparkListenerInterface):单位

注册侦听器以接收来自执行期间发生的事件的up调用

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


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

当我尝试这样做时,我似乎无法避免创建多个SparkContext。有办法吗?这是不可能的。每个JVM只能有一个
SparkContext
的实例,所以…是否愿意共享代码以证明我错了?我很感激。重写答案,因为我完全没有抓住SparkListeners的重点(看起来好像“我已经有一段时间没有和他们合作了”这个问题)。抱歉搞混了。我想我已经走到了死胡同。因此,我在自定义SparkListener中添加了一个构造函数,它接受一个参数SparkConf。我会尝试使用属性,但在运行时它会抱怨自定义SparkListener没有一个以SparkConf作为参数的单参数构造函数。通过添加SparkConf参数并尝试获取所需的Kafka属性,Spark现在抱怨我正在尝试创建多个sparkContext。当我尝试创建多个sparkContext时,我似乎无法避免创建多个sparkContext。有办法吗?这是不可能的。每个JVM只能有一个
SparkContext
的实例,所以…是否愿意共享代码以证明我错了?我很感激。重写答案,因为我完全没有抓住SparkListeners的重点(看起来好像“我已经有一段时间没有和他们合作了”这个问题)。抱歉搞混了。我想我已经走到了死胡同。因此,我在自定义SparkListener中添加了一个构造函数,它接受一个参数SparkConf。我会尝试使用属性,但在运行时它会抱怨自定义SparkListener没有一个以SparkConf作为参数的单参数构造函数。通过添加SparkConf参数并尝试获取所需的Kafka属性,Spark现在抱怨我试图创建多个sparkContext