Apache spark 如何设置Spark streaming接收器频率?

Apache spark 如何设置Spark streaming接收器频率?,apache-spark,spark-streaming,Apache Spark,Spark Streaming,我的要求是处理股票市场的每小时数据。 i、 e、每个流间隔从源获取一次数据,并通过数据流进行处理 我已经实现了一个自定义接收器,通过实现onStart()和onStop()方法及其工作原理来废弃/监视网站 遇到的挑战: 接收方线程连续获取数据,即每间隔多次 无法协调接收器和数据流执行时间间隔 我尝试过的选项: 接收器线程睡眠几秒钟(等于流间隔)。 在这种情况下,数据不是处理时的最新数据 class CustomReceiver(间隔:Int) 扩展接收器[字符串](存储级别.内存和磁盘2

我的要求是处理股票市场的每小时数据。 i、 e、每个流间隔从源获取一次数据,并通过数据流进行处理

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

遇到的挑战:

  • 接收方线程连续获取数据,即每间隔多次
  • 无法协调接收器和数据流执行时间间隔
我尝试过的选项:

  • 接收器线程睡眠几秒钟(等于流间隔)。 在这种情况下,数据不是处理时的最新数据
  • class CustomReceiver(间隔:Int)
    扩展接收器[字符串](存储级别.内存和磁盘2){
    def onStart(){
    新线程(“网站刮刀”){
    覆盖def run(){receive()}
    }.start()
    }
    def onStop(){
    }
    /**创建套接字连接并接收数据,直到接收器停止*/
    私有def receive(){
    println(“输入接收:+新日期());
    试一试{
    而(!isStopped){
    val scriptsLTP=StockMarket.getLiveStockData()
    for((脚本,ltp)
    重新启动(“接收数据时出错”,t)
    }
    println(“退出接收:+新日期());
    }
    }
    

    如何使火花流接收器与DSoW处理同步?

    < P>这个用例似乎不适合火花流传输。间隔足够长,可以认为这是一个常规的批处理作业。这样,我们可以更好地利用群集资源。

    我会将它重写为一个Spark作业,通过并行化目标代码,使用
    mapPartitions
    将执行器用作分布式web清除器,然后按预期进行处理


    然后按StaskWorks:Engult> Cron < P>这种情况对于SCAPIC流来说似乎不太合适。间隔足够长,可以将其视为常规的批处理作业。这样,我们可以更好地利用群集资源。> 我会将它重写为一个Spark作业,通过并行化目标代码,使用

    mapPartitions
    将执行器用作分布式web清除器,然后按预期进行处理


    然后将Spark作业安排为每小时运行一次,使用
    cron
    或更高级的替代方案,例如在所需的确切时间运行Chronos。

    在流媒体间隔开始时获取数据是一个选项吗?在流媒体间隔开始时获取数据是一个选项吗?根据您的观点,最大可行的间隔是什么一个流作业?@ VijayInNururi,这取决于USECASE,所以我不会亲爱的放一个数字。如果你要处理的数据不断地出现,但是你只需要1个报告/HR,我会考虑火花流。这里的要点是火花流是关于流数据的,而你的用例类似于需要运行的批处理作业。特定时间。还请注意,Spark Streaming将在其运行时分配群集资源。您的用例看起来每小时处理几分钟。感谢您的澄清,不断地为如此低的使用率阻塞一个好的资源块是有害的。根据您的看法,流的最大可行间隔是多少E-Joice?@ VijaynNururi,这取决于USECASE,所以我不太愿意放一个数字。如果您要处理的数据不断地出现,但是您只需要1个报告/HR,我会考虑火花流。这里的要点是火花流是关于流数据的,而您的用例类似于需要在特定的范围运行的批处理作业。时间。还请注意,Spark Streaming将在运行时分配群集资源。您的用例看起来每小时处理几分钟。由于使用率如此低,持续阻塞大量资源是有害的,感谢您的澄清。
    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());
      }
    }