为了避免延迟并加快进程,我在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中的结果文件数据缺乏很多,这有点遗留。我想我们可以在火花流中构建线程池。火花流中的线程池是否会丢失一些数据?
感谢您的帮助。
答案 0 :(得分:0)
分区已经由单独的线程处理,并且流不会继续到下一批,直到前一个完成。所以它不太可能给你买任何东西,并使资源使用跟踪不那么透明。
与此同时,由于此时您的代码已实施,您可能会丢失数据。由于threadPool
不会awaitTermination
,因此父线程可能会在处理完所有数据之前退出。
总的来说,它没有用处。如果要增加吞吐量,则应调整分区数和计算资源量。