玖叶教程网

前端编程开发入门

画像笔记23- 作业流程调度(3)(作业计划调度与现场管理分析)

接上面,看6.3章节:

6.3 数据监控预警

相比Hive,由于MySQL等关系型数据库对销量的数据读写速度较快,所以开发时考虑将数据的监控相关表维护在MySQL中,数据监控预警整体来看涵盖下面几个主要模块。

  • 标签监控预警:用于监控每个标签当日的ETL是否产生问题,当数据量超出正常范围时,发出报警邮件。
  • 服务层数据监控预警:数据从数据仓库走出提供到服务层时,该过程中是否正常进行,一般通过对比数据仓库(Hive)中各业务线的数量和各业务系统(如MySQL\Hbase\csv等)中对应的业务线的数量进行监控。

下面详细介绍这两类监控预警的表结构设计和应用场景。

6.3.1 标签监控预警:

标签监控预警主要用于保证每日用户标签加工的正常进行,当标签的数量或覆盖用户情况出现波动时会触发邮件报警,开发人员收到报警邮件后定位问题标签的原因并进行处理。

报警邮件的脚本扫描这张标签监控表当日数据,当标签当日的产出量与历史相比出现较大程度波动时,可触发告警提示,例如男性标签历史每天产出覆盖用户数量是100万,今天产出覆盖的用户是120万,可视为较大波动:

可设计如下的监控表,监控每天的标签产出情况:

Create TABLE `userlabel_monitordata`(
`id` int(11) NOT NULL AUTO_INCREMENT,
`labelid` varchar(45) NOT NULL,
`data_date` date NOT NULL,
`label_wave` float DEFAULT NULL
PRIMARY KEY(`id`)
)ENGINE=InnoDB

该监控表主要记录以下字段:

  • labelid:标签id
  • data_date:数据日期
  • label_num:该标签覆盖的用户量
  • label_wave:该标签今日产出量与历史相比的波动情况



服务层预警

该监控主要用于保证服务层数据的稳定性和准确性,在数据从数据仓库走向服务层时需要对其进行监控,否则应用到各业务系统中会影响用户的感知或体验。如,当推送到服务层的数据存在问题是,APP推送给用户的弹窗或发送给用户的短信 邮件等都会受到影响。

所以在将数据推送到服务层前,需要对其监控,当发现问题时,暂停推送到服务层,排查问题后再重新推送。

在设计服务层预警逻辑时,可开发一张监控表存储当日同步到服务层的数据量(service_count)与存储在Hive中的数据量(Hive_count),报警邮件的脚本扫描这张业务系统监控表当日数据,当数据存在较大的波动时,表明数据的同步可能出现了问题,此时触发邮件告警。

例如在广告业务系统的场景中,该系统通过Restful API方式读取Hbase中存储的数据,因此在做监控预警校验时,需要比对数据同步前Hive 中 该人群数量及数据同步后Hbase中存储的数据量。首先需要查询Hive和Hbase中对应的数据量,实例代码如下:

首先需要查询Hive 和Hbase中对应人群的数据量,示例代码如下(python):


注释:os.open

上面用os.open() 执行一个命令,并从返回值读取对象的数据,r.read()

参见:Python os.popen() 方法

https://www.runoob.com/python/os-popen.html

os.popen(command[, mode[, bufsize]])

参数

command -- 使用的命令。

mode -- 模式权限可以是 'r'(默认) 或 'w'。

bufsize -- 指明了文件需要的缓冲大小:0意味着无缓冲;1意味着行缓冲;

其它正值表示使用参数大小的缓冲(大概值,以字节为单位)。

负的bufsize意味着使用系统的默认值,一般来说,对于tty设备,它是行缓冲;

对于其它文件,它是全缓冲。如果没有改参数,使用系统的默认值。

返回值

返回一个文件描述符号为fd的打开的文件对象

注释2:source /etc/profile 的含义

source命令用法:

source FileName:作用:在当前bash环境下读取并执行FileName中的命令。

注:该命令通常用命令“.”来替代,如:source .bash_rc 与 . .bash_rc 是等效的。

注意:source命令与shell scripts的区别是:source在当前bash环境下执行命令,而scripts是启动一个子shell来执行命令。这样如果把设置环境变量(或alias等等)的命令写进scripts中,就只会影响子shell,无法改变当前的BASH,所以通过文件(命令列)设置环境变量时,要用source命令

/etc/profile:

是操作系统定制用户环境使用的第一个文件,此文件为系统的每个用户设置环境信息,当用户第一次登录时,该文件被执行。

注释3:shell 语句里面带;的含义:

";" 分号允许在一行上放多个命令。

注释4: hbase 命令:

下面命令是查询数据量:

bin/hbase org.apache.hadoop.hbase.mapreduce.RowCounter ’tablename’

通过yarn调度mr任务完成查行,速度较快。

注释5. 这里strip(),去除返回值字符串里空格。

参见这里:

https://www.runoob.com/python/att-string-strip.html

r.read().strip()[5:]

strip()方法语法:

str.strip([chars]);

参数

