一.介绍

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一会又自动起来

  1. 配置yarn最大重试次数%HADOOP_HOME%/etc/hadoop/yarn-site.xml,分发文件
<property>
<name>yarn.resourcemanager.am.max-attempts</name>
<value>4</value>
</property>
  1. 修改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
  1. 修改conf/master配置文件
Hadoop102:8081
Hadoop103:8081
Hadoop104:8081
  1. 修改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
  1. 启动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模式】的更多相关文章

  1. Apache Flink 零基础入门(转)

    这是一份很好的 Apache Flink 零基础入门教程. Apache Flink 零基础入门(一&二):基础概念解析 Apache Flink 零基础入门(三):开发环境搭建和应用的配置. ...

  2. JavaScript基础入门05

    目录 JavaScript 基础入门05 严格模式 严格模式的设计目的 如何开启使用严格模式 显式报错 字符串 字符串的创建 字符串实例方法之常用API JavaScript 基础入门05 严格模式 ...

  3. Flink 集群运行原理兼部署及Yarn运行模式深入剖析

    1 Flink的前世今生(生态很重要) 原文:https://blog.csdn.net/shenshouniu/article/details/84439459 很多人可能都是在 2015 年才听到 ...

  4. 012 Spark在IDEA中打jar包,并在集群上运行(包括local模式,standalone模式,yarn模式的集群运行)

    一:打包成jar 1.修改代码 2.使用maven打包 但是目录中有中文,会出现打包错误 3.第二种方式 4.下一步 5.下一步 6.下一步 7.下一步 8.下一步 9.完成 二:在集群上运行(loc ...

  5. Apache Flink:详细入门

    Apache Flink是一个面向分布式数据流处理和批量数据处理的开源计算平台,它能够基于同一个Flink运行时(Flink Runtime),提供支持流处理和批处理两种类型应用的功能.现有的开源计算 ...

  6. .NET ORM 的 “SOD蜜”--零基础入门篇

    PDF.NET SOD框架不仅仅是一个ORM,但是它的ORM功能是独具特色的,我在博客中已经多次介绍,但都是原理性的,可能不少初学的朋友还是觉得复杂,其实,SOD的ORM是很简单的.下面我们就采用流行 ...

  7. Linux 基础入门(新版)”实验报告一~十二

    实验报告 日期: 2015年9月15日 一.实验的目的与要求 熟练地使用 Linux,本实验介绍 Linux 基本操作,shell 环境下的常用命令. 二.主要内容 1.Linux 基础入门& ...

  8. Linux基础入门学习笔记20135227黄晓妍

    学习计时:共24小时 读书:1小时 代码:8小时 作业:3小时 博客:12小时 一.学习目标 1. 能够独立安装Linux操作系统   2. 能够熟练使用Linux系统的基本命令   3. 熟练使用L ...

  9. 【原】Storm Local模式和生产环境中Topology运行配置

    Storm入门教程 1. Storm基础 Storm Storm主要特点 Storm基本概念 Storm调度器 Storm配置 Guaranteeing Message Processing(消息处理 ...

随机推荐

  1. AtCoder Beginner Contest 215 F题题解

    F - Dist Max 2 什么时候我才能突破\(F\)题的大关... 算了,不说了,看题. 简化题意:给定\(n\)个点的坐标,定义没两个点的距离为\(min(|x_i-x_j|,|y_i-y_j ...

  2. popStar机机对战数据生成器代码(C#)

    代码: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; ...

  3. 【数据结构&算法】10-串基础&KMP算法源码

    目录 前言 串的定义 串的比较 串的抽象类型数据 串与线性表的比较 串的数据 串的存储结构 串的顺序存储结构 串的链式存储结构 朴素的模式匹配算法 模式匹配的定义 朴素的匹配方法(BRUTE FORC ...

  4. Charles--/安装/破解/支持https抓包

     一.安装破解Charles 1.下载charles4.0.2版本,下面的jar包需要和charles版本对应 2.下载地址:https://www.cr173.com/soft/494576.htm ...

  5. 【JAVA】笔记(8)--- java.lang.String 精讲

    String 特性: 1.String 表示字符串类型,属于引用数据类型,所以其储存的是地址: 2.java 中规定,双引号括起来的字符串是不可变的,也就说" name "永远也只 ...

  6. 菜鸡的Java笔记 - java 双向一对多映射

    双向一对多映射    two-way    开发要求:        根据数据表的结构进行简单java类的转换:        要求实现如下的输出信息:            可以根据课程取得全部参与 ...

  7. node对象

    global,node的全局对象;js在游览器中的全局对象为windows 在node环境中;输入global.consloe 输出: Console { log: [Function: bound ...

  8. [atARC110E]Shorten ABC

    考虑令$a$.$b$和$c$分别对应1.2和3,那么每一次相当于令$x$和$y$变为$x\oplus y$(要求$x\ne y$) 根据异或的结合律,我们相当于将其划分为若干个区间求异或值 (另外还有 ...

  9. 【Microsoft Azure 的1024种玩法】六、使用Azure Cloud Shell对Linux VirtualMachines 进行生命周期管理

    [文章简介] Azure Cloud Shell 是一个用于管理 Azure 资源的.可通过浏览器访问的交互式经验证 shell. 它使用户能够灵活选择最适合自己工作方式的 shell 体验,本篇文章 ...

  10. springboot和mybatis集成

    springboot和mybatis集成 pom  <?xml version="1.0" encoding="UTF-8"?> <proje ...