Elasticsearch 一些异常报错、注意事项(1)

本文讨论了在Elasticsearch中遇到的一些异常,包括mapper_parsing_exception与date_time_parse_exception。主要问题出在日期字段的格式不匹配。解决方案包括明确指定文档操作类型、理解分片选择机制以及调整日期格式映射。通过对异常的解析,提供了如何避免和解决这些问题的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

操作类型

系统支持通过参数(op_type=create)强制执行创建索引操作。只有当系统中不存在此文档的时候才会创建成功。如果不指定此操作类型,如果存在此文档则会进行更新操作。

bulk 默认op_type 是index

自动创建id

当创建文档的时候,如果不指定id,系统则会默认创建id。自动生成的id是一个不会重复的随机数。

分片选择

默认情况下,分片的选择是通过id的散列值进行控制。这个只可以通过router参数进行手动控制。可以在每个操作的基础上直接通过hash函数的值来指定分片的选择。如下:

POST example/docs/?routing=路由的值(动态替换)&pretty

报错信息

异常一

ElasticsearchException[Elasticsearch exception [type=mapper_parsing_exception, reason=failed to parse field [extractedFields.message.time] of type [date] in document with id 'z06A4X0BHDCoR6byd8Hy'. Preview of field's value: '2020-07-23 11:23:38']]; nested: ElasticsearchException[Elasticsearch exception [type=illegal_argument_exception, reason=failed to parse date field [2020-07-23 11:23:38] with format [strict_date_optional_time||epoch_millis]]]; nested: ElasticsearchException[Elasticsearch exception [type=date_time_parse_exception, reason=Failed to parse with all enclosed parsers]];

异常二

ElasticsearchException[Elasticsearch exception [type=mapper_parsing_exception, reason=failed to parse field [time] of type [date] in document with id 'OkmVZn4BExock2uC-Xxt'. Preview of field's value: '13:50:02']]; nested: ElasticsearchException[Elasticsearch exception [type=illegal_argument_exception, reason=failed to parse date field [13:50:02] with format [strict_date_optional_time||epoch_millis]]]; nested: ElasticsearchException[Elasticsearch exception [type=date_time_parse_exception, reason=Failed to parse with all enclosed parsers]];

异常三

ElasticsearchException[Elasticsearch exception [type=mapper_parsing_exception, reason=failed to parse field [extractedFields.message] of type [text] in document with id '4VKG4X0BHDCoR6byZVqf'. Preview of field's value: '{protocol=http, app_ip=88.0.46.134, app_port=80, service_port=45766, type=XPATH, aatime=2020-07-21 22:23:38, service_ip=115.238.251.172}']]; nested: ElasticsearchException[Elasticsearch exception [type=illegal_state_exception, reason=Can't get text on a START_OBJECT at ]];

异常一、二、三都是在批量插入操作时发生的。主要原因在于动态模板Mapping映射。以Mapping映射中日期类型的格式化设置为例。Elasticsearch默认date类型的格式是"strict_date_optional_time||epoch_millis",是包含时区信息的时间格式或者毫秒。(更多说明详见官网:Date field type | Elasticsearch Guide [8.1] | Elastic

对于上面的报错异常,可以自己增加日期类型字段的格式化匹配:

"time": {
"mapping": {
"type": "date",
"format": "MMM d HH:mm:ss||yyyy-MM-dd HH:mm:ss.SSS||HH:mm:ss||yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||strict_date_optional_time||epoch_millis"
},
"match": "*time"
}

elasticsearch 更多日期格式化参考:(format | Elasticsearch Guide [7.4] | Elastic

支持完全可定制的日期格式,这些语法在DateTimeFormatter (Java Platform SE 8 )中有解释。例如:

Jan 19 18:01:01 对应的格式化pattern为: MMM d HH:mm:ss
“Fri Aug 28 18:08:30 CST 2015”, 模式: “EEE MMM d HH:mm:ss ‘CST’ yyyy”
“Aug 28, 2015 6:8:30 PM”, 模式: “MMM d, yyyy h:m:s aa”

对于异常报错也可以采取ignore_malformed(忽略格式不对的数据)

### 关于 Shard1 的分片机制、配置及错误处理 Shard 是分布式数据库或搜索引擎中的一个重要概念,用于实现数据的水平分区存储。以下是关于 shard1 分片机制、配置以及可能遇到的相关问题及其解决方案。 #### 一、Shard1 的分片机制 在 Elasticsearch 中,shard 是其核心的数据分布单元。当创建索引时,默认会分配主分片 (primary shard) 和副本分片 (replica shard)[^5]。 - 主分片负责存储实际数据并处理写操作。 - 副本分片则提供冗余备份和读取扩展能力。 对于 shard1 而言,它通常是指某个特定的主分片编号为 1 的实例。Elasticsearch 使用一致性哈希算法来决定文档应该存放在哪个 shard 上[^6]。具体计算方式如下: ```python hash(_id) % number_of_primary_shards ``` 如果 `number_of_primary_shards` 设置不当,则可能导致负载不均衡等问题。 #### 二、Shard1 的配置注意事项 为了优化性能,在配置 shard1 或其他 shards 时需要注意以下几点: 1. **合理设置主分片数量**:建议根据硬件资源(CPU 核心数、内存大小等)调整主分片数目。过多或者过少都会影响查询效率[^7]。 2. **启用自动管理功能**:通过修改 elasticsearch.yml 文件可以开启一些高级特性,比如 shard allocation awareness[^8]。 ```yaml cluster.routing.allocation.awareness.attributes: zone ``` 3. **监控健康状态**:定期检查 `_cat/shards?v=true&h=index,shard,prirep,state,unassigned.reason` API 输出结果,确认是否存在未分配(unassigned)的情况[^9]。 #### 三、常见错误处理方案 针对 shard1 可能发生的异常情况列举如下几种典型场景及对应措施: ##### 场景 A - 数据丢失风险 原因可能是磁盘损坏或是节点突然离线造成的 primary shard 不可用。此时可以通过重建 replica 来恢复服务正常运行[^10]。 ##### 场景 B - Guava 版本冲突引发 NoSuchMethodError 类似于上述提到过的 Java 运行时报错信息 `java.lang.NoSuchMethodError: com.google.common.util.concurrent.MoreExecutors.directExecutor()`[^3] ,这通常是由于依赖库版本不同步引起的兼容性问题所致。解决办法是统一项目所使用的 guava jar 包版本号。 ##### 场景 C - 日志路径不可访问 假如 Spark 将日志上传至 HDFS 后无法被 JobHistory Server 正确解析显示出来的话,按照之前给出的经验提示需要确保 yarn-site.xml 配置项正确指向目标地址 `http://<host>:19888/jobhistory/logs` 并重启相关组件完成同步更新[^2]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值