Flink每日一考

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的三种部署模式及区别

  1. 会话模式
    可以提交多个job到集群,要求每个job执行时间短
  2. 单作业模式
    1个job对应一个集群,main方法在client端执行
  3. 应用模式
    1个job对应一个集群,main方法在jobManager执行
    区别:单作业模式已经不用了,在生产中,需要根据实际情况选择模式,如果job比较大,运行时间长,选择应用模式,如果job比较多,运行时间短,选择会话模式

4. 简述并行度的概念及设置方式

并行度是指算子的并行程度

  1. 可以在算子后面设置
  2. 在代码中,全局设置
  3. 在提交job时设置
  4. 在配置文件中设置

5. 简述算子链的概念、合并算子链的条件、如何禁用算子链

概念:把多个算子合并,就称为算子链
条件:2个算子的并行度相同,分发规则为forword
禁用:

  1. 可以在代码中使用startNewChain,开启一个新链
  2. 可以在算子后面调用禁用方法
  3. 可以在代码中全局禁用

6. 一个作业的并行度如何确定?一个作业需要多少个slot如何确定?

  1. 并行度最大的算子的并行度,就是一个作业的并行度
  2. slot,根据并行度最大的算子的并行度确定

7. 手绘Yarn应用模式作业提交流程

点击这里查看

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值