首页 文章 精选 留言 我的

精选列表

搜索[SQL工作台],共10000篇文章
优秀的个人博客,低调大师

基于flink sql构建报警系统的若干技术点

1)选择滑动窗口 滑动窗口会导致一个时间点的数据会分布到多个window里来,其它跟滚动窗口没区别 2)滑动数据重新汇聚 计算源是单个时间窗口内预汇聚的数据,不适用于滑动窗口的计算值,比如前面单个窗口计算出来p90,那么滑动窗口的p90怎么算? 需要把前面的时间窗口的现场保留下来传到当前滑动窗口内才可以继续计算,具体代码如下: //拿到原始数据后,重新计算 @SuppressWarnings("unchecked") public void accumulate(Object value) { if (null == value) { return; } HashMap<String, Object> mapVal = (HashMap<String, Object>) value; //1)在历史值和当前值中设置新的max值 Object maxObj = mapVal.get("max"); Object minObj = mapVal.get("min"); Object countObj = mapVal.get("count"); Object sumObj = mapVal.get("sum"); Object afObj = mapVal.get("af"); Object ccObj = mapVal.get("cc"); if (null == maxObj || null == minObj || null == countObj || null == sumObj || null == afObj || null == ccObj) { return; } if (false == (ccObj instanceof JSONArray)) { return; } JSONArray jsonArray = (JSONArray) ccObj; int jsonSize = jsonArray.size(); if (0 == jsonSize) { return; } this.max = Math.max(this.max, ((Number) maxObj).doubleValue()); this.min = Math.min(this.min, ((Number) minObj).doubleValue()); this.count += ((Number) countObj).intValue(); this.sum += ((Number) sumObj).doubleValue(); //每次都是直接替换 this.augmentFactor = ((Number) afObj).intValue(); //5)开始汇总以便后面计算各种95线之类的值 Integer[] intArray = new Integer[jsonSize]; intArray = jsonArray.toArray(intArray); for (int index = 0; index < jsonSize; index++) { countContainer[index] += intArray[index]; } //6)over } 3)海量tag的发现 如果上传的metric tag数据非常多,怎么去重是个问题,我采取的方案是 3.1)使用采样率 @Override public void filter(String metric, TreeMap<String, String> tagValues, boolean tagValuesEmpty) { Random randomGenerator = RANDOM_THREAD_LOCAL.get(); if (0 == randomGenerator.nextInt(20)) { //取5%的采样率 ReportQueue.put(ReportQueue.METRIC_TAG, new MetricAndTags(metric, tagValues, tagValuesEmpty)); //结束 } else { } } 3.2)布隆过滤器判重 //普通数据-bloom filter private static Integer SIZE = 100 * 1000 * 1000; private static Integer BITS = 20; private static Integer HASH_FUNCTION = 1; private static BloomFilter DATA_BLOOM_FILTER = new BloomFilter(SIZE, BITS, HASH_FUNCTION); //哈希code-bloom filter private static BloomFilter HASHCODE_BLOOM_FILTER = new BloomFilter(SIZE, BITS, HASH_FUNCTION); public static synchronized boolean isNewKey(String data) { Key dataKey = new Key(data.getBytes()); if (false == DATA_BLOOM_FILTER.membershipTest(dataKey)) { //不存在就是真的不存在 return true; } //再做hashcode的2次判断 if (false == HASHCODE_BLOOM_FILTER.membershipTest(hashCodeKey(data))) { //不存在就是真的不存在 return true; } //(如果2次都说存在,也没办法了,这条数据丢弃) //返回false表示不是new key return false; } 3.3)元数据幂等性保存到es 注意幂等性,之前存在的数据会被更新,而不是新增一条数据,因为我们是保存元数据 具体就是设置请求体里的upsert为true @Data public class ExecutionMetricTagValue { private Boolean doc_as_upsert=true; private EsMetricTagValue doc; } 3.4)限流防对远程ES的流量冲击 这个是构建一个Guava对象 private static final RateLimiter RATE_LIMITER = RateLimiter.create(500); //在JVM级别限流,防止对ES产生冲击 RATE_LIMITER.acquire(1); 4)用户配置数据拉取 用户配置的一些规则,通过另外一个JVM级别的线程拉取到本地内存,这样就可以不影响flink的计算速度 5)报警屏蔽周期 这是为了防止报警洪灾,实现思路 String res; try { SetParams setParams = new SetParams(); setParams.nx(); setParams.ex(alarmInterval); //仅仅是当前timeSpan内有效,10s不影响30s 1m这种 res = JEDIS_CLUSTER.set(timeSpan + "_hubble_alarm_" + fullKey, "1", setParams); } catch (Exception e) { LOG.error(e.toString()); return; } if (null != res) { //LOG.info("初次插入,可以报警"); 主要就是这些,很难的点没有,就是要注意各个细节 ---------------------------------------------------------------------------------------------------------- 其实我觉得报警系统的精髓在于阈值的设置上,傻乎乎的设置静态值是没有技术含量的,整个报警系统的精髓就在于自动设置报警阈值 所以接下来我会去研究这方面的技术,如果研究出来了我会发文章出来! ---------------------------------------------------------------------------------------------------------- 下面放界面图

优秀的个人博客,低调大师

SQL 中 关于Left Join 转为 Inner Join 的问题

结论 从下面的测试结果很容易看出,左关联的查询语句中,只要有 WHERE 的过滤条件,那么该语句将被转为内关联。 一、创建表 演示使用,随便创建两张表 --班级表 CREATE TABLE T_CLASS( class_id NUMBER not null, class_name VARCHAR2(100) ) --学生表 CREATE TABLE T_STUDENT( student_id NUMBER not null, class_id NUMBER not null, student_name VARCHAR2(100), age NUMBER, sex CHAR(1) ) 二、创建数据 --班级数据 insert into T_CLASS (CLASS_ID, CLASS_NAME) values (1

优秀的个人博客,低调大师

去IOE 遇到Jdbc mysql sql_mode的坑

在去IOE(IBM的小型机+Oracle的数据库+EMC的高端存储)的过程中遇到一个Oracle的建表语句(转换处理过后)具体语句如下: 通过Java的Jdbc执行后报错:BLOB/TEXT column 'FEXPRESSION' can't have a default value,42000,1101。也就是LONGTEXT类型的字段FEXPRESSION不能有默认值。 可是把这个建表语句拿到Mysql的客户端Navicat里去执行的时候居然创建成功了。这就奇怪了相同的建表语句通过Navicat执行的时候是成功的,但是通过Java Jdbc执行却不成功。 然后又把这个建表语句拿到Mysql服务器上去执行也是成功的,那也就是说是Jdbc的问题了。于是查找了下资料发现BLOB/TEXT column 'FEXPRESSION' can

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册