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索引,需确保错误处理器的配置完整且有效:
- 提前创建错误索引:手动在目标ES集群中创建
error_es_index索引;或添加自动创建配置:'es.write.rest.error.handler.es.client.index.auto.create' = 'true' - 校验错误处理器的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
相关产品推荐
相关产品推荐

