Flink(一)【基础入门,Yarn、Local模式】
一.介绍
Apache Flink是一个框架和分布式处理引擎,用于对无界和有界数据流进行有状态计算。
Spark | Flink
spark
处理方式:批处理
延时性:高延迟(采集周期)
缺点:精准一次性消费,错乱延迟数据,延迟高
flink
处理方式:流处理(有界,无界)
延时性:低延迟
优点:①灵活的窗口 ②Exactly Once语义保证
二.快速入门:WC案例
pom依赖
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<flink.version>1.10.0</flink.version>
<java.version>1.8</java.version>
<scala.binary.version>2.11</scala.binary.version>
<maven.compiler.source>${java.version}</maven.compiler.source>
<maven.compiler.target>${java.version}</maven.compiler.target>
<log4j.version>2.12.1</log4j.version>
</properties>
<!-- flink的依赖 开始 -->
<dependencies>
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-java</artifactId>
<version>${flink.version}</version>
</dependency>
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-streaming-java_${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>
</dependencies>
<!-- flink的依赖 结束 -->
<!--打包插件 -->
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>3.0.0</version>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
批处理
Java代码
/**
* @description: WordCount 批处理
* @author: HaoWu
* @create: 2020年09月15日
*/
public class WC_Batch {
public static void main(String[] args) throws Exception {
// 0.创建执行环境
ExecutionEnvironment env = ExecutionEnvironment.getExecutionEnvironment();
// 1.读取数据
DataSource<String> fileDS = env.readTextFile("D:\\SoftWare\\idea-2019.2.3\\wordspace\\13_flinkdemo\\input");
// 2.扁平化 ->(word,1)
AggregateOperator<Tuple2<String, Integer>> reuslt = fileDS.flatMap(new FlatMapFunction<String, Tuple2<String, Integer>>() {
@Override
public void flatMap(String s, Collector<Tuple2<String, Integer>> collector) throws Exception {
// 2.1切分
String[] words = s.split(" ");
// 2.2转为二元Tuple
for (String word : words) {
Tuple2<String, Integer> tuple = Tuple2.of(word, 1);
collector.collect(tuple);
}
}
}) // 3.分组
.groupBy(0)
// 4.求sum
.sum(1);
// 3.输出保存
reuslt.print();
// 4.启动
}
}
控制台
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
(flink,2)
(hello,4)
(sparksql,1)
(spark,1)
Process finished with exit code 0
流处理
有界流
Java代码
import org.apache.flink.api.common.functions.FlatMapFunction;
import org.apache.flink.api.common.typeinfo.TypeHint;
import org.apache.flink.api.java.ExecutionEnvironment;
import org.apache.flink.api.java.operators.AggregateOperator;
import org.apache.flink.api.java.operators.DataSource;
import org.apache.flink.api.java.tuple.Tuple2;
/**
* @description: WordCount 批处理
* @author: HaoWu
* @create: 2020年09月15日
*/
public class WC_Batch {
public static void main(String[] args) throws Exception {
// 0.创建执行环境
ExecutionEnvironment env = ExecutionEnvironment.getExecutionEnvironment();
// 1.读取数据
DataSource<String> fileDS = env.readTextFile("D:\\SoftWare\\idea-2019.2.3\\wordspace\\13_flinkdemo\\input");
// 2.扁平化 ->(word,1)
AggregateOperator<Tuple2<String, Integer>> reuslt = fileDS.flatMap((FlatMapFunction<String, Tuple2<String, Integer>>) (s, collector) -> {
// 2.1切分
String[] words = s.split(" ");
// 2.2转为二元Tuple
for (String word : words) {
Tuple2<String, Integer> tuple = Tuple2.of(word, 1);
collector.collect(tuple);
}
}).returns(new TypeHint<Tuple2<String, Integer>>(){})
// 3.分组
.groupBy(0)
// 4.求sum
.sum(1);
// 5.输出保存
reuslt.print();
// 6.执行(批处理不需要启动)
}
}
控制台
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
7> (flink,1)
7> (flink,2)
1> (spark,1)
3> (hello,1)
3> (hello,2)
3> (hello,3)
3> (hello,4)
3> (sparksql,1)
Process finished with exit code 0
无界流(重要)
Java代码
import org.apache.flink.api.common.functions.FlatMapFunction;
import org.apache.flink.api.java.tuple.Tuple2;
import org.apache.flink.streaming.api.datastream.DataStreamSource;
import org.apache.flink.streaming.api.datastream.SingleOutputStreamOperator;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.util.Collector;
/**
* @description: 无界流(有头无尾)
* @author: HaoWu
* @create: 2020年09月15日
*/
public class Flink03_WC_UnBoundedStream {
public static void main(String[] args) throws Exception {
// 0.创建执行环境
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
// 1.读取数据
DataStreamSource<String> fileDS = env.socketTextStream("hadoop102", 9999);
// 2.扁平化:转换(word,1)
SingleOutputStreamOperator<Tuple2<String, Integer>> result = fileDS.flatMap(new FlatMapFunction<String, Tuple2<String, Integer>>() {
@Override
public void flatMap(String s, Collector<Tuple2<String, Integer>> collector) throws Exception {
// 2.1切分
String[] words = s.split(" ");
// 2.2收集写出下游
for (String word : words) {
collector.collect(Tuple2.of(word, 1));
}
}
}) // 3.分组
.keyBy(0)
// 4.求sum
.sum(1);
// 5.输出
result.print();
// 6.执行
env.execute();
}
}
nc工具 Socket 输入
[root@hadoop102 ~]$ nc -lk 9999
a
f
d
af
dafda
fafa
a
a
b
a
控制台
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
6> (a,1)
2> (f,1)
5> (d,1)
4> (af,1)
7> (dafda,1)
3> (fafa,1)
6> (a,2)
6> (a,3)
2> (b,1)
6> (a,4)
注意
①tuple的两种写法:Tuple2.of(word, 1)、new Tuple2<>(word,1)。
②匿名对象、lamda两种写法。
③不要导错包,用java的,别选成scala的了。
三.Yarn模式部署
官网介绍:https://ci.apache.org/projects/flink/flink-docs-release-1.11/ops/deployment/yarn_setup.html#run-a-flink-job-on-yarn
有多种部署模式,local,standalone,yarn,windows等,本文只介绍yarn。
安装
前提已经部署hdfs,yarn,解压即用
将flink-1.10.0-bin-scala_2.11.tgz文件上传到Linux并解压缩,放置在指定位置,路径中不要包含中文或空格
tar -zxvf flink-1.10.0-bin-scala_2.11.tgz -C /opt/module
打包测试,命令行(无界流)
运行无界流的job,使用nc工具测试,默认提交的模式是Per-job方式。
当前yarn模式不支持webUI方式提交,standalone模式可以用webUI提交。
bin/flink run -m yarn-cluster -c com.flink.chapt01.Flink03_WC_UnBoundedStream /opt/module/testdata/flink-wc.jar
FAQ报错
解决方案
错误的原因是Flink1.8版本之后,默认情况下类库中是不包含hadoop相关依赖的,所以提交时会发生错误,,引入hadoop相关依赖jar包即可:flink-shaded-hadoop-2-uber-3.1.3-9.0.jar
上传后,重新执行上面的指令即可。运行过程可以通过Yarn的应用服务页面查看
cp /opt/software/flink/flink-shaded-hadoop-2-uber-3.1.3-9.0.jar /opt/module/flink-1.10.0/lib/
重新执行任务提交
启动nc工具进行测试
Flink on Yarn
Flink提供了两种在yarn上的运行模式,分别是Session-Cluster和Per-Job-Cluster模式。
Per-Job-Cluster
在上面的应用程序提交时,一个Job会对应一个yarn-session集群,每提交一个作业会根据自身的情况,都会单独向yarn申请资源,直到作业执行完成,一个作业的失败与否并不会影响下一个作业的正常提交和运行。独享Dispatcher和ResourceManager,按需接受资源申请;适合规模大长时间运行的作业
通过-m yarn-cluster 参数来指定运行模式
bin/flink run -m yarn-cluster -c com.flink.chapt01.Flink03_WC_UnBoundedStream /opt/module/testdata/flink-wc.jar
查看相关参数help:bin/flink run -m yarn-cluster -h
这种方式每次提交都会创建一个新的flink集群,任务之间互相独立,互不影响,方便管理。任务执行完成之后创建的集群也会消失。
Session-Cluster
在规模小执行时间短的作业执行时,频繁的申请资源并不是一个好的选择,所以Flink还提供了一种可以事先申请一定资源,然后在这个资源中并行执行多个作业的集群方式。
![image-20200915184337978](image/
在yarn中初始化一个flink集群,开辟指定的资源,以后提交任务都向这里提交。这个flink集群会常驻在yarn集群中,除非手工停止。
Session-Cluster集群模式和Per-Job-Cluster不一样的是需要事先创建Yarn应用后再提交Flink应用程序
①创建Yarn应用
bin/yarn-session.sh -d -n 2 -s 2 -jm 1024 -tm 1024 -nm test
查看参数help:bin/yarn-session.s -h
注意:flink新的版本 -n
,-s
参数将不再有效,Yarn会按需动态分配资源 。以后不要加这两个参数了。
webUI可以观察,当前flink版本1.10
没有任务,也没有资源分配
相关参数
参数 | 含义 |
---|---|
守护模式,daemon | |
-n(--container) | TaskManager的数量 |
-s(--slots) | 每个TaskManager的slot数量,默认一个slot一个core,默认每个taskmanager的slot的个数为1,有时可以多一些taskmanager,做冗余 |
-jm | JobManager的内存(单位MB) |
-tm | 每个Taskmanager的内存(单位MB) |
-nm | yarn 的appName(现在yarn的ui上的名字) |
-d | 后台执行,需要放在前面,否则不生效 |
②再提交任务
bin/flink run -c com.flink.chapt01.Flink03_WC_UnBoundedStream /opt/module/testdata/flink-wc.jar
可以发现yarn分配了资源
HA高可用
不是传统的高可用,就是利用yarn的重试机制,job失败,再重新启动,根据配置重试4次,kill掉YarnSessionClusterEntrypoint,YarnSessionClusterEntrypoint一会又自动起来
- 配置yarn最大重试次数%HADOOP_HOME%/etc/hadoop/yarn-site.xml,分发文件
<property>
<name>yarn.resourcemanager.am.max-attempts</name>
<value>4</value>
</property>
- 修改conf/flink-conf.yaml配置文件
配置参数中冒号后面的参数值都需要增加空格
yarn.application-attempts: 4
# Line79
high-availability: zookeeper
# Line88
high-availability.storageDir: hdfs://hadoop102:9000/flink/ha/
# Line94
high-availability.zookeeper.quorum: hadoop102:2282,hadoop103:2282,hadoop104:2282
- 修改conf/master配置文件
Hadoop102:8081
Hadoop103:8081
Hadoop104:8081
- 修改zoo.cfg配置文件
也可以用外部的zk集群
#Line 32 防止和外部ZK冲突
clientPort=2282
#Line 35
server.88=hadoop102:2888:3888
server.89=hadoop103:2888:3888
server.90=hadoop104:2888:3888
5)分发flink
xsync flink
6)启动Flink Zookeeper集群
bin/start-zookeeper-quorum.sh
- 启动Flink Session应用
bin/yarn-session.sh -d -jm 1024 -tm 1024 -nm test
如果此时将YarnSessionClusterEntrypoint进程关闭,WebUI界面会访问不了
那么稍等后,Yarn会自动重新启动Cluster进程,就可以重新访问了。
五.Linux本地模式
1.安装
前提、安装Java 1.8.x以上
下载flink安装包:flink-1.10.0-bin-scala_2.11.tgz
解压安装包:tar -zxvf flink-1.6.2-bin-scala_2.11.tgz
2.启动
本地模式启动:
1)切换目录:cd /opt/module/flink-1.10.0
2)启动/bin/start-cluster.sh查看webUI:http://hadoop102:8081
查看jps
[hadoop@hadoop102 bin]$ jps
10131 TaskManagerRunner
9831 StandaloneSessionClusterEntrypoint
15486 Jps
3.案例
1.启动nc工具:
nc -l 9000
2.提交flink程序
案例程序:WordCount在5秒的时间窗口中计算(处理时间,滚动窗口)并打印到标准输出
bin/flink run examples/streaming/SocketWindowWordCount.jar --port 9000
Starting execution of program
3.查看webUI:程序正常启动
4.nc工具输入参数
[hadoop@hadoop102 ~]$ nc -l 9000
1
2
3
4
5
6
3
4
5
5
1
1
1
1
1
5.观察输出打印
1)方式一: 通过WebUI
2)方式二:查看taskmanager的输出日志
[hadoop@hadoop102 log]$ pwd
/opt/module/flink-1.10.0/log
[hadoop@hadoop102 log]$ tail -f flink-atguigu-taskexecutor-0-hadoop102.out
6 : 1
5 : 1
4 : 1
3 : 1
2 : 1
3 : 1
5 : 2
4 : 1
1 : 2
1 : 3
说明:yarn模式,任务停止后可以通过
yarn logs -applicationId application_1625031122720_35602 > log
下载日志到本地看
4.关闭
./bin/stop-cluster.sh
Flink(一)【基础入门,Yarn、Local模式】的更多相关文章
- Apache Flink 零基础入门(转)
这是一份很好的 Apache Flink 零基础入门教程. Apache Flink 零基础入门(一&二):基础概念解析 Apache Flink 零基础入门(三):开发环境搭建和应用的配置. ...
- JavaScript基础入门05
目录 JavaScript 基础入门05 严格模式 严格模式的设计目的 如何开启使用严格模式 显式报错 字符串 字符串的创建 字符串实例方法之常用API JavaScript 基础入门05 严格模式 ...
- Flink 集群运行原理兼部署及Yarn运行模式深入剖析
1 Flink的前世今生(生态很重要) 原文:https://blog.csdn.net/shenshouniu/article/details/84439459 很多人可能都是在 2015 年才听到 ...
- 012 Spark在IDEA中打jar包,并在集群上运行(包括local模式,standalone模式,yarn模式的集群运行)
一:打包成jar 1.修改代码 2.使用maven打包 但是目录中有中文,会出现打包错误 3.第二种方式 4.下一步 5.下一步 6.下一步 7.下一步 8.下一步 9.完成 二:在集群上运行(loc ...
- Apache Flink:详细入门
Apache Flink是一个面向分布式数据流处理和批量数据处理的开源计算平台,它能够基于同一个Flink运行时(Flink Runtime),提供支持流处理和批处理两种类型应用的功能.现有的开源计算 ...
- .NET ORM 的 “SOD蜜”--零基础入门篇
PDF.NET SOD框架不仅仅是一个ORM,但是它的ORM功能是独具特色的,我在博客中已经多次介绍,但都是原理性的,可能不少初学的朋友还是觉得复杂,其实,SOD的ORM是很简单的.下面我们就采用流行 ...
- Linux 基础入门(新版)”实验报告一~十二
实验报告 日期: 2015年9月15日 一.实验的目的与要求 熟练地使用 Linux,本实验介绍 Linux 基本操作,shell 环境下的常用命令. 二.主要内容 1.Linux 基础入门& ...
- Linux基础入门学习笔记20135227黄晓妍
学习计时:共24小时 读书:1小时 代码:8小时 作业:3小时 博客:12小时 一.学习目标 1. 能够独立安装Linux操作系统 2. 能够熟练使用Linux系统的基本命令 3. 熟练使用L ...
- 【原】Storm Local模式和生产环境中Topology运行配置
Storm入门教程 1. Storm基础 Storm Storm主要特点 Storm基本概念 Storm调度器 Storm配置 Guaranteeing Message Processing(消息处理 ...
随机推荐
- Codeforces Round #742 (Div. 2)题解
链接 \(A,B\)题签到,就完了. \(C\)题,考虑进位时多进一位,由于是隔一位进的,所以可以发现奇数位和偶数位是相互独立的,那么我们就把奇数位和偶数位单独拉出来组成数字例如:34789,我们单独 ...
- DeWeb第1个通用化模块:登录模块,仅需要修改一个配置文件即可实现登录功能
演示: https://delphibbs.com/login.dw 开发环境和源代码 https://gitee.com/xamh/dewebsdk 效果图: 配置方法: 在Runtime目录中放一 ...
- 2021.11.2-测试T1数独
痛苦 题目 数 独 [问题描述] 给定一个9*9矩阵,对其进行几种操作,分别是插入,删除,合并,查询,输出 主要学到了一些特别的操作. (1)备份( 本蒟蒻第一次了解到) (2)对与数据的一些特别的改 ...
- MySQL——DML数据增、删、改
插入 方式一(经典) 语法: insert into 表名(列名,...) values(值,...); 若要一次插入多行 create table if NOT EXISTS user( name ...
- 聊一聊声明式接口调用与Nacos的结合使用
背景 对于公司内部的 API 接口,在引入注册中心之后,免不了会用上服务发现这个东西. 现在比较流行的接口调用方式应该是基于声明式接口的调用,它使得开发变得更加简化和快捷. .NET 在声明式接口调用 ...
- 解决tomcat的404问题
遇到的问题 点击startup.bat启动tomcat启动成功,但在网页上输入local:8080却显示Access Error: 404 -- Not Found Cannot locate doc ...
- 第六周PTA笔记 括号匹配调整+堆放石子+最大积分+168
括号匹配调整 如果通过插入" +"和" 1"可以从中得到格式正确的数学表达式,则将带括号的序列称为正确的. 例如,序列 "(())()",& ...
- OOP 4.21晚 指针知识点
1.读法:int* ptr ptr是一个指针指向整型变量 2.指针类型:指针声明语句里的指针名字去掉,剩下的部分就是这个指针的类型; 3.指针所指向的类型:只须把指针声明语句中的指针名字和名字左边的指 ...
- Effective C++ 总结笔记(五)
六.继承与面向对象设计 32.确定你的public继承塑模出is-a关系 public继承意味着is-a.适用于base class身上的每一件事情也一定适用于derived class身上.每一个d ...
- Water 2.4 发布,一站式服务治理平台
Water(水孕育万物...) Water 为项目开发.服务治理,提供一站式解决方案(可以理解为微服务架构支持套件).基于 Solon 框架开发,并支持完整的 Solon Cloud 规范:已在生产环 ...