仅作笔记
文章目录
-
- 注意事项
-
-
-
- 注意事项1:必须导入import org.apache.flink.streaming.api.scala.StreamExecutionEnvironment,Flink有2个相似的类,坑
- 注意事项2:必须导入import org.apache.flink.streaming.api.TimeCharacteristic,同理,有2个相似类,坑,另一个类只有ProcessingTime,没有EventTime
- 注意事项3:必须导入import org.apache.flink.streaming.api.scala._,隐式类型转换,理由复杂,不解释
- 注意事项4:之所以*1000,是因为时间戳为秒,转换单位为毫秒,只有确定数据完美升序才能使用assignAscendingTimestamps,也就是产生完美水印,真实业务场景一般都是乱序的,所以一般不用assignAscendingTimestamps,而是使用BoundedOutOfOrdernessTimestampExtractor。
- 注意事项5:必须加上lazy懒加载,不然会报getRuntimeContext对象的空指针异常,名字也可以推断,只有在运行时才产生,编译直接报错。
- 注意事项6:scala这门语言作为静态语言没有for循环,折中使用java的for循环时,需要隐式转换。导入隐式转换类。PS,纯静态语言用递归替换for
-
-
- 扩展
- 优化
- 使用CEP实现本章内容
import org.apache.flink.api.common.state.{
ListState, ListStateDescriptor}
import org.apache.flink.api.java.tuple.Tuple
import org.apache.flink.streaming.api.scala._
import org.apache.flink.streaming.api.TimeCharacteristic
import org.apache.flink.streaming.api.functions.KeyedProcessFunction
import org.apache.flink.streaming.api.scala.StreamExecutionEnvironment
import org.apache.flink.util.Collector
import scala.collection.mutable.ListBuffer
/**
* 恶意登录监控
1.基本需求
用户在短时间内频繁登录失败,有程序恶意攻击的可能
同一用户(可以是不同IP)在2秒内连续两次登录失败,需要报警
2.解决思路
将用户的登录失败行为存入ListState,设定定时器2秒后触发,查看ListState中有几次失败登录
更加精确的检测,可以使用CEP库实现事件流的模式匹配
* @return ${return}
* @author fujiwen
*/
object LoginFail {
def main(args: Array[String]): Unit = {
//注意事项1
val env: StreamExecutionEnvironment = StreamExecutionEnvironment.getExecutionEnvironment
//注意事项2
env.setStreamTimeCharacteristic(TimeCharacteristic.EventTime)
env.setParallelism(1)
//注意事项3
env.fromCollection(List(
LoginEvent(1, "192.168.0.1", "fail", 1558430842),
LoginEvent(1, "192.168.0.2", "fail", 1558430843),
LoginEvent(1, "192.168.0.3", "fail", 1558430844),
LoginEvent(1, "192.168.0.1", "fail", 1558430845),
LoginEvent(1, "192.168.0.2", "fail", 1558430846),
LoginEvent(1, "192.168.0.3", "fail", 1558430847),
LoginEvent(1, "192.168.0.1", "fail", 1558430848),
LoginEvent(1, "192.168.0.2", "fail", 1558430849),
LoginEvent(1, "192.168.0.3", "fail", 1558430888),
LoginEvent(2, "192.168.10.10", "success", 1558430845)
)).assignAscendingTimestamps(_.eventTime *