flink
程序员文章站
2022-06-17 13:17:57
...
-
简介
是一个框架和分布式处理处理引擎,用于对*和有界数据流进行状态计算。
低延迟,高吞吐,结果正确性和良好的容错性。 -
应用场景:
-
流处理演变:
离线大数据事务图如下:
有状态的流式处理:
如sum统计,数据仍然是流进来,流出去,但可以保存一个求和的本地状态,存储在内存里,再写入到远程的存储空间里,落盘,为flink的检查点概念。
但在分布式,高并发情况下一致性不好,可能网络延迟,乱序,不能保证数据的一致性。但如果隔一段时间再处理,数据应该都齐了,才能保证一致性。所以批处理如下:
上面为第二代流处理,维护两套系统,批处理解决了一致性,但出现了延迟,实时性不好。第二套流处理解决了延迟问题,保证了实时性,但一致性不够好。两套配合起来解决了高吞吐,低延迟,正确性。
缺点:本来是一套系统,现在要维护两套系统,比较繁琐。api也不一样,
于是第三代流处理系统出现了:
4. flink主要特点
基于流的世界观:
spark是一批一批的数据,包装成RDD,然后统一做处理
flink是一切都是流,离线是有界的流,实时是*的流。
分层API
其他特点:
支持事件时间(event-time)和处理时间(processing-time)语义
精确一次(exactly-once)的状态一致性保证
低延迟,每秒处理数据百万个事件,毫秒级延迟
与众多常用存储系统的连接(kafka,es,hdfs等)
高可用,动态扩展,实现7*24小时全天候运行
- flink vs spark streaming
- 第一个例子
批处理:
package com.dong.flink
import org.apache.flink.api.scala._
/**
* 批处理
*/
object wordCount {
def main(args: Array[String]): Unit = {
//创建一个批处理的执行环境
val env = ExecutionEnvironment.getExecutionEnvironment
//从文件中读取数据
val txtPath = "D:\\dev\\java\\ide\\scala\\ws\\flink\\flink\\src\\main\\res\\hello.txt"
val inputDataSet = env.readTextFile(txtPath)
//分词之后count统计
val wordCountDataSet = inputDataSet.flatMap(_.split(" "))
.map((_, 1)).groupBy(0).sum(1);
//打印
wordCountDataSet.print();
}
}
流处理:
package com.dong.flink
import org.apache.flink.streaming.api.scala._
/**
* 流处理
*/
object StreamWordCount {
def main(args: Array[String]): Unit = {
//创建一个流处理的执行环境
val env = StreamExecutionEnvironment.getExecutionEnvironment
//接收socket数据流
val textDataStream = env.socketTextStream("localhost", 7777)
//逐一读取数据,打散之后进行word count
val wordCountDataStream = textDataStream.flatMap(_.split("\\s"))
.filter(_.nonEmpty)
.map((_, 1))
.keyBy(0)
.sum(1)
//打印
wordCountDataStream.print()
//比批处理多一步骤,调用真正执行作业
//上面只是定义完成一组处理流程,未执行任务
env.execute("stream word count job")
}
}
流处理需要建立一个socket模拟流,那么可以使用nc工具,参考:
下载nc.exe工具,放入C:\windows\system32目录下
打开命令界面 cmd,输入 nc -L -p 9999
nc下载