我想遍历数据流,对其进行查询,然后返回应写入ElasticSearch的结果。我尝试使用mapPartitions方法创建与数据库的连接,但是,出现这样的错误,它表明分区向rdd返回None(我想在转换之后应该添加一些操作):
org.elasticsearch.hadoop.EsHadoopException: Could not write all entries for bulk operation [10/10]. Error sample (first [5] error messages)
在代码中可以进行哪些更改以将数据导入rdd并将其发送到ElasticSearch而不造成任何麻烦?
Alos,我在foreachRDD中使用flatMap解决了该问题的解决方案,但是,我在每个rdd上都创建了一个到数据库的连接,这在性能方面是无效的。
这是用于流数据处理的代码:
wordsArrays.foreachRDD(rdd => {
rdd.mapPartitions { part => {
val neo4jConfig = neo4jConfigurations.getNeo4jConfig(args(1))
part.map(
data => {
val recommendations = execNeo4jSearchQuery(neo4jConfig, data)
val calendarTime = Calendar.getInstance.getTime
val recommendationsMap = convertDataToMap(recommendations, calendarTime)
recommendationsMap
})
}
}
}.saveToEs("rdd-timed/output")
)
答案 0 :(得分:0)
问题是我尝试将迭代器直接转换为Array,尽管它包含记录的多行。这就是为什么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")
})