[Elasticsearch] ES更新问题踩坑记录「终于解决」

[Elasticsearch] ES更新问题踩坑记录「终于解决」问题描述 我们有个系统设计的时候针对Hive创建表、删除表, 需要更新ES中的一个状态,标记是否删除,在几乎同时执行两条下面的语句的时候,发现在ES 中出现表即使被创建了还是无法被查询到的情况,针对该

[Elasticsearch] ES更新问题踩坑记录

问题描述

我们有个系统设计的时候针对Hive创建表、删除表, 需要更新ES中的一个状态,标记是否删除,在几乎同时执行两条下面的语句的时候,发现在ES 中出现表即使被创建了还是无法被查询到的情况,针对该问题记录下排查分析过程.

drop table if exists tmp.test_create_table;
create table if not exists tmp.test_create_table(
id int,
name string
) stored as parquet;

问题排查

查看ES数据

发现ES创建表的状态没有正常更新 yn 还是0

查看日志

查看日志, 截取部分关键信息:

ReceiverController] [4eb1c8fd7b6987ae] - 接收的hive元数据为:{"data":  ...
"eventType":"DROP_TABLE" ...

ReceiverController] [d1aa226b8739d352] - 接收的hive元数据为:{"data": ...
"eventType":"CREATE_TABLE" ...

[Kafka-Consume-Thread-bigdata_aa-0]  [ec812addb0bf424d] - update table data to es: ... "yn":0}

[Kafka-Consume-Thread-bigdata_aa-0] [3085b7329053aaac] - update table data to es:  ... "yn":1}

日志里有几个关键线索:

  1. 建表与删除表的Hive元数据信息正常上报上来了

  2. 建表删表事件都执行了更新数据到ES的操作, [Kafka-Consume-Thread-bigdata_aa-0] 可以看出是单线程更新ES, 所以不会存在多线程并发的问题

  3. 基本可以定位是在es更新这块出问题了

看对应代码

final TableDocBean docBean = baseSearchService.getById(id);
setValueForBean(afterColumns, docBean);

log.info("update table data to es: {}", JSON.toJSONString(docBean));
baseSearchService.update(docBean);

代码先通过表id 获取对应ES文档,然后赋值 执行更新数据操作

这块没有看出什么问题,考虑到两个事件同时执行时间间隔较短,采用了在代码里Thread.sleep(1000) 睡眠下试试,发现两条SQL语句同时执行的基本每次都成功,可以在ES搜索到.

这种操作不免让人觉得ES里执行更新操作,肯定是有延迟的,具体为什么延迟,就需要看下ES的更新原理

更新原理

image

ES更新请求先将index-buffer中文档(document)解析完成的segment写到filesystem cache之中,这样避免了比较损耗性能io操作,又可以使document可以被搜索 , 从index-buffer中取数据到filesystem cache中的过程叫做refresh。es默认的refresh间隔时间是1s

ES数据在更新的时候并不是在原来的数据上做修改的, 而是找到该数据的索引Id,把原来的数据删掉,再重新插入一条,但索引id是相同的

当删除、更新两个操作间隔很短时间执行,上一个数据还没有refresh 到 FileSystem Cache区域,就无法查询,final TableDocBean docBean = baseSearchService.getById(id);
获取不到数据,所以会导致数据更新失败

解决方案

修改ES refresh到cache区域间隔时间:

curl -XPUT  http://ip:9200/meta_es_data/_settings?pretty -d "
 { 
     "refresh_interval" : "500ms"
     
 }"

在每次更新操作后,休眠1s:

baseSearchService.update(docBean);

Thread.sleep(1000);

ES 请求接口有请求后强制刷新方法,但是一般用于测试,不建议线上用

setRefreshPolicy(WriteRequest.RefreshPolicy.IMMEDIATE);

总结

  1. 不要忽视一个看起来貌似是一个小的问题,其背后有一定的设计、原理在里面
  2. 代码关键处加一些有意义且清晰的日志是非常必要的, 可以提高解决问题的效率
  3. 排查问题就像破案,要有耐心找到一个个关键线索,最终破案. 现实工作中解决问题的能力非常重要
本文作者: chaplinthink, 关注领域:大数据、基础架构、系统设计, 一个热爱学习、分享的大数据工程师

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
转载请注明出处: https://daima100.com/5865.html

(0)
上一篇 2023-04-22
下一篇 2023-04-22

相关推荐

  • 基于Python实现邮件发送功能

    基于Python实现邮件发送功能在信息时代,电子邮件已成为人们日常生活、工作中不可或缺的一部分,随着网络通讯日益方便和普及,几乎每个人都有自己的邮箱。因此,邮件发送功能是我们在开发项目中经常会用到的。Python作为一款广泛应用于开发领域的编程语言,自然而然也拥有了在Python环境下实现邮件发送功能的方式和方法。

    2023-12-27
    120
  • 合并小文件参数_bcompare文件比较

    合并小文件参数_bcompare文件比较基于iceberg的master分支的9b6b5e0d2(2022-2-9)。 参数说明 1、PARTIAL_PROGRESS_ENABLED(partial-progress.enabled) 默认

    2023-05-07
    157
  • python自动上传文件到网页(python怎么上传文件)

    python自动上传文件到网页(python怎么上传文件)做的是web开发吗?可以用框架来解决这个问题,推荐使用Django框架,灵活强大,特别适合做新闻、博客类网站。用Python上传文件,要用到中间件,找一个适合你用的中间件,通过这个中间件上传,如果是自己写的话会很麻烦。存入数据库的不应该是文件而应该是文件的路径,存入了多少条数据这个就比较好实现了,用一个计数变量,保存一条就增加1,最后返回这个变量就可以了。

    2023-11-26
    108
  • hadoop 多次格式化format namenode 导致节点不能启动解决[亲测有效]

    hadoop 多次格式化format namenode 导致节点不能启动解决[亲测有效]链接:https://blog.csdn.net/qq_41059374/article/details/80695581?depth_1-utm_source=distribute.pc_relev

    2023-02-13
    151
  • 关于学习在python中使用进度条的信息

    关于学习在python中使用进度条的信息首先要明白一点进度条都属于图形界面,需要选择图形界面的模块,我自己学的tkinter,pygame,pyqt5

    2023-10-25
    112
  • 工作流加签是什么意思_流程团队

    工作流加签是什么意思_流程团队工作流引擎会签, 概要说明 关键字: ccflow 工作流引擎 会签,加签,主持人,多人处理规则 会签定义:会签就是多人在一个节点上表达意见,每个人只能在一个节点上填写一个意见。 我们提供两种模式的…

    2023-04-12
    155
  • Python编程课程:提升您的编程技能

    Python编程课程:提升您的编程技能Python是一种流行的开源编程语言,它可以轻松解决各种应用场景,例如自动化、数据处理、机器学习和Web开发等。如果您想要学习Python,或者想要提高您的Python编程技能,那么Python编程课程可能是一个不错的选择。在这些课程中,您将学习基本的Python语法、核心概念和高级技术。现在就来了解一下Python编程课程吧!

    2023-12-19
    120
  • mongodb使用_遍历列表中的元素,作为变量,循环修改mongodb中的字段「建议收藏」

    mongodb使用_遍历列表中的元素,作为变量,循环修改mongodb中的字段「建议收藏」一、问题描述: 需要将工作界面上的一些已经离职的用户状态改为失效,并备注为离职 二、需要准备/拿到手的工具/条件/数据: 1.已离职人员名单(excel格式) 2.任意mongodb工具(笔者使用的是

    2022-12-22
    141

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注