压制es-hadoop这头野兽的方式来了~

news/发布时间2024/5/18 14:57:13

背景

每天elasticsearch集群在上午某个时间段CPU几乎打满,此时访问elasticsearch的服务rt会跟着抖动,通过排查发现是由于这个时间段会有数据通过hive任务写到elasticsearch,这个hive任务使用的是ES-Hadoop插件做的数据导入,整个问题的罪魁祸首已经发现了,那么应该怎么去解决呢?

优化方案一

ES-Hadoop组件已经发展多年,按道理说已经很成熟了,一般出现这种问题大概率都是使用不当的缘故,因此通过查看 官网配置 来查看是否使用不当,通过一番查看下来大致看到两个比较相关的配置

es.batch.size.entries: 控制每批写到Elasticsearch的消息条数
es.batch.write.retry.wait:控制重试批次之间时间间隔

通过反复针对这两个参数调优后发现,基本没太大的收益,此时elasticsearch集群CPU的突刺仿佛一把利刃插进心脏一样,不甘心,一定要将它消灭,此时又参考了网上不少优秀的文章例如 https://cloud.tencent.com/developer/article/1612108 这位大佬写的,但是并没有解决我的问题,继续摸索下一个方案

优化方案二

ES-Hadoop配置方式行不通,那么换个思路,咱们是通过Hive来将数据写到elasticsearch集群的,那么如果咱们将Hive任务的并行度降低些行不行呢?想到这里不禁喜悦起来,感觉自己又行了

通过下面几个配置来控制Hive写elasticsearch的并行度

set hive.exec.reducers.max=20;
set tez.am.vertex.max-task-concurrency=20;
set hive.tez.auto.reducer.parallelism=false;

虽然已经大幅降低并行度了,但是elasticsearch的CPU还是高居不下,仿佛在说,你过来打我呀~
在这里插入图片描述

优化方案三

通过上面两个失败的方式后,通过思考🤔发现最大的问题是elasticsearch集群的处理能力赶不上处理的能力,那么如果限制elasticsearch的写速率呢,通过跟elasticsearch dba沟通发现不支持这种方式。那只能从写的任务进行下手了

通过查阅ES-Hadoop代码发现,代码写得还挺好的,封装都不错~

通过跟踪代码发现最关键的代码在 BulkProcessor类的add方法,如下

