JavaFlink原理、实战、源码分析(二)https://blog.csdn.net/qq_36250202/article/details/115668572
JavaFlink原理、实战、源码分析(三)https://blog.csdn.net/qq_36250202/article/details/115732840
第一章 Flink 简介
1.2 Flink 的重要特点
1.2.1 事件驱动型(Event-driven)
1.2.2 流与批的世界观
1.2.3 分层 api
Flink 几大模块
第二章 快速上手
2.1 搭建 maven 工程 FlinkTutorial
pom文件依赖
2.2 批处理 wordcount
2.3 流处理 wordcount
第三章 Flink 部署
3.1 Standalone 模式
Job提交运行
linuxJob提交
3.2 Yarn 模式
3.2.1 Flink on Yarn
3.2.2 Session Cluster
其中:
3) 执行任务
4) 去 yarn 控制台查看任务状态
5) 取消 yarn-session
3.2.2 Per Job Cluster
1) 启动 hadoop 集群
第四章 Flink 运行架构
4.1 Flink 运行时的组件
⚫ 作业管理器(JobManager)
⚫ 任务管理器(TaskManager)
⚫ 分发器(Dispatcher)
4.2 任务提交流程
4.3 任务调度原理
思考:
并行度(Parallelism)
TaskManager 和 Slots
并行子任务的分配
4.3.2 程序与数据流(DataFlow)
4.3.3 执行图(ExecutionGraph)
4.3.4 并行度(Parallelism)
4.3.5 任务链(Operator Chains)
Spark会根据用户提交的计算逻辑中的RDD的转换和动作来生成RDD之间的依赖关系,同时这个计算链也就生成了逻辑上的DAG,遇到宽依赖就划分为一个stage,遇到窄依赖则继续向前找(应用流水线优化,所有的窄依赖是一个Stage)直到把一个DAG划分为多个Stage。
4.0.0
com.guigu.wc
FlinkTutorial
1.0-SNAPSHOT
org.apache.flink
flink-java
1.10.1
org.apache.flink
flink-streaming-java_2.11
1.10.1
org.apache.flink
flink-connector-kafka-0.11_2.11
1.10.1
public class WordCount {
public static void main(String[] args) throws Exception {
ExecutionEnvironment env =ExecutionEnvironment.getExecutionEnvironment();
// 从文件中读取数据
String inputPath = "D:\\javaFlink\\src\\main\\resources\\hello.txt";
DataSet inputDataSet = env.readTextFile(inputPath);
// 对数据集进行处理,按空格分词展开,转换成(word, 1)二元组进行统计
DataSet> wordCountDataSet=
inputDataSet.flatMap(new MyFlatMapper())
.groupBy(0) // 按照第一个位置的word分组
.sum(1); // 将第二个位置上的数据求和
wordCountDataSet.print();
}
}
hello.txt
hello world
hello flink
hello spark
hello scala
how are you
fine thank you
and you
自定义类,实现FlatMapFunction接口
public class MyFlatMapper implements FlatMapFunction> {
@Override
public void flatMap(String value, Collector> out) throws Exception {
// 按空格分词
String[] words = value.split(" ");
// 遍历所有word,包成二元组输出
for (String word : words) {
out.collect(new Tuple2<>(word, 1));
}
}
}
控制台打印
(scala,1)
(you,3)
(flink,1)
(world,1)
(hello,4)
(and,1)
(are,1)
(thank,1)
(fine,1)
(how,1)
(spark,1)
public class StreamWordCount {
public static void main(String[] args) throws Exception {
StreamExecutionEnvironment env =
StreamExecutionEnvironment.getExecutionEnvironment();
DataStream inputDataStream = env.socketTextStream("locahost", 7777);
DataStream> wordCountDataStream = inputDataStream
.flatMap( new MyFlatMapper())
.keyBy(0)
.sum(1);
wordCountDataStream.print().setParallelism(2);
env.execute();
}
}
在linux系统用netcat命令
运行程序控制台打印结果
3.1.1 安装
2.提交Job
并行度优先级:代码设置>job页面设置>集群配置设置
提示:因为socket的IP与端口是在代码中写死的:1.不需要在job页面传参,2.要先起启动nc -lk 7777(不然job启动后会报错)
运行结果
发送数据
控制台打印
linux集群上查看Job任务
命令停止Job
1) 启动 hadoop 集群
集群搭建与启动请参考:大数据框架搭建集群安装配置步骤大全_任错错的博客-CSDN博客_大数据框架搭建
2) 启动 yarn-session
./yarn-session.sh -n 2 -s 2 -jm 1024 -tm 1024 -nm test -d
./flink run -c /home/project/com.atguigu.wc.StreamWordCount
FlinkTutorial-1.0-SNAPSHOT-jar
yarn application --kill application_1615456690948_0001
集群搭建与启动请参考:大数据框架搭建集群安装配置步骤大全_任错错的博客-CSDN博客_大数据框架搭建
启动遇到的错误:
1. The main method caused an error: Could not deploy Yarn job cluster.
System times on machines may be out of sync. Check system time and time zones.
Flink 运行时架构主要包括四个不同的组件,它们会在运行流处理应用程序时协同工作:
具体地,如果我们将 Flink 集群部署到 YARN 上,那么就会有如下的提交流程:
如果是5个子任务用五个slot,当数据量很大的时候,就会出现有的任务资源浪费与有的任务资源紧张 ,并且容易出现数据堆积问题。俗话讲就是:忙的忙死,闲的闲死,因为有的子任务没有复杂的计算只是简单的处理一下数据格式。
(注意:提前必须是前后发生不同的子任务,并行的子任务必须分开,不然提现不到并行度的作用)