Apache spark Spark Streaming:如何在接收器';失败

Apache spark Spark Streaming:如何在接收器';失败,apache-spark,spark-streaming,distributed-computing,terminate,custom-receiver,Apache Spark,Spark Streaming,Distributed Computing,Terminate,Custom Receiver,我们正在使用一个定制的spark接收器,它从提供的http链接读取流数据。如果提供的http链接不正确,则接收器将失败。问题是spark会持续重启接收器,应用程序永远不会终止。问题是如果接收器出现故障,如何告诉Spark终止应用程序 这是我们定制接收器的摘录: def onStart() { // Start the thread that receives data over a connection new Thread("Receiver") { overri

我们正在使用一个定制的spark接收器,它从提供的http链接读取流数据。如果提供的http链接不正确,则接收器将失败。问题是spark会持续重启接收器,应用程序永远不会终止。问题是如果接收器出现故障,如何告诉Spark终止应用程序

这是我们定制接收器的摘录:

 def onStart() {
    // Start the thread that receives data over a connection
    new Thread("Receiver") {
      override def run() { receive() }
    }.start()
  }

  private def receive(): Unit = {
    ....
    val response: CloseableHttpResponse = httpclient.execute(req)
    try {
      val sl = response.getStatusLine()
      if (sl.getStatusCode != 200){
        val errorMsg = "Error: " + sl.getStatusCode 
        val thrw = new RuntimeException(errorMsg)
        stop(errorMsg, thrw)
      } else {
      ...
        store(doc)
      }
val ssc = new StreamingContext(sparkConf, duration)
val changes = ssc.receiverStream(new CustomReceiver(...
...
ssc.start()
ssc.awaitTermination()
我们有一个使用此接收器的spark streaming应用程序:

 def onStart() {
    // Start the thread that receives data over a connection
    new Thread("Receiver") {
      override def run() { receive() }
    }.start()
  }

  private def receive(): Unit = {
    ....
    val response: CloseableHttpResponse = httpclient.execute(req)
    try {
      val sl = response.getStatusLine()
      if (sl.getStatusCode != 200){
        val errorMsg = "Error: " + sl.getStatusCode 
        val thrw = new RuntimeException(errorMsg)
        stop(errorMsg, thrw)
      } else {
      ...
        store(doc)
      }
val ssc = new StreamingContext(sparkConf, duration)
val changes = ssc.receiverStream(new CustomReceiver(...
...
ssc.start()
ssc.awaitTermination()
如果接收器没有错误,一切正常。如果接收器出现故障(例如,使用错误的http链接),spark将持续重新启动它,应用程序将永远不会终止

16/05/31 17:03:38 ERROR TaskSetManager: Task 0 in stage 0.0 failed 1 times; aborting job
16/05/31 17:03:38 ERROR ReceiverTracker: Receiver has been stopped. Try to restart it.

如果接收器出现故障,我们只想终止整个应用程序。

Spark Streaming中的调度工作方式似乎是,ReceiverTracker将继续重新启动故障接收器,直到ReceiverTracker自身未停止


要停止ReceiverTracker,我们需要停止整个应用程序。因此,似乎无法从接收器本身控制此过程。

Spark Streaming中的调度工作方式似乎是,ReceiverTracker将继续重新启动故障接收器,直到ReceiverTracker自身未停止


要停止ReceiverTracker,我们需要停止整个应用程序。因此,似乎没有办法从接收器本身控制此过程。

有办法控制基于定制接收器的spark流媒体应用程序的生命周期。为应用程序定义作业进度侦听器,并跟踪发生的情况

class CustomReceiverListener extends StreamingJobProgressListener {
    private boolean receiverStopped = false;

    public CustomReceiverListener(StreamingContext ssc) { super(ssc);}

    public boolean isReceiverStopped() {
        return receiverStopped;
    }
    @Override
    public void onReceiverStopped(StreamingListenerReceiverStopped receiverStopped) {
        LOG.info("Update the flag field");
        this.receiverStopped = true;
    }
}
在驱动程序中,初始化一个线程以监视
receiverStopped
标志的状态。此线程完成后,驱动程序将停止流应用程序。(更好的方法是定义由驱动程序定义的回调方法,该方法将停止流应用程序)


注意:如果您的接收器有多个实例,请更改
CustomReceiverListener
的实现,以确保所有接收器实例都已停止。

有一种方法可以控制基于自定义接收器的spark流媒体应用程序的生命周期。为应用程序定义作业进度侦听器,并跟踪发生的情况

class CustomReceiverListener extends StreamingJobProgressListener {
    private boolean receiverStopped = false;

    public CustomReceiverListener(StreamingContext ssc) { super(ssc);}

    public boolean isReceiverStopped() {
        return receiverStopped;
    }
    @Override
    public void onReceiverStopped(StreamingListenerReceiverStopped receiverStopped) {
        LOG.info("Update the flag field");
        this.receiverStopped = true;
    }
}
在驱动程序中,初始化一个线程以监视
receiverStopped
标志的状态。此线程完成后,驱动程序将停止流应用程序。(更好的方法是定义由驱动程序定义的回调方法,该方法将停止流应用程序)


注意:如果您的接收器有多个实例,请更改
CustomReceiverListener
的实现,以确保所有接收器实例都已停止。

遗憾的是,现在不推荐使用Adly,现在不推荐使用我认为这是不推荐的我认为这是不推荐的