1. 一句话描述Flink
有状态的流式计算框架
2. 手写Wordcount程序
package com.atguigu.flink.wordcount;
import org.apache.flink.api.common.functions.FlatMapFunction;
import org.apache.flink.api.common.typeinfo.TypeHint;
import org.apache.flink.api.common.typeinfo.TypeInformation;
import org.apache.flink.api.common.typeinfo.Types;
import org.apache.flink.api.java.functions.KeySelector;
import org.apache.flink.api.java.tuple.Tuple2;
import org.apache.flink.api.java.utils.ParameterTool;
import org.apache.flink.streaming.api.datastream.DataStreamSource;
import org.apache.flink.streaming.api.datastream.KeyedStream;
import org.apache.flink.streaming.api.datastream.SingleOutputStreamOperator;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.util.Collector;
/**
* @author WEIYUNHUI
* @date 2023/6/10 11:15
*
* Lambda表达式写法
*
* 泛型擦除问题:
* The generic type parameters of 'Collector' are missing.
* In many cases lambda methods don't provide enough information for automatic type extraction when Java generics are involved.
*
* The return type of function 'main(Flink05_LambdaWordCount.java:34)' could not be determined automatically,due to type erasure.
* You can give type information hints by using the returns(...) method on the result of the transformation call,
* or by letting your function implement the 'ResultTypeQueryable' interface.
*
*
* 解决方案:
* 在调用完转换算子后, 如果存在泛型擦除问题, 可以通过调用returns()方法, 明确指定类型即可。
* returns(Class<T> typeClass) : 明确指定类型。通过Class来指定。一般适用于明确的类(类中不包含泛型)
* returns(TypeHint<T> typeHint): 适用于任何情况。 通过TypeHit来明确指定类型。
* returns(TypeInformation<T> typeInfo) : 适用于任何情况,通过TypeInformation来明确类型。
*
*
*/
public class Flink05_LambdaWordCount {
public static void main(String[] args) throws Exception {
// 1. 创建执行环境
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
//设置并行度
env.setParallelism(1) ;
// 2.读取数据
// DataStreamSource => DataStream
DataStreamSource<String> ds = env.socketTextStream("hadoop102", 8888) ;
// 3.转换处理
// 3.1 切分数据, 处理成(word, 1)
SingleOutputStreamOperator<Tuple2<String, Integer>> flatMapDs = ds.flatMap(
//lambda写法
(String line, Collector<Tuple2<String, Integer>> out) -> {
String[] words = line.split(" ");
for (String word : words) {
out.collect(Tuple2.of(word, 1));
}
}
).returns(Types.TUPLE(Types.STRING , Types.INT));
/*
.returns(new TypeHint<Tuple2<String, Integer>>() {
@Override
public TypeInformation<Tuple2<String, Integer>> getTypeInfo() {
return super.getTypeInfo();
}
});
*/
// 3.2 按照单词分组
KeyedStream<Tuple2<String, Integer>, String> keyByDs = flatMapDs.keyBy(
tuple -> tuple.f0
);
// 3.3 汇总
// 使用Tuple中的第二个元素进行汇总
SingleOutputStreamOperator<Tuple2<String, Integer>> sumDs = keyByDs.sum(1);
// 4. 输出结果
sumDs.print();
// 5. 启动执行
env.execute();
}
}
3. 简述Flink的三种部署模式及区别
- 会话模式
可以提交多个job到集群,要求每个job执行时间短 - 单作业模式
1个job对应一个集群,main方法在client端执行 - 应用模式
1个job对应一个集群,main方法在jobManager执行
区别:单作业模式已经不用了,在生产中,需要根据实际情况选择模式,如果job比较大,运行时间长,选择应用模式,如果job比较多,运行时间短,选择会话模式
4. 简述并行度的概念及设置方式
并行度是指算子的并行程度
- 可以在算子后面设置
- 在代码中,全局设置
- 在提交job时设置
- 在配置文件中设置
5. 简述算子链的概念、合并算子链的条件、如何禁用算子链
概念:把多个算子合并,就称为算子链
条件:2个算子的并行度相同,分发规则为forword
禁用:
- 可以在代码中使用startNewChain,开启一个新链
- 可以在算子后面调用禁用方法
- 可以在代码中全局禁用
6. 一个作业的并行度如何确定?一个作业需要多少个slot如何确定?
- 并行度最大的算子的并行度,就是一个作业的并行度
- slot,根据并行度最大的算子的并行度确定