EsHadoopException:无法为批量操作Spark流写入所有条目

时间:2018-07-11 08:09:33

标签: scala apache-spark elasticsearch spark-streaming

我想遍历数据流,对其进行查询,然后返回应写入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")
    )

1 个答案:

答案 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")
    })