目录
- 什么是Flink
- 概念
- 特点
- Flink技术栈
- 本地安装flink
- 写代码之前的准备工作
- Flink处理数据模型
- Flink分布式运行架构
- 按照spark的情况部署
- 优化之后的槽位
- Flink standalone模式
- 搭建
- Flink集群提交任务
- Flink on yarn模式
- 搭建
什么是Flink
概念
Apache Flink是一个框架和分布式处理引擎,用于对无界和有界数据流进行有状态计算(会保留之前的状态)。Flink设计为在所有常见的集群环境(yarn、本地等都可以)中运行,以内存速度和任何规模执行计算。
特点
flink是事件驱动应用(来一个数据就计算,来一个就计算)
spark是时间驱动,几秒处理一次
- 支持高吞吐、低延迟、高性能的流处理
- 支持带有事件时间的窗口(Window)操作
- 支持有状态计算的Exactly-once语义(只处理一次)
- 支持高度灵活的窗口(Window)操作,支持基于time、count、session,以及data-driven的窗口操作,三个大类,八种小类窗口
- 支持具有反压功能的持续流模型(比如spark假如是五秒处理一次,假如一个五秒数据没有处理完成,数据会积压,会造成各种问题,但flink没有处理完数据,会减缓数据来的速度)
- 支持基于轻量级分布式快照(Snapshot)实现的容错
- 一个运行时同时支持Batch on Streaming处理和Streaming处理
- Flink在JVM内部实现了自己的内存管理,避免了出现oom(spark容易内存溢出,不稳定)
- 支持迭代计算
- 支持程序自动优化:避免特定情况下Shuffle、排序等昂贵操作,中间结果有必要进行缓存
Flink技术栈
local:idea中右键运行
cluster:standalone自己就是一个集群的模式、yarn集群运行模式
cloud:云,比如阿里云之类的
flink实现了流批统一
本地安装flink
加载配置文件:
我这里安装的是2.11版本,额外只需要加上scala和Java的编译环境即可,flink就是Java写的
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>ShuJia01</artifactId>
<groupId>ShuJia</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>flink</artifactId>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<flink.version>1.11.2</flink.version>
<scala.binary.version>2.11</scala.binary.version>
<scala.version>2.11.12</scala.version>
<log4j.version>2.12.1</log4j.version>
</properties>
<dependencies>
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-walkthrough-common_${scala.binary.version}</artifactId>
<version>${flink.version}</version>
</dependency>
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-streaming-scala_${scala.binary.version}</artifactId>
<version>${flink.version}</version>
</dependency>
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-clients_${scala.binary.version}</artifactId>
<version>${flink.version}</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-slf4j-impl</artifactId>
<version>${log4j.version}</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>${log4j.version}</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>${log4j.version}</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.36</version>
</dependency>
</dependencies>
<build>
<plugins>
<!-- Java Compiler -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
<!-- Scala Compiler -->
<plugin>
<groupId>org.scala-tools</groupId>
<artifactId>maven-scala-plugin</artifactId>
<version>2.15.2</version>
<executions>
<execution>
<goals>
<goal>compile</goal>
<goal>testCompile</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
写代码之前的准备工作
1、在运行flink程序代码之前,一定要导入隐式转换(每一次写程序都要导入这个)
2、先对共同的代码做一个封装,再写之后的代码
abstract class FlinkTool {
def main(args: Array[String]): Unit = {
//创建flink的环境
val env: StreamExecutionEnvironment = StreamExecutionEnvironment.getExecutionEnvironment
//设置并行度
env.setParallelism(2)
run(env)
env.execute()//启动flink
}
def run(env:StreamExecutionEnvironment)
}
3、做一个日志的打印
在flink项目的resources中加上log4j2.properties的配置,打印日志信息
Flink处理数据模型
Flink分布式运行架构
- Client:Flink 作业在哪台机器上面提交,那么当前机器称之为Client。用户开发的Program 代码,它会构建出DataFlow graph,然后通过Client提交给JobManager。
- JobManager:是主(master)节点,相当于Spark的Driver,相当于YARN里面的ResourceManager,生产环境中需要做高可用。JobManager会将任务进行拆分,发送到TaskManager上面执行。
- TaskManager:是从节点(slave),相当于Spark的Executor,执行task
taskmanager相当于executor,一个task相当于一个线程池,一个task相当于一个并行度,用来启动task
Memory & I/O Manager 相当于blockmanager
Network Manager,管理连接
Actor System用于通信,Scala框架
jobmanager相当于driver,所有任务都部署完成,任务才启动
按照spark的情况部署
运行一个wordcount程序,起码需要五个task槽位,一个槽位对应一个并行度(一个core(核))
优化之后的槽位
只需要前两个,也就是两个槽位(两个并行度),一个并行度占用一个资源
Flink standalone模式
搭建
flink集群搭建
1、standallone cluster
1、准备工作
配置FLINK_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、启动集群
start-cluster.sh
http://master:8081 访问web界面
Flink集群提交任务
web页面提交任务
成功运行
Flink on 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
flink和spark一样都是粗粒度资源申请
flink启动方式
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.core.Demo1WordCount flink-1.0.jar
杀掉yarn上的任务
yarn application -kill application_1599820991153_0005
yarn-session先在yarn中启动一个jobMansager ,所有的任务共享一个jobmanager (提交任务更快,任务之间共享jobmanager , 相互有影响)
直接提交任务模型,为每一个任务启动一个joibmanager (每一个任务独立jobmanager , 任务运行稳定)
感谢阅读,我是啊帅和和,一位大数据专业大四学生,祝你快乐。