用shell脚本自动监测Kafka积压
目的:为了解决kafka数据积压而造成的影响数据合并准确性问题
方式:用check1和check2两个脚本,check1只启动一个,做判断并给值,如果当前表有今天的ts说明可以合并昨天数据,则标志位设置为1,否则设置为0,如果满足条件的表到一定比例就可以大致确定没有积压,数据合并是没有问题的,则填入一个表名为all的表,此时所有表都可参与合并工作。check2有多少个ods表就启动多少个,查询check1所输出的表,判断是否执行ods合并,或等到一个表名为all的表,强制其开始合并。
建表语句
CREATE EXTERNAL TABLE tmp.check1 (tablename STRING,check1 INT,ctime STRING)
PARTITIONED BY (dt STRING)
STORED AS PARQUET;
说明:
每天一个分区,check1记录当天合并前每张表的最终状态值(是否有当天凌晨ts),为1或0,ctime记录合并前最后一次赋值入表时的时间
check1
#!/bin/bashvalue=0.8
time=03while ((1))
dohive -e "set mapreduce.map.memory.mb=512;set mapreduce.reduce.memory.mb=10240;set mapred.max.split.size=300000000;set mapred.min.split.size.per.node=300000000;set mapred.min.split.size.per.rack=300000000;set mapred.reduce.tasks=1;set hive.exec.dynamic.partition.mode=nonstrict;insert overwrite table tmp.check1 partition(dt) select \`table\`, if(from_unixtime(bigts, 'yyyy-MM-dd')=dt, 1, 0), from_unixtime(unix_timestamp()), current_date() dtfrom(select \`table\`, dt, max(cast(get_json_object(content,'$.ts') as bigint)) bigtsfrom ods_binlog.ods_binlog where dt = current_date() group by \`table\`,dt)t"QUAN=$(hive -S -e "select count(if(check1=1, 1, null))/count(*) from tmp.check1")if [[ `echo "${QUAN} > ${value}" | bc` -eq 1 || $(date "+%Y-%m-%d-%H") = $(date "+%Y-%m-%d")-${time} ]]thenhive -e"set mapreduce.map.memory.mb=512;set hive.exec.dynamic.partition.mode=nonstrict;insert into table tmp.check1 partition(dt) select 'ALL', 1, from_unixtime(unix_timestamp()), current_date() dt"exitfisleep 1m
done
说明:
1.value为全部开始合并的比例阈值,例如有十个表,九个表已经有ts为今天Binlog,则比例为0.9,若阈值为0.8,则剩余的一个表也开始合并,
该参数用来避免有些表变化小一直没有今天Binlog而陷入死等状态
2.time为等待的最大忍受限度,例如有十个表,七个表已经有ts为今天Binlog,则比例为0.7,达不到阈值0.8,假如time为凌晨三点,只要过了这个点,剩余的三个表也开始合并,
该参数用来避免哪天突发情况,阈值设置不合适导致的死等状态,是value的补充
补充:
1.QUAN=$(hive -S -e "sql语句")可以将hive-e产生的结果集返回给变量QUAN
2.table为分区名,但也为hive中的关键字,需要使用飘号引起来,但因为飘号也为shell中包起来命令的关键字,为避免冲突,飘号前使用反斜杠\`table\`
3.group by分组后,select中只能是分组字段或聚合函数,如果想要对max值在判断,应在外边嵌套一层
4.浮点数比较大小应该先通过管道符传给bc并用飘号引起来`echo "${QUAN} > ${value}" | bc`,返回结果为真则返回1,否则返回0,再和1做等值整型eq判断即可
5.shell中日期函数为date后面可接格式化类型date "+%Y-%m-%d-%H",加号写在外面效果一样,此时返回格式为年-月-日-时用$()引起来后可做变量的等值判断,后面可拼接其他字符串
6.如果if条件里有且或关系等,应该用[[ ]]双层中括号,while ((1))为死循环,sleep 1m为睡眠一分钟,每隔1m重新写一次分区表
check2
#!/bin/bashtablename=$1while ((1))
doQUAN=$(hive -S -e "select check1 from tmp.check1 where (tablename = 'ods_binlog_${tablename}_di' or tablename = 'ALL') and dt = current_date() ")for check in ${QUAN[*]}doif [ ${check} -eq 1 ]thenecho "退出"exitfidoneecho "下次循环"sleep 1m
done
说明:
tablename为脚本传入参数,因为内部有拼接前后缀,故只需要传入例如account_avatar_accountitems即可,就可以做该ods表是否开始合并的判断
补充:
tablename为脚本传入参数,因为内部有拼接前后缀,故只需要传入例如account_avatar_accountitems即可,就可以做该ods表是否开始合并的判断
补充:
1.因为我们的输出是双行单列的,故不牵扯取第几列的问题,如果多行多列又要取第二列,则QUAN=$(hive -S -e "sql语句" | cut -d' ' -f 2),意为每行都按制表符切分,取第二列,需要注意不能用\t,
由于sql输出的结果集不同列之间是制表符,而默认cut就是按照制表符切分的,所以此时-d参数可以省略
2.对于变量接受到结果集的遍历,应当使用for check in${QUAN[*]},类似于java的增强for循环,为什么要遍历所有,因为该表可能返回标志位为0,但ALL作为保底可能此时返回的是1,此时就会有0和1两个结果,我们不能盲目的只取第一个结果
[*]代表依次遍历结果集中所有行,[2]代表只遍历下标为2的行,不写方括号默认下标为0的行,forcheck in QUAN则会传入值"QUAN"给check
用shell脚本自动监测Kafka积压相关推荐
- shell脚本启动kafka集群的多台节点
[README] 由于集群有多台机器,启动kafka ,查看其状态,都需要每台机器去执行命令, 可以写个脚本基于ssh免密登录批量执行: [1]启动kafak (kk.sh) #!/bin/bash ...
- 【kafka专栏】使用shell脚本快速安装kafka集群(含视频)
我们本节来正式安装kafka集群,安装kafka集群主要的方式有两种:一种是纯手动安装,一种是使用自动化shell脚本安装.纯手动安装的方式需要一台服务器.一台服务器的去操作,在服务器较多的情况下工作 ...
- 【kafka专栏】使用shell脚本快速搭建kafka单机版(含视频)
本小节的目的不是搭建一个高可用的.生产的kafka集群,而是提供给大家一个快速搭建方式,讲解搭建一个kafka的单机版的过程,方便大家用于学习使用. 本文配套视频:https://www.bilibi ...
- 如何用shell脚本编译java工程
欢迎支持笔者新作:<深入理解Kafka:核心设计与实践原理>和<RabbitMQ实战指南>,同时欢迎关注笔者的微信公众号:朱小厮的博客. 欢迎跳转到本文的原文链接:https: ...
- shell脚本中取消高亮显示_Linux中强大的top命令
top命令算是最直观.好用的查看服务器负载的命令了.它实时动态刷新显示服务器状态信息,且可以通过交互式命令自定义显示内容,非常强大. 在终端中输入top,回车后会显示如下内容: 一.系统信息统计 前五 ...
- shell for循环命令行_24 道 shell 脚本面试题
想要成为中高级phper, shell 脚本是需要掌握的,它有助于你在工作环境中自动完成很多任务. 如下是一些面试过程中,经常会遇到的 shell 脚本面试问题及解答: Q:1 Shell脚本是什么. ...
- shell脚本求和_常用的Shell脚本
1.通过位置变量创建linux系统账户及密码 $1 是执行脚本的第一个参数,$2 是执行脚本的第二个参数 #!/bin/bash # Author: Peter zh # Blog: https:// ...
- (一)大数据学习之shell脚本
一个菜鸡的学习.找工作的学习过程 自我学习使用 前言 一.熟悉常用的脚本语言(以shell作为学习展开) 1.1shell概述 1.2shell解析器 1.3shell脚本入门 1.4shell中的变 ...
- 基于Hadoop的电商广告点击数的分析与可视化(Shell脚本执行与大屏可视化设计)
目录 摘要 大屏可视化预览 如何安装Hadoop集群 数据集介绍 项目部署流程 一键化配置环境和参数 一键化建立hive数据表 Flume配置及自动加载数据到hive中 数据分析 mysql接收数据表 ...
最新文章
- Beta冲刺随笔集合
- Exchange Server2010系列之十四:个人邮件存档
- Cloudflare的HTTP/2优化策略
- 关于windows图形编程 Hello2 程序的问题
- openwrt无盘服务器,搭建基于 OpenWrt/gPXE/iSCSI 的 Windows 无盘工作站
- 区块链入门与去中心化应用实战 之一 第3章 区块链技术核心原理实现
- python简单爬虫代码-Python爬虫――写出最简单的网页爬虫
- ​十大骨传导耳机品牌,骨传导耳机推荐跑步用
- z反变换计算机控制,计算机控制4.Z变换.ppt
- VOC数据集介绍及构建自己的VOC格式目标检测数据集
- 4G和3G到底有什么区别
- 闲赋在家的猿们、接下来怎么走?
- 常用财务指标计算公式(信贷指标公式)
- 以下数值中 不能用作C语言标识符,C语言题库及答案(选择题)
- python中match的六种用法,python 正则函数match()和search()用法示例
- Lamber表达式 List,Map,Set 互相转换
- 利用好 git bisect 这把利器,帮助你快速定位疑难 Bug
- 第一次谈兼职写书的经过
- 画论17 邓椿《画继》
- 这姐姐呀的人工智能实训1:机器人语料库数据集准备