flink

流处理:数据大小未知、简单操作、及时相应(spark streaming,flink)

批处理:数据大小固定,复杂操作,需要一段时间响应。(hive,mr,spark core sql)

离线计算:数据量大&周期长、复杂操作、数据固定、方便查询计算结果

实时计算:数据实时到达、数据达到次序独立、数据规模大&无法预知容量、再次提取代价大

1、什么是flink

Apache Fink是一个框架和分布式处理引擎,用于对无界和有界数据流进行有状态计算。Flink设计为在所有常见的集群环境中运行,以内存速度和任何规模执行计算。

2、flink特点

(1)批处理:处理历史数据集

(2)流处理:处理实时数据流

(3)事件驱动应用:监控事件的服务 (事件就是数据)

注:spark是时间驱动 spark和flink第一个区别

3、flink功能

(1)支持高吞吐、低延迟、高性能的流处理
(2)支持带有事件时间的窗口(Window)操作
(3)支持有状态计算的Exactly-once语义
(4)支持高度灵活的窗口(Window)操作,支持基于time、count、session,以及data-driven的窗口操作
(5)支持具有反压功能的持续流模型
(6)支持基于轻量级分布式快照(Snapshot)实现的容错 (checkpoint)
(7)一个运行时同时支持Batch on Streaming处理和Streaming处理
(8)Flink在JVM内部实现了自己的内存管理,避免了出现oom(内存溢出)
(9)支持迭代计算
(10)支持程序自动优化:避免特定情况下Shuffle、排序等昂贵操作,中间结果有必要进行缓存

4、source:数据源

Flink 在流处理和批处理上的 source 大概有 4 类:
(1)基于本地集合的 source、
(2)基于文件的 source、
(3)基于网络套接字的 source、
(4)自定义的 source。自定义的 source 常见的有 Apache kafka、Amazon Kinesis Streams、RabbitMQ、Twitter Streaming API、Apache NiFi 等,当然你也可以定义自己的 source。

5、Transformation:数据转换的各种操作,

有 Map / FlatMap / Filter /KeyBy / Reduce / Fold / Aggregations / Window / WindowAll / Union / Window join / Split / Select / Project 等,
操作很多,可以将数据转换计算成你想要的数据。

6、Sink:接收器

Flink 将转换计算后的数据发送的地点 。
Flink 常见的 Sink 大概有如下几类:
写入文件、
打印出来、
写入 socket 、
自定义的 sink 。自定义的 sink 常见的有 Apache kafka、RabbitMQ、MySQL、ElasticSearch、Apache Cassandra、Hadoop FileSystem 等,同理你也可以定义自己的 sink。

7、架构

Client:Flink 作业在哪台机器上面提交,那么当前机器称之为Client。用户开发的Program 代码,它会构建出DataFlow graph,然后通过Client提交给JobManager。

JobManager:是主(master)节点,相当于Spark的Driver,相当于YARN里面的ResourceManager,生产环境中需要做高可用。JobManager会将任务进行拆分,发送到TaskManager上面执行。

TaskManager:是从节点(slave),相当于Spark的Executor,执行task

一个集群只有一个JobManager,多个TaskManager

8、搭建

flink集群搭建
1、standallone cluster
	1、准备工作
		配置JAVA_HOME
		免密钥
	2、上传解压
		tar -xvf flink-1.11.0-bin-scala_2.11.tgz
		配置环境变量

	3、修改配置文件
		vim conf/flink-conf.yaml
		jobmanager.rpc.address: master   主节点ip地址

		vim conf/workers
		增加从节点  node1  node2

		vim conf/masters  
		改成主节点ip

		同步到所有节点
		scp -r flink-1.11.0/ node1:`pwd`

	4、启动集群
		bin/start-cluster.sh

	http://master:8081   访问web界面

9、运行

(1)、独立集群:前提开启 nc -lk 8888

提交任务
1、在web页面提交任务

	2、同flink命令提交任务
	flink run -c com.shujia.flink.soure.Demo4ReadKafka flink-1.0.jar 

(2)、yarn模式

flink on yarn  只需要部署一个节点
1、配置HADOOP_CONF_DIR
	vim /etc/profile
	export HADOOP_CONF_DIR=/usr/local/soft/hadoop-2.7.6/etc/hadoop/

2、将hadoop依赖jar上传到flink  lib目录
flink-shaded-hadoop-2-uber-2.6.5-10.0

1、yarn-session 在yarn里面启动一个flink集群 jobManager
先启动hadoop
yarn-session.sh -jm 1024m -tm 1096m

提交任务  任务提交的是根据并行度动态申请taskmanager
	1、在web页面提交任务

	2、同flink命令提交任务
	flink run -c com.shujia.flink.soure.Demo4ReadKafka flink-1.0.jar 

	3、rpc方式提交任务

2、直接提交任务到yarn 每一个任务都会有一个jobManager
flink run -m yarn-cluster -yjm 1024m -ytm 1096m -c com.shujia.flink.soure.Demo4ReadKafka flink-1.0.jar

杀掉yarn上的任务
yarn application -kill application_1599820991153_0005

yarn-session先在yarn中启动一个jobMansager ,所有的任务共享一个jobmanager (提交任务更快,任务之间共享jobmanager , 相互有影响)
直接提交任务模型,为每一个任务启动一个joibmanager (每一个任务独立jobmanager , 任务运行稳定)