Flink常见问题及回答

问题一:

在设置容忍 checkpoint失败次数是0(通过该方法设置environment.getCheckpointConfig().setTolerableCheckpointFailureNumber(0);),重启策略为固定延时重启,重启 100次。

按照源码的理解,设置以上参数之后,如果出现checkpoint 失败,job也会失败,但是经过测试发现,checkpoint连续失败多次,程序还在运行,不知道是什么原因导致容忍 checkpoint 失败次数这个设置没有生效?

【回答】

请参照 fink 社区 user 邮件列表里相关的回答:

http://apache-flink-user-mailing-list-archive.2336050.n4.nabble.com/Making-iob-fail-on-Checkpoint-Expired-td34051.html

目前只有checkpoint declined会被认作continuousFailureCounter

问题二:

在程序消费 kafka,sink 到 kudu 时,由于受到写入kudu 速率的影响,flink程序反压,导致程序消费kafka 也会变慢。这个怎么解决?

【回答】

反压的目的就是要解决读入的数据比写出的数据快太多的问题,因此在这里应该需要解决的是写 Kudu 慢的问题。

问题三:

在用到 keyedstate 时,该状态与 key 绑定,假如设置客户账号为key,那每一个客户都会有一个状态,因为保存状态消耗内存,所以需要有合理的清理状态的动作。

有两种方式清理过期状态,一种设置 ttl,另一种写定时器,但各有利弊。①设置t简便,但是ttl的清理过期状态的策略是当该算子接收到与状态相同 key 的数据时,通过比较时间差是否为过期状态来判断是否清理该状态。

这种情况是,有多少客户账号,就会保存多少状态:最终导致 oom,该方法是不是不适合 key 值过多的状态清理?②)通过定时器可以自定义清理策略,但是定时器的注册本身就消耗资源,因此不适合定时器清理时间内有过多key,就像设置 key 为客户账号的话,如果定时器过期时间设为一天,那么这一天所有账号都会有一个定时器,导致消耗资源过大。这种情况只能通过减小过期时间来应对?比如设置 2分钟。

除此之外,对于 key 数据量过大的情况,有什么更好的清理策略吗?(注:客户号一天会有几百万到上千万不等,目前最多9千万)

【回答】

1、可选择使用 rocksdb 作为 statebackend,可减少内存压力。

2、tt1是有支持后台定期清理的功能,实际的操作可能类似第二种 case。但如果是 rocksdb 则有支持在compaction 的时候做清理的功能

3、可通过一些加入 iitter 来错开不同 key 的定时器触发时间

问题四:

消费 kafka,设置并行度的时候,如果 kafka 分区数是1,并行度只能设置成1比较合适吗?能不能将某些算子并行度不设置成 1?

【回答】

    Kafka Consumer 的算子并行度设置成 1,其他算子可以依需求随意调整,通过分区类型的算子分发到下游算子。

问题五:

Flink 和 confluent schema registry 如何结合实现表结构变更无感。需要提供代码样例。

【回答】

目前 Cloudera Streaming Analytics 不支持 ConfluentSchema Registry,可以使用Cloudera Schema Registry,具体集成方法可以参考《F1ink 集成与使用案例》

问题

Flink 多张动态表实现表关联且不丢失数据,如何避免迟到数据丢失。提供解决方案及代码样例,如涉及内存调整,请给出内存规划。

【回答】

Flink Table API& SOL 目前不支持迟到数据的处理

问题七

之前出现过一个数据量与内存矛盾的问题,比如有一个程序,设置等待时间为 30 分钟,数据超过 30分钟没到达就被丢弃,设置等待时间过长则有可能由于数据量太大导致 oom 的问题,这个怎么解决?

【回答】

建议使用 flink state api来存这个数据。因为 state api可以选择 rocksdb 作为 state backend,所以存储空间的上限就取决于 rocksdb 配置路径的磁盘空间。如果使用window fumction api,可以看看是否可以优化一下,如果计算可以做增量计算,可以只保密 intermediate data。

问题八

如何使用 Flink 消费 Kafka 实现全局有序?

【回答】

只能通过设定并行度1来实现,但是效率会很差。

问题

Flink 读取和写入 hive on hbase 表报错,是否有解决方案?

【回答】

目前 Flink 不支持读写 Hive on HBase 表。

问题

Flink Kafka Producer 开启事务模式后,写入Kafka 之后的 ofset 不连续。产生此现象的原因是什么,有什么避免方案吗?

【回答】

Flink Kafka Producer用的是 native Kafka API,问题跟 Kafka 有关,类似的说明是 Kafka 并没有保证 offset -定的连续,只有保证递增。

问题十一