/*** Adds an entry to the bulk request, potentially flushing if the request reaches capacity.* @param payload the entire bulk entry in JSON format, including the header and payload.*/   
public void add(BytesRef payload) {// check space first// ba is the backing array for dataif (payload.length() > ba.available()) {if (autoFlush) {flush();}else {throw new EsHadoopIllegalStateException(String.format("Auto-flush disabled and bulk buffer full; disable manual flush or increase " +"capacity [current size %s]; bailing out", ba.capacity()));}}data.copyFrom(payload);dataEntries++;if (bufferEntriesThreshold > 0 && dataEntries >= bufferEntriesThreshold) {if (autoFlush) {flush();}else {// handle the corner case of manual flush that occurs only after the buffer is completely full (think size of 1)if (dataEntries > bufferEntriesThreshold) {throw new EsHadoopIllegalStateException(String.format("Auto-flush disabled and maximum number of entries surpassed; disable manual " +"flush or increase capacity [current size %s]; bailing out",bufferEntriesThreshold));}}}}

上面的逻辑也很清晰,就是要么数据写满本地容量或者数据写够配置的条数就触发一次发送。那么如果咱们能够控制两个批次之间间隔,是否就可以让elasticsearch集群“休息”一下,降低CPU从而正常的给其他业务提供服务呢?

纸上得来终觉浅,绝知此事要躬行。说干就干,以下是我的代码改动,供大家参考

    /*** 控制写入批次的间隔*/private void waitSomeTime() {int batchWaitTime  = settings.getBatchWaitTime();System.out.println("batchWaitTime is:" +batchWaitTime);if (batchWaitTime <= 0) return;try {System.out.println("start sleep!"+",time is :"+new Date()+", thread name is:"+Thread.currentThread().getName());Thread.sleep(batchWaitTime);System.out.println("end sleep!"+",time is :"+new Date()+", thread name is:"+Thread.currentThread().getName());} catch (Exception e) {e.printStackTrace();}}

Settings类

    public int getBatchWaitTime() {return Integer.valueOf(getProperty(ES_BATCH_WAIT_TIME, ES_BATCH_WAIT_TIME_DEFAULT));}

ConfigurationOptions接口

    /** Elasticsearch batch size given in bytes */String ES_BATCH_WAIT_TIME = "es.batch.wait.time";String ES_BATCH_WAIT_TIME_DEFAULT = "0";

最后在每写完一批数据后触发休息一下
在这里插入图片描述

改动完后,再结合以下配置执行任务

ES-Hadoop配置
'es.batch.size.bytes'='5mb'
'es.batch.size.entries'='2000',
'es.batch.wait.time'='2000',  //咱们自己新加的配置
'es.batch.write.refresh'='false',Hive参数调优
set hive.exec.reducers.max=20;
set tez.am.vertex.max-task-concurrency=20;
set hive.tez.auto.reducer.parallelism=false;

通过测试验证将CPU从几乎100%干到了20%~30%,算是圆满完成任务了,心中的石头也落了下来,终于可以睡个好觉了~
在这里插入图片描述

补充说明

除了上述的几种方式,还有一些可供参考的方案列在这里

  1. 使用elasticsearch-rest-client-xxx.jar,不过这是通过http写入的性能会差些
  2. 扩容elasticsearch集群(经费充足的话可以考虑)
  3. 对数据做列处理,就是在业务高峰期仅写必要的几列数据到elasticsearch集群(但可能CPU还是会高)

在解决完这个问题后,本来想给ES-Hadoop社区提这个issue并进行fix的。但是发现了已经有大佬反馈过这个问题了 https://github.com/elastic/elasticsearch-hadoop/pull/1405,但是由于社区的前辈们认为有其他更好的解决方式并没有merge相关的代码
在这里插入图片描述

总结

以上就是整个问题的解决过程,我也相信一定有更好,更优雅的解决方式,如果你恰好有好的想法也可以给ES-Hadoop社区提供;但无论黑猫还是白猫,能抓到老鼠的才是好猫,通过方案三快速的解决的问题并且稳定运行了一年,给公司节省下扩容集群的成本,这在我这个菜鸡看来已经够了。如果你也比较赶时间的话,可以考虑直接试下我的jar包,希望能对您有帮助。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.bcls.cn/qGkj/1580.shtml

如若内容造成侵权/违法违规/事实不符,请联系编程老四网进行投诉反馈email:xxxxxxxx@qq.com,一经查实,立即删除!

相关文章

C# redis 菜鸟级别 订阅与频道,发送消息

// 建立 Redis 连接 发送部分代码 using StackExchange.Redis; ConnectionMultiplexer redis ConnectionMultiplexer.Connect("127.0.0.1:6379,password123456"); // 获取发布者 ISubscriber publisher redis.GetSubscriber(); // 发布消息到指定频道 string c…

我的音乐伙伴:南卡、韶音、墨觉三款热门骨传导耳机体验分享

作为一个热爱运动的音乐爱好者。对我来说&#xff0c;没有什么能比在运动时配上心爱的歌曲更让人兴奋的了。不管是清晨的跑步&#xff0c;还是傍晚的散步&#xff0c;音乐总能激发我更多的能量。但是&#xff0c;找到既能陪伴我完成高强度训练&#xff0c;又不失音质的耳机&…

C++文件操作

文件操作 程序运行时产生的数据都属于临时数据&#xff0c;程序一旦运行结束都会被释放 通过文件可以将数据持久化 C中对文件操作需要包含头文件 < fstream > 文件类型分为两种&#xff1a; 文本文件 - 文件以文本的ASCII码形式存储在计算机中二进制文件 - 文件以文…

版本控制(Git)

Fork 本课程网站的仓库 将版本历史可视化并进行探索是谁最后修改了 README.md文件&#xff1f;&#xff08;提示&#xff1a;使用 git log 命令并添加合适的参数&#xff09;最后一次修改_config.yml 文件中 collections: 行时的提交信息是什么&#xff1f;&#xff08;提示&am…

探索 LRU 算法的缺陷与解决方案

LRU算法 Linux 的 Page Cache 和 MySQL 的 Buffer Pool 的大小是有限的&#xff0c;并不能无限的缓存数据&#xff0c;对于一些频繁访问的数据我们希望可以一直留在内存中&#xff0c;而一些很少访问的数据希望可以在某些时机可以淘汰掉&#xff0c;从而保证内存不会因为满了而…

逻辑回归为什么使用交叉熵而不用均方差?

逻辑回归为什么使用交叉熵而不用均方差&#xff1f;或者说逻辑回归的损失函数为什么不用最小二乘&#xff1f; 下面主要从两个角度进行阐述&#xff1a; 从逻辑回归的角度出发&#xff0c;逻辑回归的预测值是一个概率&#xff0c;而交叉熵又表示真实概率分布与预测概率分布的…

数据结构(4) 链表(链式存储)

链表&#xff08;链式存储&#xff09; 单链表定义基本操作的实现单链表的插入按位序插入指定节点的前插指定节点的后插 单链表的删除 小结 单链表 定义 顺序表优点:可随机存取&#xff0c;存储密度高&#xff0c;缺点:要求大片连续空间&#xff0c;改变容量不方便。 单链表优…

C++:C++入门基础

创作不易&#xff0c;感谢三连 &#xff01;&#xff01; 一、什么是C C语言是结构化和模块化的语言&#xff0c;适合处理较小规模的程序。对于复杂的问题&#xff0c;规模较大的程序&#xff0c;需要高度的抽象和建模时&#xff0c;C语言则不合适。为了解决软件危机&#xff…

云服务器ECS价格表出炉——阿里云

2024年阿里云服务器租用价格表更新&#xff0c;云服务器ECS经济型e实例2核2G、3M固定带宽99元一年、ECS u1实例2核4G、5M固定带宽、80G ESSD Entry盘优惠价格199元一年&#xff0c;轻量应用服务器2核2G3M带宽轻量服务器一年61元、2核4G4M带宽轻量服务器一年165元12个月、2核4G服…

内网安全-内网穿透

目录 内网渗透 Nc使用详解 Nc监听和探测 Nc传文件 termite内网穿透工具 ssh代理内网穿透 ssh配置socket代理 MSF多级网络穿透 内网渗透 Nc使用详解 Nc监听和探测 Nc传文件 termite内网穿透工具 1、termite 之前叫ew &#xff08;可以进行正向连接&#xff0c;可以…

【git 使用】使用 git rebase -i 修改任意的提交信息/合并多个提交

修改最近一次的提交信息的方法有很多&#xff0c;可以参考这篇文章&#xff0c;但是对于之前的提交信息进行修改只能使用 rebase。 修改提交信息 假设我们想修改下面这个提交信息&#xff0c;想把【登录】改成【退出登录】步骤如下 运行 git rebase -i head~3 打开了一个文本…

代码随想录算法训练营第57天 | 1143.最长公共子序列 + 1035.不相交的线 + 53.最大子序和(动态规划)

今日任务 1143.最长公共子序列 1035.不相交的线 53. 最大子序和 动态规划 1143.最长公共子序列 - Medium 题目链接&#xff1a;力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 给定两个字符串 text1 和 text2&#xff0c;返回这两个字符串的最长…

猫毛过敏不能养猫了吗?除猫毛好的宠物空气净化器品牌有哪些?

让我们来探讨一下如何让容易过敏的家庭成员和猫咪更好地相处。很多人喜欢猫咪&#xff0c;但与它们相处一段时间后&#xff0c;可能会出现鼻塞、喷嚏和眼泪不断的过敏症状。那么&#xff0c;为什么会过敏呢&#xff1f;这是因为猫的唾液中含有Fel d1蛋白质&#xff0c;当它们舔…

SNAT与DNAT公私网地址转换

前言 SNAT和DNAT是两种重要的网络地址转换技术&#xff0c;它们允许内部网络中的多个主机共享单个公共IP地址&#xff0c;或者将公共IP地址映射到内部网络中的特定主机。这些技术在构建企业级网络和互联网应用程序时非常重要&#xff0c;因为它们可以帮助保护内部网络安全&…

Opencv中的RNG-随机绘图

在OpenCV中&#xff0c;RNG是一个随机数生成器类&#xff0c;用于生成各种类型的随机数&#xff0c;包括均匀分布或高斯分布的整数和浮点数。RNG类的实例化时可以接受一个无符号整数作为种子值&#xff0c;这个种子值决定了随机数生成序列的起点&#xff0c;相同的种子值将产生…

炫酷3D按钮

一.预览 该样式有一种3D变换的高级感&#xff0c;大家可以合理利用这些样式到自己的按钮上 二.代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice…

Python爬虫之图形验证码的识别

爬虫专栏&#xff1a;http://t.csdnimg.cn/WfCSx 前言 目前&#xff0c;许多网站采取各种各样的措施来反爬虫&#xff0c;其中一个措施便是使用验证码。随着技术的发展&#xff0c;验证码的花样越来越多。验证码最初是几个数字组合的简单的图形验证码&#xff0c;后来加入了英…

【复现】Panalog大数据日志审计系统 RCE漏洞_51

目录 一.概述 二 .漏洞影响 三.漏洞复现 1. 漏洞一&#xff1a; 四.修复建议&#xff1a; 五. 搜索语法&#xff1a; 六.免责声明 一.概述 Panalog大数据日志审计系统定位于将大数据产品应用于高校、 公安、 政企、 医疗、 金融、 能源等行业之中&#xff0c;针对网络流…

【研究生复试】计算机软件工程人工智能研究生复试——资料整理(速记版)——JAVA

1、JAVA 2、计算机网络 3、计算机体系结构 4、数据库 5、计算机租场原理 6、软件工程 7、大数据 8、英文 自我介绍 1. Java 1. 和 equals的区别 比较基本数据类型是比较的值&#xff0c;引用数据类型是比较两个是不是同一个对象&#xff0c;也就是引用是否指向同 一个对象&…

luigi,一个好用的 Python 数据管道库!

🏷️个人主页:鼠鼠我捏,要死了捏的主页 🏷️付费专栏:Python专栏 🏷️个人学习笔记,若有缺误,欢迎评论区指正 前言 大家好,今天为大家分享一个超级厉害的 Python 库 - luigi。 Github地址:https://github.com/spotify/luigi 在大数据时代,处理海量数据已经成…
推荐文章