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
`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