Flink 能不能提供 remote function 的部署方式,使得这样算子的计算可以和 Flink iob的运行解耦?(即负责计算逻辑的 UDF 和负责提供算力的 Flink 集群是分开的,Flink 节点可以远程调用这些 UDF,这种模式下,可以做到改动 UDF,但是 Flink iob不需要改动的效果。

【回答】

StateFun 应该可以实现这样的部署,但目前也只是部分支持已有 UDF 的动态更新,不支持动态新增 UDF。请查看以下链接:

https://github.com/ververica/flink-statefun-workshophttps://ci.apache.org/projects/flink/flink-statefun-docs-release-2.2/concepts/distributed architecture.html

另外需要注意的是,CSA 目前不支持 StateFun。

  • 8
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一些常见Flink 面试题以及答案: 1. 什么是 FlinkFlink 是一个分布式数据流处理框架,它可以在批处理和流处理模式下运行,并提供了高效的状态管理和窗口操作,以及支持 SQL 和 Table API 等高级特性。 2. Flink 的优势是什么? Flink 具有以下优势: - Flink 提供了低延迟、高吞吐量的流处理能力,同时也支持批处理模式; - Flink 提供了高效的状态管理和窗口操作,可以轻松地进行复杂的数据处理; - Flink 提供了 SQL 和 Table API 等高级特性,方便用户进行数据分析和处理; - Flink 支持多种部署模式,可以在本地、集群和云环境中运行。 3. Flink 的核心概念是什么? Flink 的核心概念包括: - 数据流(DataStream):代表无限的数据流,可以进行实时处理; - 数据集(DataSet):代表有限的数据集合,可以进行批处理; - 窗口(Window):用于将无限的数据流切分成有限的数据块,以便进行有限的处理; - 状态(State):用于保存中间计算结果; - 迭代(Iteration):用于迭代计算,例如图计算等; - 触发器(Trigger):用于触发窗口计算; - 并行度(Parallelism):代表任务并行执行的程度。 4. Flink 如何保证数据的 Exactly-Once 语义? Flink 通过使用 Checkpoints 和 Savepoints 两种机制来保证数据的 Exactly-Once 语义。Checkpoints 机制通过定期将状态和数据写入外部存储来实现,以便在发生故障时能够恢复到最近一次的 Checkpoint。Savepoints 机制则允许用户手动创建一个保存点,并将状态和数据写入外部存储,以便在需要时能够回滚到该保存点。 5. Flink 支持哪些数据源和数据接收器? Flink 支持从 Kafka、Hadoop、HDFS、Kinesis、RabbitMQ、Twitter、Socket 等数据源读取数据,并支持将数据输出到 Kafka、Hadoop、HDFS、Elasticsearch、JDBC、Socket 等数据接收器。 6. Flink 的 SQL 和 Table API 如何使用? Flink 的 SQL 和 Table API 可以通过将数据流或数据集转换为 Table,并使用 SQL 或 Table API 进行查询和处理。例如: ```java StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment(); StreamTableEnvironment tableEnv = StreamTableEnvironment.create(env); DataStream<Tuple2<String, Integer>> dataStream = env.fromElements( new Tuple2<>("a", 1), new Tuple2<>("b", 2), new Tuple2<>("a", 3) ); Table table = tableEnv.fromDataStream(dataStream, "word, count"); Table resultTable = table.groupBy("word").select("word, count.sum as total"); DataStream<Tuple2<Boolean, Row>> resultStream = tableEnv.toRetractStream(resultTable, Row.class); resultStream.print(); env.execute(); ``` 7. Flink 的窗口操作有哪些类型? Flink 的窗口操作包括: - 滚动窗口(Tumbling Window):将数据流按固定大小的窗口切分,不重叠; - 滑动窗口(Sliding Window):将数据流按固定大小的窗口切分,可以重叠; - 会话窗口(Session Window):将数据流按一定时间间隔内的活动时间切分,可以动态调整窗口大小。 8. Flink 如何处理数据倾斜问题Flink 可以通过以下方式处理数据倾斜问题: - 增大并行度:将任务并行度增加到足够大,可以让数据均匀分布到不同的任务中; - 重分区:通过对数据进行重分区,将数据均匀分布到不同的分区中; - 随机键:对于数据倾斜的键,可以使用一些随机的键来将数据分散到不同的分区中; - 本地聚合:对于数据量较小的键,可以在每个 Task 内部进行本地聚合,以减少数据传输。 9. Flink 如何进行流的 Join 操作? Flink 支持多种流的 Join 操作,包括: - Inner Join:将两个流中的相同键进行 Join 操作; - Left Join:将左侧流中的所有数据与右侧流中的相同键进行 Join 操作; - Right Join:将右侧流中的所有数据与左侧流中的相同键进行 Join 操作; - Full Join:将左侧流和右侧流中的所有数据进行 Join 操作。 10. Flink 如何进行流的 Split 和 Select 操作? Flink 的 Split 和 Select 操作可以将一个数据流拆分成多个数据流,并对每个数据流应用不同的操作。例如: ```java SplitStream<Tuple2<String, Integer>> splitStream = dataStream .split((OutputSelector<Tuple2<String, Integer>>) value -> { List<String> output = new ArrayList<>(); if (value.f1 % 2 == 0) { output.add("even"); } else { output.add("odd"); } return output; }); DataStream<Tuple2<String, Integer>> evenStream = splitStream.select("even"); DataStream<Tuple2<String, Integer>> oddStream = splitStream.select("odd"); ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值