大數(shù)據(jù)開發(fā)校招面試全攻略:考點(diǎn)拆解與避坑指南)
說(shuō)實(shí)話校招面大數(shù)據(jù)開發(fā)崗最難的不是那些框架八股而是你根本不知道面試官真正想聽(tīng)到什么。我自己是雙非本秋招投了四十多家美團(tuán)這條線從筆試到拿offer一共走了一個(gè)半月中間經(jīng)歷了三次技術(shù)面加一輪HR面幾乎把網(wǎng)上能找到的所有大數(shù)據(jù)面經(jīng)都翻了個(gè)遍也吃了不少虧。今天把這段經(jīng)歷完整復(fù)盤一下重點(diǎn)說(shuō)說(shuō)我自己怎么拆解“美團(tuán)大數(shù)據(jù)開發(fā)工程師”這個(gè)崗位、面試中真實(shí)被問(wèn)到的高頻考點(diǎn)、以及我踩過(guò)的坑。這篇內(nèi)容適合正在準(zhǔn)備大數(shù)據(jù)校招的朋友無(wú)論是科班還是轉(zhuǎn)碼只要你目標(biāo)是大數(shù)據(jù)開發(fā)工程師可以參考我的備戰(zhàn)思路。我會(huì)按“崗位理解—考點(diǎn)拆解—實(shí)操?gòu)?fù)盤—項(xiàng)目包裝—避坑指南”的順序?qū)憙?nèi)容比較詳細(xì)建議收藏后慢慢看。1. 崗位理解與整體備戰(zhàn)思路1.1 美團(tuán)大數(shù)據(jù)開發(fā)到底在做什么先說(shuō)我自己對(duì)美團(tuán)大數(shù)據(jù)開發(fā)崗的理解。美團(tuán)這類互聯(lián)網(wǎng)公司的數(shù)據(jù)開發(fā)核心工作不是寫SQL取數(shù)而是搭建和維護(hù)數(shù)據(jù)鏈路讓業(yè)務(wù)方能穩(wěn)定、高效地拿到想要的數(shù)據(jù)。具體來(lái)說(shuō)有三塊數(shù)據(jù)倉(cāng)庫(kù)建設(shè)就是做分層建模把業(yè)務(wù)庫(kù)的數(shù)據(jù)同步到數(shù)倉(cāng)然后按主題域加工成各種寬表和匯總表數(shù)據(jù)管道開發(fā)涉及實(shí)時(shí)和離線兩條線離線用Hive/Spark跑T1任務(wù)實(shí)時(shí)用Flink消費(fèi)Kafka數(shù)據(jù)處理完寫進(jìn)HBase、Doris或者M(jìn)ySQL供下游查詢數(shù)據(jù)質(zhì)量保障包括任務(wù)監(jiān)控、數(shù)據(jù)對(duì)賬、延遲告警這些都是日常運(yùn)維的重要部分。美團(tuán)有個(gè)明顯的業(yè)務(wù)特點(diǎn)外賣、到店、酒旅這些業(yè)務(wù)的數(shù)據(jù)量大、時(shí)效性要求高而且經(jīng)常有大促活動(dòng)比如節(jié)假日峰值流量。所以面試官特別看重候選人對(duì)高峰值、高并發(fā)場(chǎng)景的處理能力比如數(shù)據(jù)傾斜怎么解決、實(shí)時(shí)任務(wù)怎么保證不丟不重、離線任務(wù)怎么優(yōu)化調(diào)度。這一點(diǎn)貫穿了我所有輪次的面試。1.2 校招面試的整體節(jié)奏與三輪布局美團(tuán)校招大數(shù)據(jù)開發(fā)的面試一般四輪左右技術(shù)面三輪加一個(gè)HR面。技術(shù)面的難度是逐級(jí)遞增的但考察的側(cè)重點(diǎn)差異很大。第一面普遍是基礎(chǔ)項(xiàng)目。面試官會(huì)從Java基礎(chǔ)、集合、并發(fā)、JVM入手然后轉(zhuǎn)到Hadoop生態(tài)接著讓你介紹一個(gè)自己做過(guò)的項(xiàng)目深挖細(xì)節(jié)。這個(gè)環(huán)節(jié)的節(jié)奏比較快目的是快速判斷你的基礎(chǔ)是否扎實(shí)、項(xiàng)目是不是自己做的。第二面開始上強(qiáng)度重點(diǎn)考察設(shè)計(jì)能力和解決問(wèn)題的思路。我遇到的是給定場(chǎng)景讓你設(shè)計(jì)方案比如“實(shí)時(shí)統(tǒng)計(jì)外賣訂單峰值”、“離線數(shù)倉(cāng)怎么分層建模”這種題沒(méi)有標(biāo)準(zhǔn)答案但思維框架必須清晰。還會(huì)有一些偏系統(tǒng)設(shè)計(jì)的題比如讓你設(shè)計(jì)一個(gè)簡(jiǎn)單的消息隊(duì)列考察知識(shí)面的廣度。第三面是終面通常是部門技術(shù)負(fù)責(zé)人考察的內(nèi)容更偏向技術(shù)深度和業(yè)務(wù)理解。這一輪問(wèn)了很多我項(xiàng)目里“為什么這么做”的問(wèn)題比如“你當(dāng)時(shí)有沒(méi)有考慮過(guò)別的方案”“你這個(gè)方案如果數(shù)據(jù)量再大十倍還能扛住嗎”。到了HR面就輕松一些主要是問(wèn)職業(yè)規(guī)劃、團(tuán)隊(duì)協(xié)作、對(duì)加班的看法這類軟問(wèn)題。我自己的經(jīng)驗(yàn)是準(zhǔn)備階段一定要站在“面試官想看什么”的角度去復(fù)習(xí)而不是單純背題。后面我會(huì)細(xì)說(shuō)怎么拆解考點(diǎn)。2. 核心考點(diǎn)拆解從Java基礎(chǔ)到實(shí)時(shí)計(jì)算2.1 Java基礎(chǔ)與并發(fā)校招必須拿下的地基很多準(zhǔn)備大數(shù)據(jù)崗位的同學(xué)容易忽略Java上來(lái)就刷Spark源碼這是個(gè)大坑。我面試下來(lái)的體感是美團(tuán)對(duì)Java基礎(chǔ)的重視程度非常高尤其是并發(fā)部分幾乎每一輪技術(shù)面都會(huì)涉及。Java這一塊我給自己劃了幾個(gè)重點(diǎn)集合框架的底層原理比如HashMap在JDK7和JDK8的區(qū)別、擴(kuò)容機(jī)制、為什么線程不安全ConcurrentHashMap的分段鎖和CAS實(shí)現(xiàn)JVM內(nèi)存區(qū)域和垃圾回收面試官常問(wèn)“對(duì)象什么時(shí)候進(jìn)入老年代”“G1和CMS的區(qū)別”并發(fā)工具synchronized和ReentrantLock的實(shí)現(xiàn)原理、volatile的可見(jiàn)性和禁止重排序、線程池的核心參數(shù)和拒絕策略。我的經(jīng)驗(yàn)是準(zhǔn)備Java并發(fā)的時(shí)候要結(jié)合源碼去看不要只看博客總結(jié)。比如被問(wèn)到ThreadPoolExecutor的execute流程我會(huì)直接說(shuō)出“核心線程數(shù)不夠就進(jìn)阻塞隊(duì)列隊(duì)列滿了再創(chuàng)建非核心線程到最大線程數(shù)還超出就執(zhí)行拒絕策略”這個(gè)完整鏈路面試官明顯會(huì)有好感。另外提醒一句Java基礎(chǔ)不是背一遍就完事的需要自己能動(dòng)手畫圖講清楚。比如被問(wèn)到“AQS是什么”如果只是背出“AbstractQueuedSynchronizer是一個(gè)同步框架”那基本等于沒(méi)答。要能說(shuō)出它的state變量、CLH隊(duì)列、獨(dú)占和共享模式最好能提到ReentrantLock的公平鎖與非公平鎖是怎么樣通過(guò)它實(shí)現(xiàn)的這樣才能體現(xiàn)你真的理解。2.2 Hadoop生態(tài)體系HDFS、YARN、MapReduce的深層原理Hadoop三劍客是逃不掉的考點(diǎn)。我復(fù)盤了面經(jīng)里的問(wèn)題發(fā)現(xiàn)美團(tuán)這邊很少問(wèn)“HDFS架構(gòu)由哪幾部分組成”這種過(guò)于基礎(chǔ)的題更多是問(wèn)底層機(jī)制和故障場(chǎng)景。HDFS這邊的高頻題包括HDFS寫文件的完整流程、NameNode和SecondaryNameNode的職責(zé)區(qū)別、NameNode宕機(jī)了怎么辦、小文件問(wèn)題怎么處理。其中“寫文件流程”幾乎是必考一定要能說(shuō)清楚“客戶端先向NameNode請(qǐng)求NameNode返回可用的DataNode列表然后客戶端分塊傳輸最后一個(gè)塊寫完后向NameNode匯報(bào)”。同時(shí)要能答出“副本放置策略是第一個(gè)副本放在客戶端所在節(jié)點(diǎn)第二個(gè)副本放在不同機(jī)架的節(jié)點(diǎn)第三個(gè)副本放在與第二個(gè)相同機(jī)架的不同節(jié)點(diǎn)”并解釋為什么這樣設(shè)計(jì)。YARN最常問(wèn)的是調(diào)度器。美團(tuán)這種大廠生產(chǎn)環(huán)境用的基本是Capacity Scheduler而不是默認(rèn)的FIFO。面試官可能會(huì)問(wèn)“Capacity Scheduler和Fair Scheduler的區(qū)別”“怎么保證多租戶之間的資源隔離”“資源不足時(shí)任務(wù)怎么排隊(duì)”。我當(dāng)時(shí)的回答思路是先講清楚每個(gè)調(diào)度器的設(shè)計(jì)目的再結(jié)合大廠多業(yè)務(wù)線共享集群的場(chǎng)景說(shuō)明為什么Capacity更適用因?yàn)樗嘘?duì)列的概念可以給不同業(yè)務(wù)設(shè)置資源上限避免互相搶占。MapReduce這一塊重點(diǎn)在Shuffle階段。我曾經(jīng)被追問(wèn)“Map端Shuffle和Reduce端Shuffle分別做了什么”“Combiner是不是能隨便加”“如果Reduce端數(shù)據(jù)傾斜你會(huì)怎么處理”。Combiner那個(gè)問(wèn)題我一開始答得不好面試官提醒說(shuō)Combiner不能影響最終結(jié)果比如求平均值就不能直接加Combiner。這點(diǎn)大家一定要記住。2.3 Spark與Flink實(shí)時(shí)離線雙引擎的真實(shí)差異到了計(jì)算引擎這里Spark和Flink的對(duì)比絕對(duì)是最核心的考點(diǎn)。而且美團(tuán)現(xiàn)在實(shí)時(shí)計(jì)算用得非常多所以Flink的比重一點(diǎn)都不比Spark低。Spark這邊RDD的依賴關(guān)系、寬窄依賴、Stage劃分、血緣機(jī)制、Spark SQL的優(yōu)化器這些都是高頻題。我印象最深的是“Spark怎么判斷寬依賴和窄依賴寬依賴為什么會(huì)導(dǎo)致Stage失敗重算”。要能畫出DAG圖來(lái)說(shuō)明Stage的劃分過(guò)程同時(shí)解釋Shuffle為什么是Spark性能瓶頸。Spark調(diào)優(yōu)也是愛(ài)問(wèn)的方向。“內(nèi)存溢出怎么排查”“數(shù)據(jù)傾斜怎么辦”“動(dòng)態(tài)資源分配了解嗎”我建議準(zhǔn)備幾個(gè)經(jīng)典案例放在項(xiàng)目里這樣既能展示技術(shù)深度也能展示解決問(wèn)題的能力。比如數(shù)據(jù)傾斜我會(huì)說(shuō)“某天離線任務(wù)跑了一個(gè)小時(shí)還沒(méi)結(jié)束定位到是一個(gè)熱點(diǎn)key導(dǎo)致單個(gè)Task處理了90%的數(shù)據(jù)后來(lái)做了兩階段聚合先用隨機(jī)前綴打散再按原始key聚合任務(wù)從一小時(shí)降到了十分鐘”這種有數(shù)據(jù)有方案的回答很加分。Flink的高頻考點(diǎn)包括Checkpoint機(jī)制、狀態(tài)存儲(chǔ)、Watermark和亂序處理、Exactly-Once怎么實(shí)現(xiàn)、背壓機(jī)制。其中“Checkpoint和Savepoint的區(qū)別”“Flink怎么保證端到端Exactly-Once”是我被問(wèn)到最多的兩個(gè)問(wèn)題。回答時(shí)要把Barrier對(duì)齊的過(guò)程講清楚同時(shí)提一下兩階段提交協(xié)議以及下游Kafka sink如何通過(guò)事務(wù)實(shí)現(xiàn)精確一次。我還被問(wèn)過(guò)一個(gè)很有水平的延伸題“Spark Streaming和Flink的區(qū)別是什么”。這個(gè)題表面是考對(duì)比實(shí)際是考你對(duì)實(shí)時(shí)計(jì)算的理解深度。我會(huì)先分別說(shuō)明它們的架構(gòu)模型Spark Streaming是微批次把流切成小批次去跑Flink是真正的流式處理每條數(shù)據(jù)逐條經(jīng)過(guò)算子。然后延伸到適用場(chǎng)景對(duì)實(shí)時(shí)性要求高、需要事件時(shí)間語(yǔ)義的選Flink對(duì)吞吐量要求高、可以容忍秒級(jí)延遲的選Spark Streaming。最后提一句Structured Streaming的發(fā)展這樣回答層次感就出來(lái)了。2.4 其他重要組件與應(yīng)用場(chǎng)景除了上面三塊還有幾個(gè)組件的出現(xiàn)頻率也很高。Hive主要問(wèn)內(nèi)部表和外部表的區(qū)別、動(dòng)態(tài)分區(qū)、存儲(chǔ)格式ORC和Parquet對(duì)比、以及Hive SQL的優(yōu)化思路。Kafka作為實(shí)時(shí)鏈路的數(shù)據(jù)管道問(wèn)得最多的是“消費(fèi)者組是怎么做分區(qū)分配的”“怎么保證消息不丟失”“怎么做到消息不重復(fù)消費(fèi)”。我當(dāng)時(shí)把Kafka的ISR機(jī)制、acks參數(shù)、enable.auto.commit這幾個(gè)點(diǎn)串成一條線來(lái)準(zhǔn)備效果很好。Zookeeper現(xiàn)在雖然很多組件都在去ZK化但校招還是常考。主要是“Zookeeper在Kafka里扮演什么角色”“ZAB協(xié)議和Raft協(xié)議的區(qū)別”“服務(wù)發(fā)現(xiàn)和分布式鎖聽(tīng)說(shuō)過(guò)嗎”。美團(tuán)這邊的面試官不太會(huì)揪著Zookeeper深入拷打但基礎(chǔ)概念必須知道。另外Doris、HBase、ClickHouse這些OLAP引擎也值得了解一下。我一面的時(shí)候被問(wèn)過(guò)“Doris和ClickHouse有什么區(qū)別”當(dāng)時(shí)靠項(xiàng)目里用過(guò)Doris撐住了。大家準(zhǔn)備的時(shí)候不用所有組件都深挖但至少要知道每個(gè)組件是干什么的、適合什么場(chǎng)景這樣被問(wèn)到時(shí)不至于卡殼。3. 三輪面試實(shí)操?gòu)?fù)盤從項(xiàng)目深挖到系統(tǒng)設(shè)計(jì)3.1 一面實(shí)錄基礎(chǔ)問(wèn)題連環(huán)問(wèn)與項(xiàng)目深挖一面給我的整體感覺(jué)是全程高能問(wèn)題一個(gè)接一個(gè)幾乎不給你喘息的機(jī)會(huì)。開場(chǎng)是一道Java題HashMap在并發(fā)場(chǎng)景下會(huì)有什么問(wèn)題我提到JDK7的環(huán)形鏈表死循環(huán)和JDK8的數(shù)據(jù)覆蓋問(wèn)題面試官馬上追問(wèn)“ConcurrentHashMap是怎么解決這些問(wèn)題的”。我順著講CASsynchronized鎖Node節(jié)點(diǎn)的方案然后擴(kuò)展到size()方法怎么統(tǒng)計(jì)、擴(kuò)容時(shí)怎么協(xié)助遷移這輪大概聊了二十分鐘。接著是網(wǎng)絡(luò)和操作系統(tǒng)的基礎(chǔ)題TCP三次握手為什么不是兩次、進(jìn)程和線程的區(qū)別、寫一個(gè)死鎖的demo并解釋怎么避免。大數(shù)據(jù)崗位對(duì)操作系統(tǒng)和網(wǎng)絡(luò)的考察不如后端崗深但基礎(chǔ)概念還是要有特別是I/O模型因?yàn)楹竺鎸W(xué)Netty和Flink的通信層會(huì)用到。項(xiàng)目深挖發(fā)生在面試后半段。我準(zhǔn)備的是一個(gè)離線數(shù)倉(cāng)項(xiàng)目面試官問(wèn)了四個(gè)方向數(shù)倉(cāng)為什么分ods/dwd/ads三層、事實(shí)表和維度表的區(qū)別、緩慢變化維怎么處理、指標(biāo)口徑不一致了怎么辦。這幾個(gè)問(wèn)題我提前有準(zhǔn)備都答上了。但有個(gè)細(xì)節(jié)答得不好他問(wèn)“你ods層的數(shù)據(jù)同步是怎么做的有沒(méi)有遇到數(shù)據(jù)丟失”我當(dāng)時(shí)的CDCH同步方案確實(shí)沒(méi)考慮過(guò)重復(fù)數(shù)據(jù)問(wèn)題只好老實(shí)承認(rèn)。面試官?zèng)]有揪著不放只是提醒我生產(chǎn)環(huán)境要加冪等處理這個(gè)點(diǎn)后來(lái)被我記進(jìn)了復(fù)盤筆記里。一面結(jié)束后我總結(jié)了兩個(gè)心得。第一簡(jiǎn)歷上的每個(gè)技術(shù)點(diǎn)都要準(zhǔn)備一個(gè)“被追問(wèn)到第三層”的答案因?yàn)槊嬖嚬俜浅I瞄L(zhǎng)抓住一個(gè)點(diǎn)連環(huán)問(wèn)。第二回答項(xiàng)目問(wèn)題時(shí)先說(shuō)結(jié)論再說(shuō)過(guò)程不要流水賬式地講項(xiàng)目背景面試官?zèng)]那么多耐心。3.2 二面核心場(chǎng)景設(shè)計(jì)題的答題框架二面的畫風(fēng)和一面完全不同基礎(chǔ)題明顯變少了取而代之的是兩道場(chǎng)景設(shè)計(jì)題每一道都要求寫思路、畫架構(gòu)、說(shuō)技術(shù)選型。第一道題是“設(shè)計(jì)一個(gè)外賣訂單實(shí)時(shí)監(jiān)控大盤要求能實(shí)時(shí)展示不同區(qū)域的訂單量、超時(shí)訂單數(shù)和騎手分布”。我先確認(rèn)了幾個(gè)關(guān)鍵信息數(shù)據(jù)源有哪些、實(shí)時(shí)性要求多高、展示端有沒(méi)有特別需求。然后按標(biāo)準(zhǔn)流程給方案業(yè)務(wù)庫(kù)通過(guò)Canal同步binlog到KafkaFlink做實(shí)時(shí)ETL把訂單流和騎手位置流做雙流Join按區(qū)域和時(shí)間窗口做聚合最后把結(jié)果寫進(jìn)Doris前端通過(guò)報(bào)表工具查詢。面試官追問(wèn)了一個(gè)點(diǎn)雙流Join時(shí)數(shù)據(jù)延遲不一樣怎么辦這就要求我答出Flink的Watermark機(jī)制和狀態(tài)TTL設(shè)置同時(shí)考慮側(cè)輸出流處理遲到數(shù)據(jù)。這道題我答得比較完整面試官明顯比較滿意。第二道題是“離線數(shù)倉(cāng)怎么支撐大促活動(dòng)的GMV統(tǒng)計(jì)和分析”。這個(gè)題更偏業(yè)務(wù)理解。我回答的框架是在大促前對(duì)數(shù)據(jù)量做預(yù)估評(píng)估集群資源該擴(kuò)隊(duì)列的擴(kuò)隊(duì)列大促期間實(shí)時(shí)監(jiān)控每個(gè)任務(wù)運(yùn)行時(shí)長(zhǎng)和失敗率配置任務(wù)優(yōu)先級(jí)同時(shí)把核心鏈路的任務(wù)單獨(dú)隔離到專用資源池大促后做數(shù)據(jù)質(zhì)量復(fù)盤核對(duì)GMV和交易訂單數(shù)是否一致。這里面試官反問(wèn)了一句“如果GMV差了0.1%你會(huì)從哪里開始排查”我回答從數(shù)據(jù)源一致性、同步任務(wù)丟數(shù)、ETL邏輯變更、維度表關(guān)聯(lián)失敗這幾個(gè)方向逐一排查。這種題考的就是解決問(wèn)題的思路答案本身反而不那么重要。二面給我的啟示是場(chǎng)景設(shè)計(jì)題一定要有清晰的答題框架我歸納為“理解需求、拆分模塊、選型對(duì)比、方案展開、兜底方案”五步。平時(shí)可以用這個(gè)框架多練幾道題面試時(shí)會(huì)從容很多。3.3 三面復(fù)盤業(yè)務(wù)理解與技術(shù)深度的平衡三面是終面面試官是部門負(fù)責(zé)人整個(gè)面試過(guò)程節(jié)奏不那么快但每道題都問(wèn)得很深而且經(jīng)常把我往業(yè)務(wù)視角上引。開場(chǎng)沒(méi)有寒暄直接問(wèn)“你平時(shí)用外賣App嗎你覺(jué)得高峰期的數(shù)據(jù)量會(huì)是平峰期的多少倍如果你來(lái)設(shè)計(jì)實(shí)時(shí)數(shù)倉(cāng)你會(huì)怎么扛住這個(gè)峰值”。這種把業(yè)務(wù)和技術(shù)揉在一起的題非常典型。我是這樣回答的首先預(yù)估峰值流量通常是平峰的5到10倍然后講技術(shù)方案時(shí)強(qiáng)調(diào)彈性伸縮離線條動(dòng)用動(dòng)態(tài)資源分配實(shí)時(shí)鏈路通過(guò)增加Kafka分區(qū)和Flink并行度來(lái)水平擴(kuò)展同時(shí)要做背壓監(jiān)控和容量評(píng)估確保大促前就位。接著問(wèn)了一個(gè)讓我印象很深的問(wèn)題“如果讓你負(fù)責(zé)整個(gè)外賣交易數(shù)據(jù)的質(zhì)量你會(huì)搭建什么樣的監(jiān)控體系”我的回答分三層數(shù)據(jù)準(zhǔn)確性用離線對(duì)賬和實(shí)時(shí)比對(duì)來(lái)發(fā)現(xiàn)差異數(shù)據(jù)完整性監(jiān)控同步任務(wù)的同步延遲和丟失量數(shù)據(jù)及時(shí)性監(jiān)控任務(wù)開始時(shí)間和結(jié)束時(shí)間超過(guò)SLA就告警。面試官又追問(wèn)“準(zhǔn)確性對(duì)賬你會(huì)怎么實(shí)現(xiàn)”我詳細(xì)說(shuō)了用Hive定期跑全量對(duì)賬SQL、實(shí)時(shí)用Flink做窗口對(duì)賬、兩邊數(shù)據(jù)不一致就推送告警到消息隊(duì)列再由運(yùn)維處理這一套邏輯他已經(jīng)很認(rèn)可。三面最深的體會(huì)是面試官想知道的不只是你會(huì)不會(huì)用技術(shù)而是你能不能理解技術(shù)和業(yè)務(wù)的連接點(diǎn)。所以準(zhǔn)備終面時(shí)多想想技術(shù)方案背后的業(yè)務(wù)價(jià)值而不是背技術(shù)細(xì)節(jié)。4. 項(xiàng)目經(jīng)驗(yàn)怎么準(zhǔn)備才能經(jīng)得起追問(wèn)4.1 項(xiàng)目包裝的三種實(shí)用思路面美團(tuán)之前我把簡(jiǎn)歷上的項(xiàng)目全部重新梳理了一遍總結(jié)了三種特別實(shí)用的項(xiàng)目包裝思路分享給大家。第一種思路是“接入真實(shí)業(yè)務(wù)場(chǎng)景”。不要說(shuō)“我寫了一個(gè)實(shí)時(shí)計(jì)算項(xiàng)目”可以說(shuō)“我參與了一個(gè)XX業(yè)務(wù)的實(shí)時(shí)指標(biāo)計(jì)算項(xiàng)目”。把業(yè)務(wù)背景、數(shù)據(jù)規(guī)模、并發(fā)量、延遲要求寫清楚哪怕是在實(shí)習(xí)中做的也要寫明白自己負(fù)責(zé)的模塊。面試官對(duì)真實(shí)業(yè)務(wù)場(chǎng)景的興趣遠(yuǎn)大于對(duì)純Demo項(xiàng)目的興趣。第二種思路是“刻畫出問(wèn)題—分析—解決”的完整鏈路。比如項(xiàng)目里遇到了數(shù)據(jù)傾斜不要只寫“做了兩階段聚合”要把問(wèn)題怎么發(fā)現(xiàn)的、數(shù)據(jù)量差多少倍、試了哪些方案沒(méi)用、最后為什么選了這個(gè)方案、效果怎么樣全鏈路寫進(jìn)簡(jiǎn)歷。這樣面試官順著問(wèn)下去你都能講出細(xì)節(jié)項(xiàng)目的可信度就上來(lái)了。第三種思路是“主動(dòng)制造技術(shù)亮點(diǎn)”。比如在離線數(shù)倉(cāng)項(xiàng)目里加一個(gè)“調(diào)度超時(shí)自動(dòng)告警”的模塊在實(shí)時(shí)項(xiàng)目里加一個(gè)“動(dòng)態(tài)調(diào)節(jié)并行度”的優(yōu)化點(diǎn)。這些亮點(diǎn)不需要多高級(jí)但一定要能講清楚原理因?yàn)槊嬖嚬僮穯?wèn)的第一個(gè)問(wèn)題往往就是“這個(gè)模塊的觸發(fā)條件是什么”。4.2 項(xiàng)目里的常見(jiàn)追問(wèn)與應(yīng)對(duì)參考我把復(fù)盤筆記里被追問(wèn)過(guò)的問(wèn)題整理了一下做了個(gè)表格方便大家對(duì)著自查。追問(wèn)方向具體問(wèn)題應(yīng)對(duì)思路數(shù)據(jù)同步你同步MySQL到Hive延遲多少丟數(shù)據(jù)怎么辦說(shuō)明同步工具的機(jī)制比如Canal的binlog位點(diǎn)記錄回答時(shí)強(qiáng)調(diào)offset管理和冪等寫入數(shù)據(jù)傾斜代碼里哪個(gè)環(huán)節(jié)發(fā)生了傾斜為什么講清傾斜現(xiàn)象、定位過(guò)程、解決方案、優(yōu)化前后對(duì)比數(shù)據(jù)實(shí)時(shí)計(jì)算你Flink任務(wù)的并行度怎么設(shè)置按Kafka分區(qū)數(shù)、數(shù)據(jù)量、資源情況綜合評(píng)估并說(shuō)明設(shè)置不合理的后果數(shù)倉(cāng)建模維度建模和范式建模的區(qū)別你選了哪種從業(yè)務(wù)靈活性和查詢性能兩個(gè)角度解釋為什么選維度建模任務(wù)保障任務(wù)掛了怎么恢復(fù)講調(diào)度系統(tǒng)的重跑機(jī)制、數(shù)據(jù)血緣、失敗告警的完整流程應(yīng)對(duì)追問(wèn)的總原則是不要把項(xiàng)目想得太簡(jiǎn)單多問(wèn)自己幾個(gè)“如果這里出問(wèn)題了怎么辦”提前把風(fēng)險(xiǎn)點(diǎn)和補(bǔ)救方案想好。面試官最怕的就是候選人只會(huì)說(shuō)“我做了”說(shuō)不出“為什么這么做”和“不這么做會(huì)怎樣”。5. 常見(jiàn)問(wèn)題與避坑指南實(shí)錄5.1 我踩過(guò)的幾個(gè)典型坑第一個(gè)坑是準(zhǔn)備范圍太廣深度不夠。我前期準(zhǔn)備時(shí)什么組件都想看Hadoop、Spark、Flink、Kafka、HBase、ClickHouse全列在計(jì)劃表里結(jié)果是每個(gè)都會(huì)一點(diǎn)但都不精。被面試官追問(wèn)到“你這個(gè)方案在數(shù)據(jù)量更大的時(shí)候有什么問(wèn)題”時(shí)經(jīng)常會(huì)卡住。后來(lái)我調(diào)整策略重點(diǎn)深挖Spark和Flink其他組件只掌握原理和使用場(chǎng)景。事實(shí)證明這個(gè)取舍是明智的面試官更看重對(duì)核心技術(shù)的理解深度。第二個(gè)坑是項(xiàng)目介紹太啰嗦。我第一次模擬面試時(shí)光介紹項(xiàng)目背景就講了五分鐘面試官一直打斷我。后來(lái)我把項(xiàng)目介紹壓縮成三分鐘版本背景一句話、技術(shù)棧一句話、自己的職責(zé)和亮點(diǎn)三句話、項(xiàng)目難點(diǎn)和解決方式展開講。要記住面試官問(wèn)“介紹一下你的項(xiàng)目”只是想找個(gè)入口往后追問(wèn)不是真的想聽(tīng)你的項(xiàng)目說(shuō)明書。第三個(gè)坑是忽略了離線任務(wù)調(diào)度。美團(tuán)這種體量的公司數(shù)倉(cāng)成千上萬(wàn)個(gè)任務(wù)全靠調(diào)度系統(tǒng)跑所以DolphinScheduler或者類似調(diào)度框架的機(jī)制一定要了解。我當(dāng)時(shí)完全沒(méi)準(zhǔn)備這個(gè)方向一面被問(wèn)到“調(diào)度系統(tǒng)怎么保證任務(wù)不重復(fù)跑”時(shí)有點(diǎn)懵。建議大家至少了解一下調(diào)度系統(tǒng)的DAG依賴、失敗重試、手動(dòng)補(bǔ)數(shù)這幾塊。5.2 面試官眼中的加分項(xiàng)與減分項(xiàng)面試多了之后我慢慢摸清了面試官評(píng)判候選人的一些潛規(guī)則。加分項(xiàng)方面回答問(wèn)題時(shí)有邏輯框架比如用“第一、第二、第三”分點(diǎn)主動(dòng)說(shuō)“這個(gè)方案在什么場(chǎng)景下不適用”體現(xiàn)辯證思維在項(xiàng)目回答中給出具體的優(yōu)化前后數(shù)據(jù)對(duì)比例如“運(yùn)行時(shí)間從一小時(shí)降到十分鐘”。減分項(xiàng)方面背答案痕跡明顯。比如被問(wèn)到“Flink的Checkpoint原理”時(shí)直接背出網(wǎng)上文章原話完全不結(jié)合自己的理解。還有對(duì)項(xiàng)目細(xì)節(jié)一問(wèn)三不知可能是簡(jiǎn)歷包裝過(guò)度。最致命的是自己埋雷比如明明對(duì)HBase不熟偏要寫在簡(jiǎn)歷上結(jié)果面試官順著簡(jiǎn)歷追問(wèn)三步就露餡了。我個(gè)人經(jīng)驗(yàn)是面試時(shí)保持坦誠(chéng)特別重要。不會(huì)的問(wèn)題就說(shuō)“這塊我沒(méi)深入研究過(guò)但我理解大概是……”然后給出一個(gè)思路比硬編一個(gè)答案要好得多。大廠面試官都很有經(jīng)驗(yàn)?zāi)愦鸬氖钦媸羌俸苋菀着袛喑鰜?lái)。5.3 時(shí)間線與心態(tài)管理建議再分享一些備戰(zhàn)節(jié)奏上的建議。我給自己定的規(guī)劃是提前三個(gè)月開始系統(tǒng)復(fù)習(xí)第一個(gè)月主攻Java基礎(chǔ)和Hadoop體系把高頻考點(diǎn)過(guò)一遍第二個(gè)月攻克Spark和Flink同時(shí)開始整理項(xiàng)目把項(xiàng)目的每個(gè)模塊和可能追問(wèn)的點(diǎn)寫成文檔第三個(gè)月進(jìn)入刷題和面試模擬階段每天刷算法題加一套模擬面試。心態(tài)方面大廠校招的節(jié)奏會(huì)比較長(zhǎng)中間可能有等待期情緒起伏很正常。我自己的緩解方式是每天固定時(shí)間給朋友講一道面試題講得出來(lái)才算是真正掌握了。這種方式比一個(gè)人悶頭背效率高很多。回頭看這段校招經(jīng)歷最大的感受是大數(shù)據(jù)開發(fā)這個(gè)崗位入門門檻說(shuō)高也高說(shuō)低也低。高的是知識(shí)面太廣從Java到分布式再到實(shí)時(shí)計(jì)算每一塊都要下功夫低的是大部分考點(diǎn)都是有跡可循的只要把高頻問(wèn)題一個(gè)個(gè)吃透面試時(shí)就能應(yīng)對(duì)自如。最后再給大家一個(gè)小技巧每次面試完不管結(jié)果如何當(dāng)天就把被問(wèn)到的問(wèn)題和你的回答詳細(xì)記錄下來(lái)這個(gè)復(fù)盤筆記是你后續(xù)面試最寶貴的資料。祝大家都能拿到心儀的offer。