我通过对它运行Neo4j查询来处理数据。流数据流作为输入。但是,整个处理管道在时间上效率不高。我使用visualvm分析了资源使用情况,但它只帮助我了解了某些东西会阻止Neo4jDriver和Spark并使它们等待。因此查询本身只需几毫秒即可运行,而整个处理流程需要20-60秒,具体取决于数据集的大小。
线程分析结果如下:
处理缓慢和进程阻塞的原因可能是什么?
这是主要处理工作集中的一段代码:
wordsArrays.foreachRDD(rdd => { rdd.mapPartitions {分区=> {
val neo4jDriver = neo4jConfigurations.getNeo4jDriver(neo4jDbConfigs)
val neo4jSession = neo4jDriver.session()
val recommendations = execBatchNeo4jSearchQuery(neo4jSession, partition.toList)
neo4jSession.close()
val calendarTime = Calendar.getInstance.getTime
val result = convertQueryResultToMap(recommendations, calendarTime)
neo4jDriver.close()
result.iterator
}
}.saveToEs("geo-test6/output")
})
execBatchNeo4jSearchQuery方法从流中获取数据,对其进行查询并返回一些结果。 SaveToEs方法将查询结果保存到ElasticSearch