You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Hive向Elasticsearch导入失败:错误处理器索引缺失问题求助

Hive导入Elasticsearch跳过错误记录的问题解决

问题场景

使用Elasticsearch 6.8.0版本,从Hive向Elasticsearch导入数据时,因单条格式错误的JSON记录导致整个Hive作业失败。尝试修改配置es.write.rest.error.handler.es.return.default为PASS/HANDLED未解决问题,执行的Hive DDL脚本及异常堆栈如下:

执行的Hive DDL脚本

ADD JAR /home/smrafi/elasticsearch-hadoop-6.8.0/dist/elasticsearch-hadoop-6.8.0.jar;
CREATE external TABLE hive_es_with_handler10( data STRING)
STORED BY 'org.elasticsearch.hadoop.hive.EsStorageHandler'
TBLPROPERTIES('es.resource' = 'test_eshadoop/healthCareProvider','es.nodes' = 'xyzpqr','es.input.json' = 'yes','es.index.auto.create' = 'true','es.write.operation'='upsert',
'es.nodes.wan.only' = 'true','es.port' = '443','es.net.ssl'='true','es.batch.size.entries'='1','es.mapping.id' ='id','es.batch.write.retry.count'='-1',
'es.batch.write.retry.wait'='60s',
'es.write.data.error.handlers' = 'es',
'es.write.rest.error.handler.es.client.nodes' = 'vpc-pid-pre-prod-es-cluster-b7thvqfj3tp45arxl34gge3yyi.us-east-2.es.amazonaws.com',
'es.write.rest.error.handler.es.client.port' = '443',
'es.write.rest.error.handler.es.client.resource'='error_es_index',
'es.write.rest.error.handler.es.return.default'='PASS',
'es.write.rest.error.handler.es.return.error'='PASS'); 
insert into hive_es_with_handler10 select * from provider;

异常堆栈

Caused by: org.elasticsearch.hadoop.EsHadoopIllegalArgumentException: Could not locate write resource for ES error handler.
        at org.elasticsearch.hadoop.util.Assert.hasText(Assert.java:30)
        at org.elasticsearch.hadoop.handler.impl.elasticsearch.ElasticsearchHandler.init(ElasticsearchHandler.java:145)
        at org.elasticsearch.hadoop.serialization.handler.write.impl.DelegatingErrorHandler.init(DelegatingErrorHandler.java:40)
        at org.elasticsearch.hadoop.handler.impl.AbstractHandlerLoader.loadHandlers(AbstractHandlerLoader.java:114)
        at org.elasticsearch.hadoop.serialization.bulk.BulkEntryWriter.<init>(BulkEntryWriter.java:56)
        at org.elasticsearch.hadoop.rest.RestRepository.lazyInitWriting(RestRepository.java:138)
        at org.elasticsearch.hadoop.rest.RestRepository.writeProcessedToIndex(RestRepository.java:185)
        at org.apache.hadoop.hive.EsHiveOutputFormat$EsHiveRecordWriter.write(EsHiveOutputFormat.java:64)
        at org.apache.hadoop.hive.ql.exec.FileSinkOperator.process(FileSinkOperator.java:762)
        at org.apache.hadoop.hive.ql.exec.Operator.forward(Operator.java:897)
        at org.apache.hadoop.hive.ql.exec.SelectOperator.process(SelectOperator.java:95)
        at org.apache.hadoop.hive.ql.exec.Operator.forward(Operator.java:897)
        at org.apache.hadoop.hive.ql.exec.TableScanOperator.process(TableScanOperator.java:130)
        at org.apache.hadoop.hive.ql.exec.MapOperator$MapOpCtx.forward(MapOperator.java:148)
        at org.apache.hadoop.hive.ql.exec.MapOperator.process(MapOperator.java:550)
        ... 9 more

问题根因

异常提示无法找到ES错误处理器的写入资源,核心原因是:

  • 配置中指定的错误记录存储索引error_es_index不存在,且未开启该索引的自动创建开关,导致ES错误处理器初始化失败,进而阻断整个作业启动。
  • 若仅需跳过错误记录,无需使用ES错误处理器(该处理器用于将错误数据写入另一个ES索引),配置冗余反而引发问题。

解决方案

方案1:仅跳过错误记录(无需保存错误数据)

修改Hive表的TBLPROPERTIES,将错误处理器替换为ignore,并移除所有与ES错误处理器相关的配置,简化后的DDL如下:

ADD JAR /home/smrafi/elasticsearch-hadoop-6.8.0/dist/elasticsearch-hadoop-6.8.0.jar;
CREATE external TABLE hive_es_with_handler10( data STRING)
STORED BY 'org.elasticsearch.hadoop.hive.EsStorageHandler'
TBLPROPERTIES('es.resource' = 'test_eshadoop/healthCareProvider','es.nodes' = 'xyzpqr','es.input.json' = 'yes','es.index.auto.create' = 'true','es.write.operation'='upsert',
'es.nodes.wan.only' = 'true','es.port' = '443','es.net.ssl'='true','es.batch.size.entries'='1','es.mapping.id' ='id','es.batch.write.retry.count'='-1',
'es.batch.write.retry.wait'='60s',
'es.write.data.error.handlers' = 'ignore'); -- 核心修改:使用ignore处理器跳过错误
insert into hive_es_with_handler10 select * from provider;

ignore处理器会直接跳过格式错误的记录,让作业继续执行其他正常数据的导入。

方案2:保存错误记录到指定ES索引(需保留错误数据)

若需要将错误记录存储到另一个ES索引,需确保错误处理器的配置完整且有效:

  1. 提前创建错误索引:手动在目标ES集群中创建error_es_index索引;或添加自动创建配置:
    'es.write.rest.error.handler.es.client.index.auto.create' = 'true'
    
  2. 校验错误处理器的ES连接配置:确保es.write.rest.error.handler.es.client.nodes、es.port等参数指向正确的ES集群,SSL配置与目标集群匹配。
    修改后的TBLPROPERTIES关键配置如下:
'es.write.data.error.handlers' = 'es',
'es.write.rest.error.handler.es.client.nodes' = 'vpc-pid-pre-prod-es-cluster-b7thvqfj3tp45arxl34gge3yyi.us-east-2.es.amazonaws.com',
'es.write.rest.error.handler.es.client.port' = '443',
'es.write.rest.error.handler.es.client.resource'='error_es_index',
'es.write.rest.error.handler.es.client.index.auto.create' = 'true', -- 新增自动创建索引
'es.write.rest.error.handler.es.return.default'='PASS',
'es.write.rest.error.handler.es.return.error'='PASS'

内容的提问来源于stack exchange,提问作者Syed Rafi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 18:35:30