一、前文提要
通过之前五篇文章,分别介绍了决策引擎的主要功能:基于规则流程的规则集、决策流、决策树、决策表、决策矩阵等,以及基于风控模型的模型引擎和评分卡模型等功能。
今天就决策引擎的输出结果,以及对结果的展示、监控、应用等方面进一步探讨。
二、完整决策流
通过之前章节,决策引擎执行结果,可以输出通过或拒绝结果,决策流执行路径,如命中某个规则集,命中某条规则,触发某个条件分支,执行模型得分,以及风险评级、额度等,这些都作为决策引擎数据输出结果。
三、风控结果数据分析监控
决策引擎输出了风控结果,如何保障输出结果的准确性?如果风控分析师 “ 配置错了 ” 如何能及时发现?如果风控策略被黑产突破了如何及时补救?也就是风控系统的 “ 风控 ” 如何做?
如果能分渠道,分场景实时对风控通过率,规则触发率,模型触发率,特征缺失率等指标进行统计计算,那么就可以分析趋势或者设置阈值监控报警。
一般来说使用传统 Mysql
数据库即可轻松实现,将每次引擎结果数据和过程数据详情保存入库,然后再写个定时任务去查询分析结果,比如要查看每分钟的风控通过率(风控通过率 = 风控通过数 / 总风控数),使用 SQL
查询按时间和决策流(一个决策流代表一个决策场景)做数据聚合。
#获取每分钟通过数据
SELECT scene_key,DATE_FORMAT(create_time, '%Y-%m-%d %H:%i:00') AS time,
COUNT(*) AS num
FROM risk_result
WHERE scene_key = 'credit' AND result = 'pass'
GROUP BY time
ORDER BY time;
#获取每分钟总数
SELECT scene_key,DATE_FORMAT(create_time, '%Y-%m-%d %H:%i:00') AS time,
COUNT(*) AS num
FROM risk_result
WHERE scene_key = 'credit'
GROUP BY time
ORDER BY time;
其原理是依赖 Mysql
数据 SQL
执行使用 DATE_FORMAT
和 GROUP
来做时间的切分和数据的聚合。随着数据量增大,如每分钟几万数据,靠每分钟执行脚本的方式不够优雅,面对大量数据性能较差,周期性的查询对数据库也有压力。
对 30
天甚至更长时间这种场景可以将数据导入离线 hive
库,进行离线计算分析,离线数据分析一般是 T+1
(依赖 ETL
导入离线库的时间),有较长的延时,适用于做离线回溯,但对实时监控就比较困难了,对监控来说,数据分析结果越实时越好,毕竟金融风控中一分钟可能就放款几万乃至几百万,能实时监控发现问题,及时止损,才能保障风控更健壮。
那么有没有办法做到更优雅、更实时分析计算呢?这里引入 Flink
项目。
四、引入 Fink
Flink 介绍
Flink 是 Apache 的一个顶级开源项目,是一个流式计算引擎,要搞懂 Flink 先来看看什么是流式计算?
大数据的计算模式主要分为批量计算 ( batch computing
)、流式计算(stream computing
)、图计算(graph computing
)、交互计算(interactive computing
)。图计算和交互计算这里不展开讨论,主要说下批量计算和流式计算。
-
批量计算是收集数据入库,然后对一批数据批量处理的计算方式。其特点是要计算的数据已固定,是“静态数据”,所以它一批次只计算一次。
-
流式计算则是对数据流进行计算,是实时计算。数据流数据特点是数据源源不断,没有边界,是“动态数据”,所以它将会不停的计算。
那么对比来看,在时效上,流式计算更实时,低延时;在数据上,流式计算是数据流,批量计算是静态数据;流式计算是先计算再存储(保存计算结果),批量计算是先存储再计算。
不同的特性也意味着不同的应用场景,流式计算在时效性高的实时场景有更好的应用,事件驱动型应用、实时数据分析应用,如业务流程监控、实时推荐系统等。
Flink 特性及工作原理
Flink 算是目前最火流式计算引擎,相比于之前的 Storm、Spark Streaming
而言,其具有如下显著优势:
-
支持集高吞吐、低延时、高性能三大特性于一身;
-
支持多种时间概念,系统处理时间(process Time)、事件时间(event time),有效解决流传输乱序问题;
-
支持灵活的窗口操作,滚动窗口、滑动窗口、Session窗口等;
-
支持有状态计算,可以将 n 天的中间结果数据都保存到内存和文件系统;
-
真正的流处理框架,支持原生流,支持批流一体,批作为特殊的流处理,Spark Streaming 正好相反,通过微批来做到“流计算”;
-
良好的容错能力,基于分布式快照技术的 Checkpoints ;
-
…
Flink 各种优点说了一大堆,那么其实现原理如何?先看下 Flink 的基本架构:
Flink 架构
主要包括:Client , JobManager , TaskManager
几部分,Client
负责提交任务,JobManager
负责任务调度及资源管理,TaskManager
负责具体执行任务。
Flink
部署时,支持 on YARN
调度以及最新云原生 on K8s
调度,结合公司大数据服务一般使用 on YARN
管理。
Flink
部署完成了,我们就可以编写任务代码,通过 Flink
提供的后台进行任务提交及查看执行结果。
Flink 编程应用
Flink
开发支持Java
和Scala
语言,并提供不同层级的抽象接口和丰富的算子,满足各种开发需求。
通过将数据决策引擎的结果数据发送到 Kafka
,在Flink
订阅相应 Topic ( Source )
,再进行数据加工计算 ( Transformation Operators )
,最后结果指标存储到Mysql / ES
等介质,供查询分析使用。
-
Source:数据源,可以基于文件、socket、Kafka 等;
-
Transformation:数据转换操作,Map / FlatMap / Filter / KeyBy / Reduce
-
Aggregations / Window / Union 等;
-
Sink:接收落地,可以写入文件、存储到数据库或发送到下一个队列中。
以风控通过率场景为例,将 risk_result
数据流(DataStream
)转换为动态表,在动态表上定义持续查询,使用 Flink
支持的 SQL
语法,通过使用滚动时间窗口 (TUMBLE
)函数,采用 event time
事件时间 (这里对应 create_time
),每分钟聚合一次,TUMBLE(create_time, INTERVAL '1' MINUTE)
,对时间做 GROUP BY
聚合,算出每分钟的通过数及每分钟总数,最后将持续查询的实时结果转为动态表,进一步转为 DataStream
发送到下游存储介质中。
具体 SQL 如下:
SELECT TUMBLE_START(create_time, INTERVAL '1' MINUTE) AS start_time,
TUMBLE_END(create_time, INTERVAL '1' MINUTE) AS end_time,
scene_key,
COUNT(id) AS num,
COUNT(CASE WHEN result = 'pass' THEN id ELSE NULL END) AS pass_num,
FROM risk_result
WHERE scene_key = 'credit'
GROUP BY TUMBLE(create_time, INTERVAL '1' MINUTE);
可视化监控大盘
有了监控数据,可以通过可视化方式将结果应用起来,比如做成折线图、柱状图,可以加入同比(昨天相同时段),环比(上一个时段)做对比分析。
监控报警
可视化大盘可以作为风控分析师的分析工具使用,但它仍需借助人力主动分析,并不能及时对风险预警,那么可以采用阈值监控报警,如高峰时段连续10分钟通过率为 0 , 或通过率高于上一时段 10 倍就触发报警,可以通过短信、企业微信或电话不同级别报警,来保障风控的健壮性。
五、更多思考
聚合粒度
这里使用Flink
完成“原子粒度”的聚合,1
分钟作为一个原子,如果要看 10
分钟、15
分钟数据,只要把结果数据再做一次聚合即可。这样可以避免因调整聚合窗口时间,导致监控服务重启不可用。
滚动时间窗口与滑动时间窗口
滚动窗口如下:
滑动窗口如下:
根据上图很容看出二者的区别,这里是监控每隔 1
分钟的情况,所以选择使用滚动窗口。
更多监控指标
除了风控通过率
指标外,决策流执行过程数据也非常重要,规则命中率
,可以及时发现某个规则失效,命中率持续 n 长时间一直为 0,分析可能被黑产攻破,及时调整阈值,帮助风控分析师更及时发现规则失效或规则漏洞。
特征缺失率
,可能因程序上线 bug 导致,或某个三方数据源失效或发生偏移引起的特征缺失,可以通过 Flink 查询记录下来。
离线数据分析
决策引擎执行过程中,除了用到的特征指标数据外,还包括来自用户信息、设备信息、订单信息及三方数据源征信数据等大量原始数据,这种一般也会以快照记录下来,并会落到离线库,用于做离线回溯以及机器学习建模样本特征数据。
Flink其他应用
FlinkML
Flink 的 “ 野心 ” 不止于做流式计算引擎,在大数据分析和 AI 建模方向也有其尝试与探索,FlinkML 支持多种算法,并开始兼容 scikit-learn 库,tensorflow 库,应用于实时建模领域。
实时特征
对于风控使用的 “ 全局计数器 ” 类特征指标,如某 IP 最近 1 小时登录注册数,基于 Flink 的状态计算,可以轻松处理此类特征。
对于流水数据聚合统计指标,可以借助 Flink 去关系型数据库依赖,减少对生产环境的影响。
参考链接:
Flink 官网 https://flink.apache.org/
原文地址:https://mp.weixin.qq.com/s?__biz=MzIyMzMxNjYwNw==&mid=2247483882&idx=1&sn=cb1142ea342b03f2f4ada44383e4bcbe&chksm=e8215efadf56d7ecae2159b7f742678d6036e6df046513ccce0efb052029d13b4c7b67ae1bc6&cur_album_id=2282168918070968323&scene=189#wechat_redirect