从火花写入rdd到Elastic Search失败了

时间:2016-11-11 18:38:39

标签: hadoop elasticsearch apache-spark databricks

我正在尝试在版本2.4.0上的Elastic Cloud上编写一对rdd到Elastic Search。 我正在使用elasticsearch-spark_2.10-2.4.0插件写入ES。 这是我用来写ES的代码:

def predict_imgs(r):  
  import json
  out_d = {}
  out_d["pid"] = r["pid"]
  out_d["other_stuff"] = r["other_stuff"]

  return (r["pid"], json.dumps(out_d))

res2 = res1.map(predict_imgs)

es_write_conf = {
"es.nodes" : image_es,
#"es.port" : "9243",
"es.resource" : "index/type",
"es.nodes.wan.only":"True",
"es.write.operation":"upsert",
"es.mapping.id":"product_id",
"es.nodes.discovery" : "false",
"es.net.http.auth.user": "username",
"es.net.http.auth.pass": "pass",
"es.input.json": "true",
"es.http.timeout":"1m",
"es.scroll.size":"10",
"es.batch.size.bytes":"1mb",
"es.http.retries":"1",
"es.batch.size.entries":"5",
"es.batch.write.refresh":"False",
"es.batch.write.retry.count":"1",
"es.batch.write.retry.wait":"10s"}

res2.saveAsNewAPIHadoopFile(
path='-', 
outputFormatClass="org.elasticsearch.hadoop.mr.EsOutputFormat",
keyClass="org.apache.hadoop.io.NullWritable", 
valueClass="org.elasticsearch.hadoop.mr.LinkedMapWritable", 
conf=es_write_conf)

我得到的错误如下:

Py4JJavaError: An error occurred while calling     z:org.apache.spark.api.python.PythonRDD.saveAsNewAPIHadoopFile.
: org.apache.spark.SparkException: Job aborted due to stage failure: Task 744 in stage 26.0 failed 4 times, most recent failure: Lost task 744.3 in stage 26.0 (TID 2841, 10.181.252.29): org.apache.spark.SparkException: Python worker exited unexpectedly (crashed)

有趣的是,当我对rdd2中的前几个元素进行处理,然后从中创建一个新的rdd并将其写入ES时,它的工作正常无缺:

x = sc.parallelize([res2.take(1)])
x.saveAsNewAPIHadoopFile(
path='-', 
outputFormatClass="org.elasticsearch.hadoop.mr.EsOutputFormat",
keyClass="org.apache.hadoop.io.NullWritable", 
valueClass="org.elasticsearch.hadoop.mr.LinkedMapWritable", 
conf=es_write_conf)

我正在使用Elastic Cloud(Elastic Search的云产品)和Databricks(Apache Spark的云产品) 是不是ES无法跟上Spark写入ES的过程? 我将Elastic Cloud的大小从2GB RAM增加到8GB RAM。

我上面使用的es_write_conf是否有任何推荐的配置?您能想到的任何其他confs? 更新到ES 5.0有帮助吗?

感谢任何帮助。几天来一直在努力解决这个问题。谢谢。

1 个答案:

答案 0 :(得分:2)

看起来像pyspark计算的问题,而不是必需的弹性搜索保存过程。通过以下方式确保您的RDD正常:

  1. 在rdd1上执行count()(到"具体化"结果)
  2. 在rdd2上执行count()
  3. 如果计数正常,请在保存到ES之前尝试缓存结果:

    res2.cache()
    res2.count() # to fill the cache
    res2.saveAsNewAPIHadoopFile(...
    

    问题仍然存在,尝试查看死执行程序stderr和stdout(您可以在SparkUI的Executors选项卡中找到它们)。

    我还注意到es_write_conf中的批量非常小,尝试将其增加到500或1000以获得更好的性能。