在spark streaming program

时间:2017-11-12 10:58:02

标签: apache-spark streaming

为了避免延迟并加快进程,我在spark spark中构建线程池。主要计划如下:

stream.foreachRDD(rdd=> {
  rdd.foreachPartition { rddPartition => {
    val client: Client = ESClient.getInstance.getClient
    var num = Random.nextInt()
    val threadPool: ExecutorService = Executors.newFixedThreadPool(5)
    val confs = new Configuration()
    rddPartition.foreach(x => {
      threadPool.execute(new esThread(x._2, num, client, confs))
    }        )      }     }    }    )

esThread的功能是首先,我们查询弹性搜索,然后我们得到ES的查询结果,最后我们将结果写入HDFS。但我们发现HDFS中的结果文件数据缺乏很多,这有点遗留。我想我们可以在火花流中构建线程池。火花流中的线程池是否会丢失一些数据?

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

分区已经由单独的线程处理,并且流不会继续到下一批,直到前一个完成。所以它不太可能给你买任何东西,并使资源使用跟踪不那么透明。

与此同时,由于此时您的代码已实施,您可能会丢失数据。由于threadPool不会awaitTermination,因此父线程可能会在处理完所有数据之前退出。

总的来说,它没有用处。如果要增加吞吐量,则应调整分区数和计算资源量。