[英]In spark streaming, what is the difference between foreach and foreachRDD
[英]DB connection with foreachRDD Spark Streaming
我在流传输数据时创建并传递到数据库的连接。 每次从文件读取数据并创建Neo4j会话都会增加性能开销。 如何更改现有代码以提高应用程序的性能? 我是否应该将foreachRDD更改为foreachPartition以便为连接创建单独的对象?
这是我的流代码:
val wordsArrays: DStream[Array[String]] = values.map(t => t.split(", "))
wordsArrays.foreachRDD(rdd => {
rdd.flatMap(
data => {
val recommendations = execNeo4jSearchQuery(neo4jConfigs.getNeo4jConfig(args(1)), data)
val calendarTime = Calendar.getInstance.getTime
val recommendationsMap = convertDataToMap(recommendations, calendarTime)
recommendationsMap
}).saveToEs("rdd-timed/output")
}
)
foreachPartiotion使您可以按分区而不是按映射迭代创建对象,当需要为每个分区创建单个连接时,它很有用。
但是在您的情况下,似乎您创建的所有对象都取决于地图的输入值或当前时间。 所以我看不出它将如何帮助您。
除非您在每次运行execNeo4jSearchQuery时都创建一个连接,否则我看不到它如何为您提供帮助,但是如果您确实创建了一个连接,则对不依赖于数据的函数的每次调用都将有助于改善代码。 (但是瓶颈并不存在,所以您不会看到很大的进步)。
最好将数据库连接与mapPartitions一起使用,然后将具有更新分区的rdd保存到ElasticSearch:
wordsArrays.foreachRDD(rdd => {
rdd.mapPartitions { partition => {
val neo4jConfig = neo4jConfigurations.getNeo4jConfig(args(1))
val result = partition.map( data => {
val recommendations = execNeo4jSearchQuery(neo4jConfig, data)
val calendarTime = Calendar.getInstance.getTime
convertDataToMap(recommendations, calendarTime)
}).toList.flatten
result.iterator
}
}.saveToEs("rdd-timed/output")
})
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.