Redis 缓存刷新策略 要保证最终一致性,其实使用 redis 的 ttl 即可,第一次修改后设置小点的 ttl,下次又会再更新,因为本身脏数据出现的机率就很小(尤其先更新数据库再删除缓存形式),多次更新最终肯定是正确的值。下面是使用 二次删除 + 异步延迟删除模式达到比较好的更新数据效果,同时和程序代码解耦;要考虑是先更新缓存、再更新数据库,还是先更新数据库、再更新缓存,是更新缓存还是删除缓存,这些情况很多会因为 2 个进程因为处理速度、网络速度问题导致脏数据的情况发生;使用 二次删除 + 异步延时删除策略。
构造器设计模式 在类中定义一个静态内部类,在这个静态内部类中定义和外部类一样的属性并提供返回内部类的一些列方法,通过这些方法给属性赋值,在内部类的构造函数中还可以同时赋属性的默认值,最后通过内部类的 build 方法将内部对象传递给外部类的私有构造方法来实例化外部类并返回给调用者;同时还可以在外部类中提供一个静态的 builder 方法,直接实例化一个内部的 Builder 类返回,这样使用时候就可以直接 build 了,不用再 new 外部类了;也可以在类上通过 lombok 的 @Builder 注解实现构造器模式;
FlinkCDC 使用 FlinkSQL 方式监控 MySQL 之前写过一篇使用 FlinkCDC 的 DataStream 方式监控 MySQL 表变化的文章这篇介绍下使用 FlinkCDC 的 FlinkSQL 方式监控表变化;
Redis 的发布/订阅模式 Redis 的发布/订阅模式较 Kafka 等简单很多;Redis 通过 Channal 实现发布-订阅,订阅者可以对频道进行订阅(不存在的频道将创建频道),发布者向频道发送的消息会自动推送到订阅者端,先发送的消息,后订阅的订阅者是收不到之前的消息的;
MySQL 的窗口函数 OVER ORDER BY 对 PARTITION BY 窗口中的数据进行排序,当 PARTITION BY 与 ORDER BY 列名不同时,聚合函数是根据排序进行逐个聚合计算的,当碰到 ORDER BY 相同的两个值时,同时计算两个值,并两行数据一致;2)当与 FROM 后面的 ORDER BY 字段不同时,FROM 子句的 ORDER BY 会覆盖 OVER() 中的 ORDER BY,FROM 子句中 ORDER BY 后值相同的才会按照 OVER() 子句中的 ORDER BY 排序;
Azkaban 内存不足报错 当然如果是生产环境,最好是找到占用内存的应用看看是不是可以停掉或者转移到其他服务器,或者扩大物理内存,这样可以从根本解决问题;关闭内存检查,在所有 azkaban-exec-server 节点修改配置文件并重启服务;我的 azkaban-exec-server 节点在 s3、s4、s5 三台服务器上;查看端口 12321 是否启动。
Sqoop从MySQL导出时间的时区问题 当使用 Sqoop 向 MySQL 导入数据时(MySQL 的 datetime 导入到 Hive 的 string),会出现时间导入后在 Hive 表中的时间晚于 MySQL 中显示的时间 8 小时,造成数据分析错误;
sqoop 从HDFS导出数据到MySQL8 当数仓运算完成后,需要导出结果到 MySQL 中时,报数据解析错误;经过一通检查发现 sqoop 语句写的并没有什么错误,分隔符也没问题,也都正常分割了,但就是往 MySQL 导入时报格式匹配错误;
hive 连接错误 在 hive 客户端执行命令报错报如下错误或者连接到 hiveserver2 时候连接不上;或者启动 hiveserver2 时候不能正常启动,10000 端口打不开;此时通过查询 hive.log 日志都会发现让执行 ”mysqladmin flush-hosts“ 解决;