Apache Flink 是一个框架和分布式处理引擎,用于在无边界和有边界数据流上进行有状态的计算。Flink 能在所有常见集群环境中运行,并能以内存速度和任意规模进行计算。
Apache Flink 功能强大,支持开发和运行多种不同种类的应用程序。它的主要特性包括:批流一体化、精密的状态管理、事件时间支持以及精确一次的状态一致性保障等。Flink 不仅可以运行在包括 YARN、 Mesos、Kubernetes 在内的多种资源管理框架上,还支持在裸机集群上独立部署。在启用高可用选项的情况下,它不存在单点失效问题。事实证明,Flink 已经可以扩展到数千核心,其状态可以达到 TB 级别,且仍能保持高吞吐、低延迟的特性。世界各地有很多要求严苛的流处理应用都运行在 Flink 之上。
接下来,是Flink中的几个重要概念。
批处理的特点是有界、持久、大量,非常适合需要访问全套记录才能完成的计算工作,一般用于离线统计。
流处理的特点是无界、实时, 无需针对整个数据集执行操作,而是对通过系统传输的每个数据项执行操作,一般用于实时统计。
在Spark的世界观中,一切都是由批次组成的,离线数据是一个大批次,而实时数据是由一个一个无限的小批次组成的。而在Flink的世界观中,一切都是由流组成的,离线数据是有界限的流,实时数据是一个没有界限的流,这就是所谓的有界流和无界流。
有界流与无界流图示:
Flink 擅长处理无界和有界数据集 精确的时间控制和状态化使得Flink的运行时(runtime)能够运行任何处理无界流的应用。有界流则由一些专为固定大小数据集特殊设计的算法和数据结构进行内部处理,产生了出色的性能。
可将flink部署到任何地方
有状态的 Flink 程序针对本地状态访问进行了优化。任务的状态始终保留在内存中,如果状态大小超过可用内存,则会保存在能高效访问的磁盘数据结构中。任务通过访问本地(通常在内存中)状态来进行所有的计算,从而产生非常低的处理延迟。Flink 通过定期和异步地对本地状态进行持久化存储来保证故障场景下精确一次的状态一致性。
Flink 根据抽象程度分层,提供了三种不同的 API。每一种 API 在简洁性和表达力上有着不同的侧重,并且针对不同的应用场景。
Apache Flink是一个集合众多具有竞争力特性于一身的第三代流处理引擎,它的以下特点使得它能够在同类系统中脱颖而出。
在实际生产的过程中,大量数据在不断地产生,例如金融交易数据、互联网订单数据、GPS定位数据、传感器信号、移动终端产生的数据、通信信号数据等,以及我们熟悉的网络流量监控、服务器产生的日志数据,这些数据最大的共同点就是实时从不同的数据源中产生,然后再传输到下游的分析系统。
针对这些数据类型主要包括以下场景,Flink对这些场景都有非常好的支持。
下载安装包:Apache Flink: Downloads
本文以https://dlcdn.apache.org/flink/flink-1.15.2/flink-1.15.2-bin-scala_2.12.tgz为例
上传安装包至node001节点
解压:tar -zxvf flink-1.15.2-bin-scala_2.12.tgz -C /opt/
改名:mv /opt/flink-1.15.2/ /opt/flink
flink的重要文件简述
# bin/ ================================================
bash-java-utils.jar
config.sh
find-flink-home.sh
flink #flink shell
flink-console.sh
flink-daemon.sh
historyserver.sh
jobmanager.sh #作业管理者,最作业进行启动,分发,调度
taskmanager.sh #任务管理者(干活的)
kubernetes-jobmanager.sh
kubernetes-session.sh
kubernetes-taskmanager.sh
mesos-appmaster-job.sh
mesos-appmaster.sh
mesos-jobmanager.sh
mesos-taskmanager.sh
pyflink-shell.sh #
sql-client.sh
standalone-job.sh
start-cluster.sh #启动flink集群
stop-cluster.sh #停止flink集群
start-zookeeper-quorum.sh
stop-zookeeper-quorum.sh
yarn-session.sh #
zookeeper.sh
# ./conf [配置目录] ============================================
# ./conf/flink-conf.yaml -------------------------------------
jobmanager.memory.process.size: 1600m #这个是jobmanager的堆内存设定
taskmanager.memory.process.size: 1728m #这个是taskmanager的堆内存设定
#在生产过程中,taskmanager的堆内存会配置的大一些,因为他是干活的。然而jobmanager只是用来调度的,这个可以稍微略小些。生产中 taskmanager比jobmanager大很多。
taskmanager.numberOfTaskSlots: 1 #taskmanager对资源进行划分为多个“槽位”,有多少个slot就可以同时奔跑多少个线程。 这里配置1,表示只有一个槽位,那么一个taskmanager就只能跑一个线程。
parallelism.default: 1 #默认并行度。(默认一个线程执行)
#问题: taskmanager.numberOfTaskSlots和parallelism.default 有什么区别? 这两个不是一回事。前者表示 当前这台taskmanage 最大可以执行的线程数量;后者表示真正执行的时候多个taskmanager并行个数总和默认值。不好理解,可以理解为:前者表示最大的能力,后者表示当前用多少能力。 前者指的是一台taskmanage最大能力, 后者指的是集群中所有taskmanage 默认的并行度总和的默认值, 默认值只有在不设置的时候才使用,一般情况会在代码中直接设置
# ./conf/master ----------------------------------------------
localhost:8081 #里面默认写着localhost:8081, 这个也是web端口。
# ./conf/workers 或者 ./conf/slaves[之前版本] ------------------
localhost #默认值是localhost
#如上的masters和workers 表示单机模式
1.flink-conf.yaml
终端输入:vim /opt/flink/conf/flink-conf.yaml
将jobmanager.rpc.address:修改为主节点
2.masters
终端输入:vim /opt/flink/conf/masters
将localhost修改为主节点
3.workers
终端输入:vim /opt/flink/conf/workers
将localhost修改为从节点
配置环境变量
终端输入:vim /etc/profile
末行加入:
export FLINK_HOME=/opt/flink
export PATH=$PATH:$FLINK_HOME/bin
重新加载配置文件:source /etc/profile
分发文件
分发flink文件
scp -r /opt/flink/ node002:/opt/
scp -r /opt/flink/ node003:/opt/
分发profile文件
scp /etc/profile node002:/etc/
scp /etc/profile node003:/etc/
然后重新加载node002与node003的配置文件:source /etc/profile
测试访问web页面
启动flink,在zookeeper的leader节点启动flink
输入:start-cluster.sh
访问web页面:leader节点:8081
执行官方示例
首先创建一个words.txt
随便写入一些数据
然后执行命令:
flink run /opt/flink/examples/batch/WordCount.jar --input /root/words.txt --output /root/test/out
flink run /software/flink/examples/batch/WordCount.jar --input /root/test/words.txt --output /root/test/out
如果想要flink 连接hadoop ,需要去官网下载flink-share-hadoop-xxxxxxxx.jar包放在 flink/lib/下面的。
然后才可以搭建 flink的yarn模式。
从 maven仓库(https://mvnrepository.com/search?q=flink-shaded-hadoop-3)中找到对应的jar版本。
依照自己的Hadoop版本下载
然后jar包上传至flink/lib/目录
Flink 提供了两种在 yarn 上运行的模式,分别为 Session-Cluster 和 Per-Job-Cluster 模式。
Session-cluster 和 standalone模式有些类似。
使用:
#step1: 启动hadoop
#step2:启动yarn-session
./yarn-session.sh -n 10 -s 2 -jm 1024 -tm 4096 -nm test -d
-n(--container):TaskManager 的数量。(现在的版本都不需要指定了,如果指定就相当于限定死了,和standalone一样。 现在不指 定 就是动态分配了)
-s(--slots): 每个 TaskManager 的 slot 数量,默认一个 slot 一个 core,默认每个 taskmanager 的 slot 的个数为 1,
有时可以多一些 taskmanager,做冗余。
-jm:JobManager 的内存(单位 MB)。
-tm:每个 taskmanager 的内存(单位 MB)。
-nm:yarn 的 appName(现在 yarn 的 ui 上的名字)。
-d:后台执行。
#step3 : 执行。 直接用命令行提交即可。(这时候不要运行start-cluster.sh 。 如果运行就到 standalone模式了)
flink/bin/flink run \
-c com.lining.wc.StreamWordCount \
-p 2 \
/root/scala_maven-1.0-SNAPSHOT-jar-with-dependencies.jar --host 192.168.0.102 --port 7777
#step4 : 去yarn的控制台看任务状态
ip:8088
#step5 : 取消yarn-session
yarn application --kill [该任务的yarn的id]
使用:
#step1: 启动hadoop
#step2: 不要启动yarn-session,直接执行job
#在job执行命令中添加 -m yarn-cluster
./flink run -m yarn-cluster -yjm 1024m -ytm 2048m -c jobReq -p 1 /root/jobRequire-1.0-SNAPSHOT-jar-with-dependencies.jar
#step3 : 去yarn的控制台看任务状态
ip:8088
#step4 : 取消yarn-session
yarn application --kill [该任务的yarn的id]
什么是Flink?Flink能用来做什么?
flink安装部署