目的:为了解决kafka数据积压而造成的影响数据合并准确性问题

方式:用check1和check2两个脚本,check1只启动一个,做判断并给值,如果当前表有今天的ts说明可以合并昨天数据,则标志位设置为1,否则设置为0,如果满足条件的表到一定比例就可以大致确定没有积压,数据合并是没有问题的,则填入一个表名为all的表,此时所有表都可参与合并工作。check2有多少个ods表就启动多少个,查询check1所输出的表,判断是否执行ods合并,或等到一个表名为all的表,强制其开始合并。

  1. 建表语句

CREATE EXTERNAL TABLE tmp.check1 (tablename STRING,check1 INT,ctime STRING)
PARTITIONED BY (dt STRING)
STORED AS PARQUET;

说明:

每天一个分区,check1记录当天合并前每张表的最终状态值(是否有当天凌晨ts),为1或0,ctime记录合并前最后一次赋值入表时的时间

  1. 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重新写一次分区表

  1. 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积压相关推荐

  1. shell脚本启动kafka集群的多台节点

    [README] 由于集群有多台机器,启动kafka ,查看其状态,都需要每台机器去执行命令, 可以写个脚本基于ssh免密登录批量执行: [1]启动kafak (kk.sh) #!/bin/bash ...

  2. 【kafka专栏】使用shell脚本快速安装kafka集群(含视频)

    我们本节来正式安装kafka集群,安装kafka集群主要的方式有两种:一种是纯手动安装,一种是使用自动化shell脚本安装.纯手动安装的方式需要一台服务器.一台服务器的去操作,在服务器较多的情况下工作 ...

  3. 【kafka专栏】使用shell脚本快速搭建kafka单机版(含视频)

    本小节的目的不是搭建一个高可用的.生产的kafka集群,而是提供给大家一个快速搭建方式,讲解搭建一个kafka的单机版的过程,方便大家用于学习使用. 本文配套视频:https://www.bilibi ...

  4. 如何用shell脚本编译java工程

    欢迎支持笔者新作:<深入理解Kafka:核心设计与实践原理>和<RabbitMQ实战指南>,同时欢迎关注笔者的微信公众号:朱小厮的博客. 欢迎跳转到本文的原文链接:https: ...

  5. shell脚本中取消高亮显示_Linux中强大的top命令

    top命令算是最直观.好用的查看服务器负载的命令了.它实时动态刷新显示服务器状态信息,且可以通过交互式命令自定义显示内容,非常强大. 在终端中输入top,回车后会显示如下内容: 一.系统信息统计 前五 ...

  6. shell for循环命令行_24 道 shell 脚本面试题

    想要成为中高级phper, shell 脚本是需要掌握的,它有助于你在工作环境中自动完成很多任务. 如下是一些面试过程中,经常会遇到的 shell 脚本面试问题及解答: Q:1 Shell脚本是什么. ...

  7. shell脚本求和_常用的Shell脚本

    1.通过位置变量创建linux系统账户及密码 $1 是执行脚本的第一个参数,$2 是执行脚本的第二个参数 #!/bin/bash # Author: Peter zh # Blog: https:// ...

  8. (一)大数据学习之shell脚本

    一个菜鸡的学习.找工作的学习过程 自我学习使用 前言 一.熟悉常用的脚本语言(以shell作为学习展开) 1.1shell概述 1.2shell解析器 1.3shell脚本入门 1.4shell中的变 ...

  9. 基于Hadoop的电商广告点击数的分析与可视化(Shell脚本执行与大屏可视化设计)

    目录 摘要 大屏可视化预览 如何安装Hadoop集群 数据集介绍 项目部署流程 一键化配置环境和参数 一键化建立hive数据表 Flume配置及自动加载数据到hive中 数据分析 mysql接收数据表 ...

最新文章

  1. Beta冲刺随笔集合
  2. Exchange Server2010系列之十四:个人邮件存档
  3. Cloudflare的HTTP/2优化策略
  4. 关于windows图形编程 Hello2 程序的问题
  5. openwrt无盘服务器,搭建基于 OpenWrt/gPXE/iSCSI 的 Windows 无盘工作站
  6. 区块链入门与去中心化应用实战 之一 第3章 区块链技术核心原理实现
  7. python简单爬虫代码-Python爬虫――写出最简单的网页爬虫
  8. ​十大骨传导耳机品牌,骨传导耳机推荐跑步用
  9. z反变换计算机控制,计算机控制4.Z变换.ppt
  10. VOC数据集介绍及构建自己的VOC格式目标检测数据集
  11. 4G和3G到底有什么区别
  12. 闲赋在家的猿们、接下来怎么走?
  13. 常用财务指标计算公式(信贷指标公式)
  14. 以下数值中 不能用作C语言标识符,C语言题库及答案(选择题)
  15. python中match的六种用法,python 正则函数match()和search()用法示例
  16. Lamber表达式 List,Map,Set 互相转换
  17. 利用好 git bisect 这把利器,帮助你快速定位疑难 Bug
  18. 第一次谈兼职写书的经过
  19. 画论17 邓椿《画继》
  20. 这姐姐呀的人工智能实训1:机器人语料库数据集准备

热门文章

  1. tina -飞机大战6.0
  2. zsh+autojump
  3. 模块十:mask模块
  4. 安装Windows、Ubuntu双系统超简单实用教程
  5. 机场、油库、边防、电站都在用的调频无人机干扰设备---TFN MR61
  6. getattr,setattr,hasattr详解
  7. 子沐课堂——分析一波Python就业前景
  8. wordpress主题后台管理菜单制作教程
  9. Android 代码实现国内和国外的区分
  10. 本科计算机技术与应用知识点,有关计算机应用本科论文