问题描述

我们有个系统设计的时候针对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的更新原理

更新原理

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. 排查问题就像破案,要有耐心找到一个个关键线索,最终破案. 现实工作中解决问题的能力非常重要

[Elasticsearch] ES更新问题踩坑记录的更多相关文章

  1. CentOS7.4安装MySQL踩坑记录

    CentOS7.4安装MySQL踩坑记录 time: 2018.3.19 CentOS7.4安装MySQL时网上的文档虽然多但是不靠谱的也多, 可能因为版本与时间的问题, 所以记录下自己踩坑的过程, ...

  2. ubuntu 下安装docker 踩坑记录

    ubuntu 下安装docker 踩坑记录 # Setp : 移除旧版本Docker sudo apt-get remove docker docker-engine docker.io # Step ...

  3. 你真的了解字典(Dictionary)吗? C# Memory Cache 踩坑记录 .net 泛型 结构化CSS设计思维 WinForm POST上传与后台接收 高效实用的.NET开源项目 .net 笔试面试总结(3) .net 笔试面试总结(2) 依赖注入 C# RSA 加密 C#与Java AES 加密解密

    你真的了解字典(Dictionary)吗?   从一道亲身经历的面试题说起 半年前,我参加我现在所在公司的面试,面试官给了一道题,说有一个Y形的链表,知道起始节点,找出交叉节点.为了便于描述,我把上面 ...

  4. ABP框架踩坑记录

    ABP框架踩坑记录 ASP.NET Boilerplate是一个专用于现代Web应用程序的通用应用程序框架. 它使用了你已经熟悉的工具,并根据它们实现最佳实践. 文章目录 使用MySQL 配置User ...

  5. python发布包到pypi的踩坑记录

    前言 突然想玩玩python了^_^ 这篇博文记录了我打算发布包到pypi的踩坑经历.python更新太快了,甚至连这种发布上传机制都在不断的更新,这导致网上的一些关于python发布上传到pypi的 ...

  6. manjaro xfce 18.0 踩坑记录

    manjaro xfce 18.0 踩坑记录 1 简介1.1 Manjaro Linux1.2 开发桌面环境2 自动打开 NumLock3 系统快照3.1 安装timeshift3.2 使用times ...

  7. QT踩坑记录1-Q_OBJECT编译问题

    QT踩坑记录1-Q_OBJECT编译问题 QTC++Bugs 错误输出 Q_OBJECT 宏错误的地方会编译出现这样的错误, 无法找到.... 由于自己不想再看到这个错误, 此处 复制自 参考连接1, ...

  8. Spark Ignite踩坑记录

    Ignite spark 踩坑记录 简述 ignite访问数据有两种模式: Thin Jdbc模式: Jdbc 模式和Ignite client模式: shell客户端输出问题,不能输出全列: 针对上 ...

  9. unionId突然不能获取的踩坑记录

    昨天(2016-2-2日),突然发现系统的一个微信接口使用不了了.后来经查发现,是在网页授权获取用户基本信息的时候,unionid获取失败导致的. 在网页授权获取用户基本信息的介绍中(http://m ...

随机推荐

  1. 如何区别php,jsp,asp,aspx随笔

    PHP是一种跨平台的服务器端的嵌入式脚本语言.它大量地借用C.Java 和 Perl 语言的语法,并耦合PHP自己的特性,使WEB开发者能够快速地写出动态产生页面.它支持目前绝大多数数据库.还有一点, ...

  2. 字节跳动、快手等大厂Android面试刨根问底之内存泄露篇

    现在快手字节跳动等公司都在大量招人,薪资优厚,但是想进去却没那么简单,面过的人都知道,这些公司的面试官巴不得把你会的东西都给你挖出来,所以要深入复习知识点,让自己耐问一点.一下是针对内存泄露真实面试过 ...

  3. [C++]-string类的常用操作

    代码 #include<iostream> #include<string> #include<algorithm> using namespace std; in ...

  4. [TensorFlow2.0]-Fashion-MNIST本地数据集及fit_generator()的使用

    本人人工智能初学者,现在在学习TensorFlow2.0,对一些学习内容做一下笔记.笔记中,有些内容理解可能较为肤浅.有偏差等,各位在阅读时如有发现问题,请评论或者邮箱(右侧边栏有邮箱地址)提醒. 若 ...

  5. Docker部署ELK之部署logstash7.6.0(4)

    前言: logstash 和filebeat都具有日志收集功能,filebeat更轻量,占用资源更少,但logstash 具有filter功能,能过滤分析日志.一般结构都是filebeat采集日志,然 ...

  6. anaconda的报错:Anaconda:There is an instance of anaconda navigator already running error

    anaconda的报错:Anaconda:There is an instance of anaconda navigator already running error 出现这个问题的时候人蒙了,主 ...

  7. Apache/Nginx/IIS日志记录的各个字段内容与含义

    一.Apache 1.1 Apache日志文件名称及路径介绍 当我们安装并启动Apache后,Apache会自动生成两个日志文件,这两个日志文件分别是访问日志access_log(在Windows上是 ...

  8. STM32—位带操作

    STM32中的位带操作: 名字为位带操作,实际上是对位的操作,位操作就是可以单独的对一个比特位读和写,这个在 51 单片机中非常常见. 51 单片机中通过关键字 sbit 来实现位定义, STM32 ...

  9. centos7.5 安装jdk环境

    最新下载地址 历史下载地址 [root@manage ~]# mkdir /application/ [root@manage ~]# tar -xf jdk-8u112-linux-x64.gz - ...

  10. Ubuntu完全卸载Docker步骤

    Ubuntu完全卸载Docker步骤:https://www.jianshu.com/p/c03044dbeaaf