新增備案網(wǎng)站常見的網(wǎng)絡(luò)推廣方式包括
一閃在摸爬滾打了數(shù)年后,結(jié)合去年獲得了個(gè)優(yōu)秀員工,現(xiàn)在負(fù)責(zé)數(shù)據(jù)開發(fā)一面。
神州員工:一閃,你們還缺人不,不想當(dāng)外包了。
一閃:我只負(fù)責(zé)招開發(fā),實(shí)施的招聘我參與不了哇。(所以你能不能練練普通話,廣普聽著總是怪怪的)
老員工:一閃,今天下午一點(diǎn)半面試一個(gè)甲方的中級(jí)開發(fā),招進(jìn)來(lái)寫Flink。
一閃:(又可以摸魚了)簡(jiǎn)歷發(fā)我看看。
-- 5年工作經(jīng)驗(yàn),簡(jiǎn)歷中規(guī)中矩,應(yīng)該是個(gè)老實(shí)人。熟悉的語(yǔ)言是Java,那么就不問Scala了,打工人何苦為難打工人,面試搞得花里胡哨沒意思。(不過是甲方面試,還是要謹(jǐn)慎些,不能和面試外包一樣搗糨糊了)
一閃早早的就到了會(huì)議室,進(jìn)入了騰訊會(huì)議,等著受害人小伙子上線。結(jié)果小伙子剛進(jìn)入騰訊會(huì)議,人資小姐姐也進(jìn)了會(huì)議室,坐在了一閃的邊上??磥?lái)最近行業(yè)確實(shí)不好,招個(gè)中級(jí)開發(fā)都需要hr監(jiān)督了。(不要問hr小姐姐好不好看,問就是好看)
(以下省略雙方一段客套話和自我介紹)
一閃:今天我們主要就是從三個(gè)方面來(lái)做這個(gè)面試
①我看你簡(jiǎn)歷上是熟悉Java,所以我會(huì)和你簡(jiǎn)單聊一下有關(guān)的知識(shí)。
②我們這個(gè)崗位主要是負(fù)責(zé)之后我們實(shí)時(shí)模塊的開發(fā),所以考察一下你Flink有關(guān)的技術(shù)。
③我看你是有5年的工作經(jīng)驗(yàn),咱們還可以分享一下在項(xiàng)目中遇到的一些特殊場(chǎng)景,互相學(xué)習(xí)下。
總之我們氣氛是比較輕松的,不用緊張。
小伙:好的好的。
一閃:在你開發(fā)的時(shí)候,一般是怎么創(chuàng)建線程池的?
小伙:公司里是強(qiáng)制要求使用ThreadPoolExecutor的。這個(gè)方式也比較方便。
一閃:具體聊聊呢,比如說其他的方式有什么不足,這個(gè)方式好在哪里呢?(這小伙咋話只說一半)
小伙:這個(gè)方式的靈活性比較高,可以自定義一些參數(shù),其他的方式做不到。而且阿里的開發(fā)手冊(cè)里面也要求了不能使用Executor提供的工廠類。
-- 臥槽,內(nèi)心一震,看了看小伙的簡(jiǎn)歷,這小伙也不是阿里出來(lái)的啊,看來(lái)有點(diǎn)東西。
一閃:接下來(lái)問的問題,你可以適當(dāng)拓展一下,需要詳細(xì)溝通的地方我會(huì)再追問你一下哈。(各位家人,面試一定要學(xué)會(huì)拓展,一個(gè)helloworld也能拓展到reflect)咱們聊聊你在現(xiàn)在的工作中實(shí)時(shí)數(shù)倉(cāng)的架構(gòu)吧,包括上下游和用到了哪些技術(shù)?
小伙:上游接的是kafka Topic,相當(dāng)于是ods層。然后通過flink計(jì)算輸出了cdm層和ads層,然后將結(jié)果數(shù)據(jù)存到了olap數(shù)據(jù)庫(kù)clickhouse。在cdm層中我們使用了旁路緩存來(lái)關(guān)聯(lián)維表,提高了效率;也使用到了CEP技術(shù)來(lái)處理復(fù)雜的事件。舉個(gè)例子吧,我們比如說要算一個(gè)商品的實(shí)時(shí)營(yíng)收,我們先從kafka topic里面把訂單數(shù)據(jù)拿出來(lái),然后通過interval join把訂單主子表合并,關(guān)聯(lián)維度,再將數(shù)據(jù)聚合到我們想要的維度,然后clickhouse中的表設(shè)置主鍵模型,我們把結(jié)果數(shù)據(jù)直接寫入,然后給前端展示就ok了。此外,我們還實(shí)現(xiàn)了精準(zhǔn)一次性。
一閃:(感覺還行啊)那你舉例了一個(gè)商品營(yíng)收的指標(biāo),那這個(gè)商品的營(yíng)收金額其實(shí)就是這個(gè)商品的一個(gè)state吧,講講你對(duì)于flink中state的理解呢?
小伙:大類就分成鍵控和算子兩種類型吧,state就是存在狀態(tài)后端的,故障恢復(fù)的時(shí)候都會(huì)用的到。
AI大模型給出的答案↓可供參考在 Apache Flink 中,State(狀態(tài))是指在流處理應(yīng)用程序中維護(hù)和管理的數(shù)據(jù)。State 允許應(yīng)用程序存儲(chǔ)和訪問與特定鍵相關(guān)聯(lián)的數(shù)據(jù),以便跟蹤和處理輸入流中的信息。State 可以在不同的操作之間共享和傳遞,使得 Flink 應(yīng)用能夠處理更加復(fù)雜的業(yè)務(wù)邏輯和狀態(tài)管理。
具體來(lái)說,Flink 中的 State 分為兩種類型:
Keyed State(鍵控狀態(tài)): Keyed State 是與特定鍵(key)相關(guān)聯(lián)的狀態(tài)。在 Flink 中,數(shù)據(jù)流被劃分為不同的 key 分區(qū),同一個(gè) key 的所有數(shù)據(jù)會(huì)被分配到同一個(gè)任務(wù)處理。Keyed State 可以存儲(chǔ)每個(gè) key 對(duì)應(yīng)的數(shù)據(jù),以便在處理過程中進(jìn)行訪問和更新。常見的 Keyed State 類型包括 ValueState、ListState、MapState 和 ReducingState。
Operator State(算子狀態(tài)): Operator State 是與整個(gè)操作符(operator)相關(guān)聯(lián)的狀態(tài)。Operator State 可用于在同一操作符的不同子任務(wù)之間共享狀態(tài)信息,或者在操作符重啟時(shí)恢復(fù)狀態(tài)。常見的 Operator State 類型包括 ListState 和 BroadcastState。
在 Flink 應(yīng)用程序中,State 起著重要的作用,可以用來(lái)實(shí)現(xiàn)狀態(tài)管理、窗口操作、事件處理和容錯(cuò)恢復(fù)等功能。通過使用 State,Flink 應(yīng)用可以跟蹤和維護(hù)數(shù)據(jù)流中的狀態(tài)信息,以實(shí)現(xiàn)高效、可靠的流處理邏輯。
需要注意的是,State 在 Flink 中是有狀態(tài)后端(State Backend)支持的,State 可以被存儲(chǔ)在內(nèi)存、文件系統(tǒng)或外部存儲(chǔ)中,以便實(shí)現(xiàn)高性能和可靠性的狀態(tài)管理。通過合理選擇和配置狀態(tài)后端,可以滿足不同場(chǎng)景下的狀態(tài)管理需求。
-- 叼毛,這小伙展開說說能少兩斤肉嗎,不過講的倒也沒錯(cuò)
一閃:那你提到了故障恢復(fù),你們一般面對(duì)flink故障的話是如何處理的呢?
小伙:就直接從最新狀態(tài)恢復(fù)的,因?yàn)槲覀兌加信渲胏heckpoint。
一閃:那你了解savepoint嗎,它和ck有啥異同?
小伙:這個(gè)聽說過,具體倒不是很了解。。。。
AI大模型給出的答案↓可供參考
在 Apache Flink 中,Savepoint(保存點(diǎn))和Checkpoint(檢查點(diǎn))是兩種不同的機(jī)制,用于實(shí)現(xiàn)容錯(cuò)和恢復(fù)的功能。它們之間的主要異同點(diǎn)如下:相同點(diǎn):
1. 容錯(cuò)機(jī)制:Savepoint 和 Checkpoint 都是用于實(shí)現(xiàn)容錯(cuò)性,即在發(fā)生故障時(shí)能夠恢復(fù)應(yīng)用程序的狀態(tài)并繼續(xù)處理數(shù)據(jù)。
2. 狀態(tài)快照:Savepoint 和 Checkpoint 都會(huì)對(duì)應(yīng)用程序的狀態(tài)進(jìn)行快照,保存數(shù)據(jù)流處理過程中的狀態(tài)信息。不同點(diǎn):
1. 觸發(fā)方式:- Checkpoint: Checkpoint 是由 Flink 自動(dòng)周期性觸發(fā)的,用于持久化應(yīng)用程序的狀態(tài)。Checkpoint 可以配置間隔時(shí)間和條件,例如基于記錄數(shù)或時(shí)間間隔。- Savepoint: Savepoint 是由用戶手動(dòng)觸發(fā)的,用于主動(dòng)保存應(yīng)用程序的狀態(tài)。用戶可以在需要時(shí)手動(dòng)創(chuàng)建 Savepoint,通常用于應(yīng)用程序更新、遷移或調(diào)試等場(chǎng)景。2. 存儲(chǔ)位置:- Checkpoint: Checkpoint 的狀態(tài)信息通常存儲(chǔ)在配置的狀態(tài)后端(State Backend)中,如內(nèi)存、文件系統(tǒng)或遠(yuǎn)程存儲(chǔ)。- Savepoint: Savepoint 的狀態(tài)信息會(huì)被持久化到可靠的持久化存儲(chǔ)介質(zhì)(如分布式文件系統(tǒng)),以便長(zhǎng)期保存狀態(tài)并支持應(yīng)用程序的恢復(fù)。3. 作用范圍:- Checkpoint: Checkpoint 主要用于實(shí)現(xiàn)應(yīng)用程序的容錯(cuò)性,并在故障恢復(fù)時(shí)使用。Checkpoint 通常是短期保存,不適用于長(zhǎng)期保存狀態(tài)或應(yīng)用更新。- Savepoint: Savepoint 主要用于保存應(yīng)用程序的狀態(tài),可以被長(zhǎng)期保存并用于應(yīng)用程序更新、遷移、降級(jí)、調(diào)試等場(chǎng)景??偟膩?lái)說,Checkpoint 是 Flink 內(nèi)部使用的容錯(cuò)機(jī)制,用于實(shí)現(xiàn)應(yīng)用程序的容錯(cuò)性和故障恢復(fù);而 Savepoint 則是由用戶主動(dòng)觸發(fā)的保存點(diǎn)機(jī)制,可以用于保存應(yīng)用程序狀態(tài)以支持應(yīng)用程序的更新和管理。兩者共同為 Flink 提供了強(qiáng)大的容錯(cuò)和狀態(tài)管理能力。
一閃:那你剛剛還提到了主子表關(guān)聯(lián),聊聊你在flink中多流關(guān)聯(lián)的實(shí)踐呢?
(這個(gè)問題小伙回答的有點(diǎn)爛,我就直接展示大模型的答案吧↓)
AI大模型給出的答案↓可供參考
Flink 的 Join Hint 用于優(yōu)化 Join 操作的執(zhí)行策略。通過提供 Hint,你可以指導(dǎo) Flink 選擇更合適的執(zhí)行計(jì)劃,從而提高 Join 的性能。Flink 主要支持以下幾種 Join Hint:BROADCAST_HASH_FIRST(table1): 將 table1 廣播到所有參與 Join 的節(jié)點(diǎn)上,并使用 Hash Join 算法。這種方式適用于 table1 數(shù)據(jù)量較小的情況,可以避免數(shù)據(jù) shuffle,從而提高 Join 效率。BROADCAST_HASH_SECOND(table2): 將 table2 廣播到所有參與 Join 的節(jié)點(diǎn)上,并使用 Hash Join 算法。這種方式適用于 table2 數(shù)據(jù)量較小的情況。REPARTITION_HASH_FIRST(table1): 對(duì) table1 進(jìn)行重新分區(qū),并使用 Hash Join 算法。這種方式適用于 table1 數(shù)據(jù)量較大,且數(shù)據(jù)分布不均勻的情況。REPARTITION_HASH_SECOND(table2): 對(duì) table2 進(jìn)行重新分區(qū),并使用 Hash Join 算法。這種方式適用于 table2 數(shù)據(jù)量較大,且數(shù)據(jù)分布不均勻的情況。REPARTITION_SORT_MERGE_JOIN(table1, table2): 對(duì) table1 和 table2 進(jìn)行重新分區(qū),并使用 Sort-Merge Join 算法。這種方式適用于 table1 和 table2 數(shù)據(jù)量都較大的情況。使用方法:在 Flink SQL 中,你可以使用 /*+ ... */ 的語(yǔ)法來(lái)添加 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;
注意事項(xiàng):Join Hint 只是建議,Flink 并不保證一定會(huì)按照 Hint 的指示執(zhí)行。Flink 的優(yōu)化器會(huì)根據(jù)實(shí)際情況選擇最優(yōu)的執(zhí)行計(jì)劃。
使用不當(dāng)?shù)?Join Hint 可能會(huì)降低性能。因此,在使用 Join Hint 之前,最好先進(jìn)行測(cè)試和評(píng)估。
并非所有版本的 Flink 都支持所有類型的 Join Hint,請(qǐng)參考 Flink 官方文檔了解所使用版本的具體支持情況。
通過合理地使用 Join Hint,可以幫助 Flink 優(yōu)化 Join 操作,提高應(yīng)用程序的性能。 建議根據(jù)具體的數(shù)據(jù)量和數(shù)據(jù)分布情況選擇合適的 Join Hint。 實(shí)際應(yīng)用中,可以通過觀察執(zhí)行計(jì)劃和性能指標(biāo)來(lái)判斷 Join Hint 是否有效。
----------
后面還扯了些有的沒的,如果是高級(jí)開發(fā),那我肯定就否了,但是中級(jí)開發(fā),我覺得要求沒那么高,我就給通過了.............
----------
后來(lái)小伙被人資小姐姐確定為培訓(xùn)班出身,工作經(jīng)驗(yàn)是假的,毫不猶豫地pass了.......
老程序員(二面面試官):年輕人,抬手不是抱歉,是你還得練。
----------
后話:面試一定要聊深點(diǎn),最好還能帶上點(diǎn)源碼,說不定就把我這個(gè)年輕人唬住了呢。