网站怎么做后台百度关键词价格查询软件
一闪在摸爬滚打了数年后,结合去年获得了个优秀员工,现在负责数据开发一面。
神州员工:一闪,你们还缺人不,不想当外包了。
一闪:我只负责招开发,实施的招聘我参与不了哇。(所以你能不能练练普通话,广普听着总是怪怪的)
老员工:一闪,今天下午一点半面试一个甲方的中级开发,招进来写Flink。
一闪:(又可以摸鱼了)简历发我看看。
-- 5年工作经验,简历中规中矩,应该是个老实人。熟悉的语言是Java,那么就不问Scala了,打工人何苦为难打工人,面试搞得花里胡哨没意思。(不过是甲方面试,还是要谨慎些,不能和面试外包一样捣糨糊了)
一闪早早的就到了会议室,进入了腾讯会议,等着受害人小伙子上线。结果小伙子刚进入腾讯会议,人资小姐姐也进了会议室,坐在了一闪的边上。看来最近行业确实不好,招个中级开发都需要hr监督了。(不要问hr小姐姐好不好看,问就是好看)
(以下省略双方一段客套话和自我介绍)
一闪:今天我们主要就是从三个方面来做这个面试
①我看你简历上是熟悉Java,所以我会和你简单聊一下有关的知识。
②我们这个岗位主要是负责之后我们实时模块的开发,所以考察一下你Flink有关的技术。
③我看你是有5年的工作经验,咱们还可以分享一下在项目中遇到的一些特殊场景,互相学习下。
总之我们气氛是比较轻松的,不用紧张。
小伙:好的好的。
一闪:在你开发的时候,一般是怎么创建线程池的?
小伙:公司里是强制要求使用ThreadPoolExecutor的。这个方式也比较方便。
一闪:具体聊聊呢,比如说其他的方式有什么不足,这个方式好在哪里呢?(这小伙咋话只说一半)
小伙:这个方式的灵活性比较高,可以自定义一些参数,其他的方式做不到。而且阿里的开发手册里面也要求了不能使用Executor提供的工厂类。
-- 卧槽,内心一震,看了看小伙的简历,这小伙也不是阿里出来的啊,看来有点东西。
一闪:接下来问的问题,你可以适当拓展一下,需要详细沟通的地方我会再追问你一下哈。(各位家人,面试一定要学会拓展,一个helloworld也能拓展到reflect)咱们聊聊你在现在的工作中实时数仓的架构吧,包括上下游和用到了哪些技术?
小伙:上游接的是kafka Topic,相当于是ods层。然后通过flink计算输出了cdm层和ads层,然后将结果数据存到了olap数据库clickhouse。在cdm层中我们使用了旁路缓存来关联维表,提高了效率;也使用到了CEP技术来处理复杂的事件。举个例子吧,我们比如说要算一个商品的实时营收,我们先从kafka topic里面把订单数据拿出来,然后通过interval join把订单主子表合并,关联维度,再将数据聚合到我们想要的维度,然后clickhouse中的表设置主键模型,我们把结果数据直接写入,然后给前端展示就ok了。此外,我们还实现了精准一次性。
一闪:(感觉还行啊)那你举例了一个商品营收的指标,那这个商品的营收金额其实就是这个商品的一个state吧,讲讲你对于flink中state的理解呢?
小伙:大类就分成键控和算子两种类型吧,state就是存在状态后端的,故障恢复的时候都会用的到。
AI大模型给出的答案↓可供参考在 Apache Flink 中,State(状态)是指在流处理应用程序中维护和管理的数据。State 允许应用程序存储和访问与特定键相关联的数据,以便跟踪和处理输入流中的信息。State 可以在不同的操作之间共享和传递,使得 Flink 应用能够处理更加复杂的业务逻辑和状态管理。
具体来说,Flink 中的 State 分为两种类型:
Keyed State(键控状态): Keyed State 是与特定键(key)相关联的状态。在 Flink 中,数据流被划分为不同的 key 分区,同一个 key 的所有数据会被分配到同一个任务处理。Keyed State 可以存储每个 key 对应的数据,以便在处理过程中进行访问和更新。常见的 Keyed State 类型包括 ValueState、ListState、MapState 和 ReducingState。
Operator State(算子状态): Operator State 是与整个操作符(operator)相关联的状态。Operator State 可用于在同一操作符的不同子任务之间共享状态信息,或者在操作符重启时恢复状态。常见的 Operator State 类型包括 ListState 和 BroadcastState。
在 Flink 应用程序中,State 起着重要的作用,可以用来实现状态管理、窗口操作、事件处理和容错恢复等功能。通过使用 State,Flink 应用可以跟踪和维护数据流中的状态信息,以实现高效、可靠的流处理逻辑。
需要注意的是,State 在 Flink 中是有状态后端(State Backend)支持的,State 可以被存储在内存、文件系统或外部存储中,以便实现高性能和可靠性的状态管理。通过合理选择和配置状态后端,可以满足不同场景下的状态管理需求。
-- 叼毛,这小伙展开说说能少两斤肉吗,不过讲的倒也没错
一闪:那你提到了故障恢复,你们一般面对flink故障的话是如何处理的呢?
小伙:就直接从最新状态恢复的,因为我们都有配置checkpoint。
一闪:那你了解savepoint吗,它和ck有啥异同?
小伙:这个听说过,具体倒不是很了解。。。。
AI大模型给出的答案↓可供参考
在 Apache Flink 中,Savepoint(保存点)和Checkpoint(检查点)是两种不同的机制,用于实现容错和恢复的功能。它们之间的主要异同点如下:相同点:
1. 容错机制:Savepoint 和 Checkpoint 都是用于实现容错性,即在发生故障时能够恢复应用程序的状态并继续处理数据。
2. 状态快照:Savepoint 和 Checkpoint 都会对应用程序的状态进行快照,保存数据流处理过程中的状态信息。不同点:
1. 触发方式:- Checkpoint: Checkpoint 是由 Flink 自动周期性触发的,用于持久化应用程序的状态。Checkpoint 可以配置间隔时间和条件,例如基于记录数或时间间隔。- Savepoint: Savepoint 是由用户手动触发的,用于主动保存应用程序的状态。用户可以在需要时手动创建 Savepoint,通常用于应用程序更新、迁移或调试等场景。2. 存储位置:- Checkpoint: Checkpoint 的状态信息通常存储在配置的状态后端(State Backend)中,如内存、文件系统或远程存储。- Savepoint: Savepoint 的状态信息会被持久化到可靠的持久化存储介质(如分布式文件系统),以便长期保存状态并支持应用程序的恢复。3. 作用范围:- Checkpoint: Checkpoint 主要用于实现应用程序的容错性,并在故障恢复时使用。Checkpoint 通常是短期保存,不适用于长期保存状态或应用更新。- Savepoint: Savepoint 主要用于保存应用程序的状态,可以被长期保存并用于应用程序更新、迁移、降级、调试等场景。总的来说,Checkpoint 是 Flink 内部使用的容错机制,用于实现应用程序的容错性和故障恢复;而 Savepoint 则是由用户主动触发的保存点机制,可以用于保存应用程序状态以支持应用程序的更新和管理。两者共同为 Flink 提供了强大的容错和状态管理能力。
一闪:那你刚刚还提到了主子表关联,聊聊你在flink中多流关联的实践呢?
(这个问题小伙回答的有点烂,我就直接展示大模型的答案吧↓)
AI大模型给出的答案↓可供参考
Flink 的 Join Hint 用于优化 Join 操作的执行策略。通过提供 Hint,你可以指导 Flink 选择更合适的执行计划,从而提高 Join 的性能。Flink 主要支持以下几种 Join Hint:BROADCAST_HASH_FIRST(table1): 将 table1 广播到所有参与 Join 的节点上,并使用 Hash Join 算法。这种方式适用于 table1 数据量较小的情况,可以避免数据 shuffle,从而提高 Join 效率。BROADCAST_HASH_SECOND(table2): 将 table2 广播到所有参与 Join 的节点上,并使用 Hash Join 算法。这种方式适用于 table2 数据量较小的情况。REPARTITION_HASH_FIRST(table1): 对 table1 进行重新分区,并使用 Hash Join 算法。这种方式适用于 table1 数据量较大,且数据分布不均匀的情况。REPARTITION_HASH_SECOND(table2): 对 table2 进行重新分区,并使用 Hash Join 算法。这种方式适用于 table2 数据量较大,且数据分布不均匀的情况。REPARTITION_SORT_MERGE_JOIN(table1, table2): 对 table1 和 table2 进行重新分区,并使用 Sort-Merge Join 算法。这种方式适用于 table1 和 table2 数据量都较大的情况。使用方法:在 Flink SQL 中,你可以使用 /*+ ... */ 的语法来添加 Join Hint。例如:sql
SELECT *
FROM table1
/*+ BROADCAST_HASH_FIRST(table1) */ -- 将 table1 广播
JOIN table2
ON table1.id = table2.id;SELECT *
FROM tableA
/*+ REPARTITION_SORT_MERGE_JOIN(tableA, tableB) */ -- 使用 Sort-Merge Join
JOIN tableB
ON tableA.key = tableB.key;
注意事项:Join Hint 只是建议,Flink 并不保证一定会按照 Hint 的指示执行。Flink 的优化器会根据实际情况选择最优的执行计划。
使用不当的 Join Hint 可能会降低性能。因此,在使用 Join Hint 之前,最好先进行测试和评估。
并非所有版本的 Flink 都支持所有类型的 Join Hint,请参考 Flink 官方文档了解所使用版本的具体支持情况。
通过合理地使用 Join Hint,可以帮助 Flink 优化 Join 操作,提高应用程序的性能。 建议根据具体的数据量和数据分布情况选择合适的 Join Hint。 实际应用中,可以通过观察执行计划和性能指标来判断 Join Hint 是否有效。
----------
后面还扯了些有的没的,如果是高级开发,那我肯定就否了,但是中级开发,我觉得要求没那么高,我就给通过了.............
----------
后来小伙被人资小姐姐确定为培训班出身,工作经验是假的,毫不犹豫地pass了.......
老程序员(二面面试官):年轻人,抬手不是抱歉,是你还得练。
----------
后话:面试一定要聊深点,最好还能带上点源码,说不定就把我这个年轻人唬住了呢。