1、lambada架构需要同时搭建批处理(保证数据准确)和流处理(低延迟)两套架构。而flink结合spark-streaming(高吞吐,数据准确性)和storm(低延迟)的优点,这样相当于一套架构实现了lambada架构。
2、flink,spark streaming,storm区别
- flink和spark streaming都能保持exactlyonce,但是spark为了实现exactlyonce要做的东西很多操作
- flink吞吐量比storm大,storm只能保持“至少一次”语意,storm不支持状态管理
- flink是真正流处理,spark streaming是微批处理
- flink的数据模型是dataflow,即数据流,sparkstreaming是dstream,即rdd的集合
3、flink流的wordcount中,经过map keyBy sum算的单词总数是累计值,即sum的是keyedstream的一个分区的总数据
4、flink有standalone,yarn,k8s集群模式
yarn模式下,rm会在一个nodemanager启动一个am,然后在这个am上启动flink的jobmanager,然后在其他的nodemanager启动taskmanager
5、一个slot是一个并行度,一个slot运行部分数据的整个代码流程,而spark里面一个task运行一个部分数据的某个stage代码流程
6、operator chain: 对于one-to-one的算子(窄依赖),并且并行度(分区)一样的,可以将这些算子任务封装成一个operator chain,这样一个operator chain里面的算子之间就不用进行网络传输,序列化等操作了,提升效率。其实类似于spark的stage,遇到shuffle操作就分为两个operator chain。但是flink的operator chain可以由代码控制哪些算子合并为一个operator chain
7、sparkstreaming读取Kafka,需要在程序最后面自己提交偏移量保证消费准确性。而flink消费Kafka不需要,flink自动保证这方面的准确
8、官方实现了kafkasink,essink,redissink等,但是没有实现mysqlsink,所以需要自己实现
9、window()必须在keyby后面才能使用,windowall在datastream上使用,即所有数据在一个分区
11、flink端到端的exactlyonece:以下的这些策略在flink里面都实现了,不用自己实现
- source端:利用flink-kafka-consumer可以保持source端offset的exactlyonece
- 内部:利用checkpoint保持exactlyonece
- sink端:
幂等写入
事务写入:实现方式一:预写日志。二:两阶段提交
12、table api and sql:就是将流转换成表,然后对表进行sql操作,最后将表转换成流
13、状态管理
1)checkpoint
2)state
keyed state:基于keyedstream的状态,每一个key对应一个state。有这几种状态类型:ValueState;ListState;MapState;
operator state:非keyedstream的状态。与operator绑定的state,整个operator(transform算子)对应一个state
14、flink核心api: DataStream(流处理)和DataSet(批处理)
15、keyBy() (根据key的哈希值重新分区,分组)
16、Flink运行时包含两种类型的进程:
- 该JobManagers(也称为Masters)协调分布式执行。他们安排任务,协调检查点,协调故障恢复等。总是至少有一个Job
Manager。高可用性设置将具有多个JobManagers,其中一个始终是Leader,其他人处于待机状态。 - 该TaskManagers(也叫worker)执行任务(或者更具体地说,子任务)的数据流,以及缓冲器和交换数据流。必须始终至少有一个TaskManager
一个TaskManager有多个slot,一个 Slot 代表一个可用线程,该线程具有固定的内存,注意 Slot 只对内存隔离,没有对 CPU 隔离
17、Flink任务提交后,Client向HDFS上传Flink的Jar包和配置,之后向Yarn ResourceManager提交任务,ResourceManager分配Container资源并通知对应的NodeManager启动ApplicationMaster, ApplicationMaster启动后加载Flink的Jar包和配置构建环境,然后启动JobManager,之后ApplicationMaster向ResourceManager申请资源启动TaskManager,ResourceManager分配Container资源后,由ApplicationMaster通知资源所在节点的NodeManager启动TaskManager,NodeManager加载Flink的Jar包和配置构建环境并启动TaskManager,TaskManager启动后JobManager发送心跳包,并