如何设置Spark流接收器频率?

时间:2017-06-12 06:19:02

标签: apache-spark spark-streaming

我的要求是处理股票市场的每小时数据。 即,每个流间隔从源获取一次数据并通过DStream处理它。

我已经实现了一个自定义接收器,通过实现onStart()和onStop()方法及其工作来废弃/监控网站。

遇到的挑战:

  • 接收器线程连续获取数据,即每个间隔倍数。
  • 无法协调接收器和DStream执行时间间隔。

我尝试的选项:

  1. 接收器线程休眠几秒钟(等于流间隔)。 在这种情况下,数据不是处理时的最新数据。
  2. enter image description here

    enter image description here

    class CustomReceiver(interval: Int)
        extends Receiver[String](StorageLevel.MEMORY_AND_DISK_2) {
    
      def onStart() {
        new Thread("Website Scrapper") {
          override def run() { receive() }
        }.start()
      }
    
      def onStop() {
    
      }
    
      /** Create a socket connection and receive data until receiver is stopped */
      private def receive() {
        println("Entering receive:" + new Date());
        try {
          while (!isStopped) {
            val scriptsLTP = StockMarket.getLiveStockData()
            for ((script, ltp) <- scriptsLTP) {
              store(script + "," + ltp)
            }
            println("sent data")
            System.out.println("going to sleep:" + new Date());
            Thread.sleep(3600 * 1000);
            System.out.println("awaken from sleep:" + new Date());
          }
          println("Stopped receiving")
          restart("Trying to connect again")
        } catch {
          case t: Throwable =>
            restart("Error receiving data", t)
        }
        println("Exiting receive:" + new Date());
      }
    }
    

    如何使Spark Streaming接收器与DStream处理同步?

1 个答案:

答案 0 :(得分:0)

这个用例似乎不适合Spark Streaming。间隔足够长,可以将其视为常规批处理作业。这样,我们就可以更好地利用集群资源。

我会通过并行化目标代码将其重写为Spark Job,使用mapPartitions将执行程序用作分布式Web处理程序,然后按预期进行处理。

然后安排Spark作业每小时运行一次cron或更多高级替代品,例如Chronos所需的确切时间。