chars -- 移除字符串头尾指定的字符序列。

返回值

返回移除字符串头尾指定的字符生成的新字符串。

python里面[5:]的含义:

string[5:]

python 里面取5到最后一个元素。

python里string 操作:

https://www.runoob.com/w3cnote/python-string-index.html

1. 索引获取特定偏移的元素

字符串中第一个元素的偏移为 0

字符串中最后一个元素的偏移为-1

str[0] 获取第一个元素

str[-2] 获取倒数第二个元素

2. 分片提取相应部分数据

通常上边界不包括在提取字符串内

如果没有指定值,则分片的边界默认为0和序列的长度

str[1:3 ]获取从偏移为1的字符一直到偏移为3的字符串,不包括偏移为3的字符串 : "tr"

str[1:] 获取从偏移为1的字符一直到字符串的最后一个字符(包括最后一个字符): "tring"

str[:3] 获取从偏移为0的字符一直到偏移为3的字符串,不包括偏移为3的字符串 : "str"

str[:-1] 获取从偏移为0的字符一直到最后一个字符(不包括最后一个字符串): "strin"

str[:] 获取字符串从开始到结尾的所有元素 : "string"

str[-3:-1] 获取偏移为 -3 到偏移为 -1 的字符,不包括偏移为 -1 的字符 : "in"

str[-1:-3] 和 str[2:0] 获取的为空字符,系统不提示错误: ""

分片的时候还可以增加一个步长,str[::2] 输出的结果为: "srn"

将查询到的结果写入“service_monitor"这种服务层的监控表中,示例脚本如下:


下图是业务系统监控表,示例数据。


数据插入完成后,通过检查这种服务层监控表的Hive数据量和同步后服务层的数据量来判断同步数据是否正常,是否需要发送告警邮件。

6.4 ETL 异常排查

在画像标签每天ETL 调度的过程中,难免会遇到调度失败的情况。作业失败时,短时间(小时级别)来看对于圈人服务、BI透视分析来说暂停服务的影响还不算很大。

但对于线上实时推荐的业务来说就会带来用户体验较差,推荐准确性不足等关系到营收的重大影响。因此在调度失败时,快速定位作业失败的原因很关键。

1.资源池内存不足导致作业失败

这是最常见的失败原因。当集群资源竞争严重时,画像标签的ETL调度很有可能受到影响,关于该种原因的排查,只需要查看调度失败任务对应的执行日志文件即可。

在日志文件中搜索"error"关键词可快速定位到报错原因的位置。通常因内存不足而引起的作业失败,日志中会报出“java.lang.OutOfMemoryError”等错误类型。

2.上游数据ETL延迟导致标签加工失败

出现该错误的原因可通过标签数据监控预警邮件发现。标签数据监控预警会报出当日哪些标签的数据量下降幅度超过合理范围,针对数据量下降异常的标签查看该标签加工脚本以来的上游表包括哪些,进一步查看上游表的ETL完成时间是否在标签脚本ETL时间之前。

例如:计算用户历史购买金额的标签,是从上游的订单信息表中加工得来的。平时上游订单信息表的ETL完成时间在早上8:00计算用户历史购买总金额的标签的ETL时间在8:30,某日订单信息表在8:30 还未完成ETL作业,按照设定此时该标签已经开始了ETL任务,标签加工当然会失败。

如何定位是否为因上游数据ETL延迟而引起的失败,只需要判断画像标签的调度时间是否在上游数据当日ETL完成时间之后进行。例如,对于判断上游订单信息表dw.order_fact数据的当日ETL完成时间,可通过命令

"hadoop fs -ls hdfs://data/user/hive/warehouse/dw/order_fact/data=20190701"查看,其中

"hdfs://data/user/hive/warehouse/dw/order_fact"是订单信息表对应的HDFS文件位置,可通过HiveQL语句:“show create table dw.order_fact"查看。

注释6;

理解上面的意思是:hadoop 中hive 查看数据库所在位置,用show create table dw.order_fact. (查看建表语句)

表及视图建表语句查看

SHOW CREATE TABLE ([db_name.]table_name|view_name)

show create table recommend_data_view;

haddop fs -ls hdfs://

fs

用法:hadoop fs [GENERIC_OPTIONS] [COMMAND_OPTIONS]

运行一个常规的文件系统客户端。

各种命令选项可以参考HDFS Shell指南。

ls

使用方法:hadoop fs -ls <args>

如果是文件,则按照如下格式返回文件信息:

文件名 <副本数> 文件大小 修改日期 修改时间 权限 用户ID 组ID

如果是目录,则返回它直接子文件的一个列表,就像在Unix中一样。目录返回列表的信息如下:

目录名 <dir> 修改日期 修改时间 权限 用户ID 组ID

示例:

hadoop fs -ls /user/hadoop/file1 /user/hadoop/file2 hdfs://host:port/user/hadoop/dir1 /nonexistentfile

返回值:

成功返回0,失败返回-1。

hadoop fs -ls 文件的意思,查看这个文件的修改时间,修改时间就是ETL写入结束的时间。

发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言