本文來自一個8年大數據老兵的面試經歷投稿,我完完整整的看了一遍,真的很細很細,疫情期間面試各種失敗各種總結,最後拿到Offer實屬不易,精神很值得大家學習
前言
我不是什麼大牛,我只是一個有八年工作經驗的互聯網老兵,既沒有非常亮眼的學歷,也沒有牛逼大廠的履歷。
這個冬天,在孩子得病從急診轉住院的時候,我得到了年前將被優化的消息,作爲家裏唯一經濟來源的我整個人蒙了,一時間茫然和無助差點毀了我。
最後我還是和家人如實說了,受到了他們的極大的鼓勵,也找到了重新開始的勇氣。
可惜這場疫情來的如此兇猛,職位少、要求高、電話面試、視頻面試、在線coding、屢戰屢敗、屢敗屢戰,構成了我這兩個月的常規生活。
我一開始也焦慮、茫然,甚至對自己的能力和工作經驗深深懷疑。
後來經過幾個好朋友的鼓勵打氣,也看了敖丙的很多面試文章,認真總結自己面試中不足的地方,查漏補缺,終於在這周確定了offer。(這是原話,我真沒瞎加哈哈)
接下來我就我之前面過的騰訊、高德、京東、美團、餓了麼、快手、字節跳動、滴滴、360金融、跟誰學、網聯清算、華晨寶馬、快看漫畫、陌陌、脈脈等等等公司的面試題做一下總結,權當拋磚引玉,希望對大家有幫忙。
面試問題彙總
基礎問題
linux和網絡基礎
(1)linux系統內核態和用戶態是什麼,有什麼區別?
(2)BIO、NIO、AIO都是什麼,有什麼區別?
(3)TCP和UDP的區別?
(4)詳細敘述TCP3次握手,TCP和HTTP的區別,其中字節面試官問的最細,他會具體問TCP底層的3次握手的具體實現邏輯,第三次握手如果失敗會怎樣。
建議把TCP關閉時的4次揮手也看看,敖丙的文章就有,看了至少表面的東西難不倒你們,由於這個是最基礎的問題,如果回答不好,面試官的印象分就你懂得。
(5)rpc和http的區別,你知道有什麼rpc框架。
(6)https相對http都實現了什麼加密方式,是對稱加密還是非對稱加密?
(7)用linux命令怎麼做分組求和,怎麼把字符串根據分隔符變成數組(這裏建議大家讀讀敖丙的linux命令篇)
JVM基礎
(1)簡要介紹一下JVM虛擬機(這個問題不是把JVM分成JMM,類加載和GC來問,一定要想好怎麼描述JVM)
(2)簡述一次GC的過程(Minor gc和Major gc過程還記得麼)
(3)JMM是什麼?
(4)JVM共享內存都有什麼,什麼是堆外內存?
(5)GC區域,垃圾回收算法,垃圾回收器,G1、CMS、ParNew等垃圾回收器的簡介和之間的區別。
(6)類加載過程(5個過程最好能研究明白,因爲還涉及到棧幀、局部表量表、操作數棧、動態鏈接和方法出口等知識,去看一下敖丙的文章就明白了)
(7)一個ArrayList的兩個對象的getClass()得到的結果相同麼(理解類加載和Class類類型)
(8)死鎖怎麼查問題(-XX:+PrintGCDetails)
(9)Gc日誌得會看,尤其問到怎麼查OOM問題的時候,你應該知道使用jconsole,jstat,jmap,jvisualvm等的工具來查看gc狀態,看看是不是年輕代設置太小了導致major gc頻繁或者內存泄露了。
JAVA基礎和多線程基礎
(1)synchronized在JDK6做了哪些優化,synchronized和lock的區別
(2)懶漢單例用duble check是線程安全的麼,爲什麼要加volatile
(3)Volatile有什麼用,什麼是CAS
(4)什麼是happens before原則
(5)什麼是AQS
(6)線程sleep和wait的區別,線程join是什麼意思
(7)Java都有哪幾種鎖(敖丙的文章)
(8)線程池分幾種類型,其中的coreSize、maxSize、存活時間、等待隊列、拒絕策略要清楚
(9)Java樂觀鎖的實現(CAS+自旋)
(10)阻塞隊列的實現,至少自己會實現2種阻塞隊列的方法(單鎖,多鎖, ReentrantLock, Condition)
(11)CountDownLatch、CyclicBarrier、Semaphore區別,使用場景
(12)HashMap是線程安全的麼,底層怎麼實現的(get,set,resize),JDK1.8之前和之後做了哪些修改,如果要使得插入kv有序需要使用哪種HashMap(LinkedHashMap,TreeMap),ConcurrentHashMap線程安全是怎麼實現的(JDK1.8前後實現不同)
(13)ArrayList和LinkedList的區別,棧和隊列的區別。Queue和Deque區別
(14)Netty,Jetty實現原理。
(15)Java 靜態代理、動態代理
(16)Forkjoin模型
(17)Java回調
(18)協程和線程的區別
(19)JDK1.8有什麼新特性,瞭解函數式編程麼(不瞭解的看看guava)
數據結構算法和設計模式
(1)設計模式一般引申自項目或者工具底層實現,所以需要懂一些比較常見的設計模式,工廠、單例、觀察者、命令、適配器、代理等等
(2)算法主要是查找和排序,所以至少要會手寫主流的排序算法和查找算法
(3)LSM樹是怎麼實現的。和mysql的B+樹有什麼區別(LSM樹是hbase和levelDB的底層存儲的結構,不懂不應該)
(4)二叉樹,平衡查找二叉樹,紅黑樹等
(5)棧,數組,鏈表,隊列,雙端隊列,跳躍表(redis zset)等
spring系列
(1)AOP,IOC概念
(2)Spring cloud組件介紹,具體問的比較多的是hytrix和eureka,hytrix主要問怎麼實現限流和降級(線程池和信號量),兩種實現方式有什麼區別,具體熔斷時的配置;eureka主要介紹和zookeeper的區別,以及註冊流程
(3)Spring boot配置很多都註解化了,所以常用的註解要知道
(4)過濾器和Spring攔截器的區別
消息中間件AMQP
看敖丙的文章就夠了
redis緩存相關
看敖丙的文章就夠了
(這兩段沒笑死我)
其他類型
(1)單點登錄系統怎麼做(SSO系統)
(2)爲什麼選擇cassandra而不是hbase,兩者有什麼區別
大數據問題
hadoop
(1)hadoop1.0的進程都有哪些,hdfs和mapreduce簡介
(2)集羣初始化的時候namenode都做了哪些工作,fsimage和editslog都是什麼
(3)SecondaryNamenode有什麼作用。
(4)Hadoop讀文件和寫文件流程
(5)Mapreduce過程簡介(注意這個是基礎,不會說拉低印象分),shuffle流程,jobclient提交job的流程等。
(6)Mapreduce怎麼進行序列化反序列化的(inputFormat,outputFormat)
(7)Jobtracker都有哪些任務調度器
(8)Hadoop YARN都做了哪些優化,YARN都有哪些進程,YARN提交job的流程
(9)Mapreduce優化(mapjoin,combiner,小文件合併等)
(10)簡述hive表join怎麼用mapreduce實現,mapreduce二次排序,二次排序分區和分組的區別
(11)Hadoop集羣HA實現(zookeeper實現主備和federation最好都弄懂概念)
(12)其他框架比如spark怎麼和yarn集成的
(13)Spark相比mapreduce的優化(內存計算,RDD等)
(14)給你100億條數據的用戶表和一塊100MB內存,怎麼去重或者判斷一個用戶在不在其中(bitmap,布隆過濾器等)
(15)加分項:讀過hadoop源碼麼,具體哪一段源碼介紹一下。
hive
(1) Hive數據倉庫的架構
(2) Hive怎麼把sql轉化成mapreduce的(至少知道sql解析器解析成AST語法樹,後面解析成queryblock,進執行隊列等等)
(3) Hive基本數據類型,組合類型(當時問Hive中的int類型有幾種,蒙了)
(4) Hive底層存儲類型,壓縮格式
(5) Hive UDF,UDTF,UDAF,窗口函數(row_number, rank,cube,rollup,lag,lead)(一般是跟着sql coding來問的)
(6) Hive優化(count(distinct xxx),去除null值,小文件合併,map和reduce個數優化,解決數據傾斜)
(7) Hive分區和分桶的區別。分桶主要解決什麼問題。內部表和外部表的區別。怎麼動態分區。
(8) Hive怎麼自動補全分區(MSCK命令,這個比較冷僻,知道有這個東西就行了)
(9) HIve列存儲,rcfile和orcfile和parquet怎麼存數據的
hbase
(1)hbase架構簡介
(2)Hbase怎麼讀寫數據詳細流程
(3)Hbase的應用場景
(4)Hbase優化(熱點,預分區,rowKey設計,手動合併等)
(5)Hbase爲什麼寫快讀慢(LSM樹)
(6)Hbase是cp還是ap架構?(CAP理論看懂沒有,hbase是CP的)
(7)Hbase 怎麼scan數據的。
kafka
爲什麼kafka放到大數據裏來說,因爲kafka大部分場景下是ETL流程和流式計算流程的source端
(1)kafka架構簡介
(2)Kafka爲什麼快,性能好,吞吐量大(mmap和sendfile瞭解一下)
(3)Kafka會丟數據麼,kafka消息有序麼
(4)Kafka producer consumer怎麼實現at most once和exactly once(冪等計算和事務)
(5)Kafka 高可用怎麼實現的(AR,ISR,OSR)。會不會腦裂(不會啊,參照zookeeper選舉)
(6)Kafka leo(log end offset)和hw(high watermark)
(7)Kafka consumer消費topic的某一個partition時,不同group和同group中的消費者有什麼不同。
(8)Kafka ack有幾種,每種什麼意思
(9)Kafka有什麼坑,怎麼改進(大腦風暴了)
(10)Kafka相比rabbitMq等傳統消息隊列有什麼區別
zookeeper
(1)zookeeper簡介
(2)Zookeeper節點類型
(3)Zookeeper watcher機制
(4)Zookeeper使用場景,怎麼用zk設計主備高可用,怎麼用zk實現分佈式鎖(看敖丙文章去,其實就是臨時順序znode的建立和watcher機制的妙用)
(5)Zookeeper選舉機制,會不會腦裂
其他工具
因爲我沒有很多spark和flink的項目經驗,所以這部分問的較少
(1)介紹一下storm,spark,flink
(2)Spark RDD
(3)Spark stage怎麼劃分task的
(4)Spark寬窄依賴
(5)Spark shuffle
(6)Spark 爲什麼容易OOM
(7)Flink 窗口類型都有哪些
(8)Flink 水位線是什麼,要解決什麼問題,怎麼保證消息有序
(9)Flink 怎麼實現exactly once
項目中涉及到的mysql、redis、flume、sqoop、es等工具也會具體問的,這裏我就不詳細說了,redis和mysql的可以直接看敖丙的文章就可以了。
數倉相關的問題和數據分析、算法端的問題
(1)你是怎麼設計數倉的
(2)數據倉庫是什麼,和數據庫有什麼區別
(3)你的數倉怎麼分層的
(4)維度建模的流程,其他類型的建模方式
(5)Inmon模型和KimBall模型有什麼區別
(6)怎麼提煉業務指標
(7)怎麼設計事實表和維度表
(8)數據立方體的一些概念
(9)什麼是緩慢變化維,怎麼處理這種緩慢變化維
(10)具體項目中會問到日誌或者數據是增量存還是全量存,可能會引申到拉鍊表,甚至讓我實現拉鍊表(字節2面掛就是拉鍊表流程沒有正確寫出來,所以後來乾脆自己在mysql上面實現了一把就懂了)
(11)會用python,R語言進行數據分析麼,會用SPSS,EXCEL,tableau之類的工具麼
(12)使用過什麼多維查詢引擎(impala,kylin,presto,druid等,如果沒用過別說用過,因爲可能面試官很瞭解的話會問的很細很底層)
(13)MPP的概念,clickhouse之類的工具使用
(14)調度系統報表系統元數據管理系統血緣分析等系統設計,標籤系統設計,AI算法實現,用戶畫像設計等
(15)談談對數據中臺的理解,要解決什麼問題(看你的思考能力和對數據部門職能的理解)
(16)談談對數據治理的理解
Coding
這裏只給大家提供一些遇到過的簡單問題,大家應該掌握基本的查找算法、排序算法,熟練使用遞歸、貪心,能明白動態規劃更好。
Leetcode上面的題有空再去刷,因爲幾千道題要花費大量的時間,對於需要準備考sql的同學,建議把牛客網上面數據庫SQL實戰都做一遍,理解了就差不多了。
(1)實現一個函數把兩個有序的int數組結合成新的有序數組(java,遇到過2次)
(2)給a[n]數組進行全排序,找到一個組合的前一個組合,比如a[3]{[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]},給出[2,3,1,],找到他的前序是[2,1,3](java)
(3)給定一個正數數組arr(即數組元素全是正數),找出該數組中,兩個元素相減的最大值,其中被減數的下標不小於減數的下標。即求出: maxValue = max{arr[j]-arr[i] and j >= i} (java)
(4)有8個球,其中有一個比其他7個重。給你一個天平要求2次稱重就把重的那個球找出來。(智力題)
(5)求一個數組中不存在的最小正整數(java,這個好像是程序員面試指南里頭的題)
(6)給定用戶登錄表,怎麼查連續3天未登錄的用戶(sql)
(7)給定每天收入明細數據,怎麼查每一天的歷史收入總和(sql)
(8)Hive 表中有重複值,怎麼查一共有多少個重複值(hql)
(9)給定註冊表和登錄表,用一個sql求1-7天留存(sql)
(10)實現拉鍊表(hql)
(11)給定電商訂單表,字段爲訂單id(order_id)和訂單組合(type_list),求這個訂單組合中每種類型商品的相關商品TOP10,即求這個商品相關的商品(下單這個商品的同時也下單其他商品)下單量TOP10(hql,行轉列)
(12)給定一個廣告投放表ad,字段有aid(廣告id)和citys(投放城市city_id集合)和城市表city_info,字段有city_id和city_name(城市名稱),求具體城市名稱的投放廣告量TOP10。(hql,行轉列)
項目
面試官考察項目經驗,考察的其實不僅僅是你基礎的掌握,更多的是自己對業務的理解,架構設計,自己對項目的思考。所以,除了項目中涉及到基礎知識的問題,還會問到諸如你覺得項目中有哪些設計比較好,或者有哪些不合理的地方,你是怎麼解決的等方面的問題。
這些問題往大了去可能是架構方面的,也可能是具體技術細節。但是隻要你講出自己的思考和解決方案,有經驗的面試官會大概瞭解到你的技術深度、架構設計能力和解決問題能力的層次。
所以一定要找到有亮點的地方提前進行背書,要有層次的介紹項目,思考一下項目設計或者實現不完善的地方。
還有一些面試官會問到如果讓你設計一個什麼什麼系統,你怎麼設計。這種題我覺得也最好提前做過背書。
因爲對於工作經驗少的同學,面試官主要看他想問題的深度和廣度,但是對於工作經驗不少於5年的人來說,面試官更關注你是否有成熟的實現流程和方法論。
所以一個層次化流程化的設計會極大增加面試官好感度。切記避免廢話連篇核心不明確。(這也是我的問題,因爲沒有準備,所以遇到肯定說的很散,這樣面試官覺得你自己做事情沒有核心和方法)
個人價值觀
一般技術面到後面,面試官都是leader或者是部門老大,他們其實很關心你的職業規劃、對待工作的態度、團隊合作的能力、自我價值實現方面的思考,當然還有項目實現的能力,過往項目經驗和深度。所以最好自己先想想怎麼用簡短的話表述清楚。注意圍繞關鍵詞去說。
寫給看到最後同學的話
這些算是我作爲過來人對於應屆畢業生和剛工作不久的同學的一些小小建議吧。
(1)一定要緊跟技術前進的腳步,尤其是大數據相關的技術,在技術更迭的時候一定要學習熟悉新技術,看源碼,哪怕自己在工作中用不到也一定要學。因爲這是你下一份工作的敲門磚。
我作爲一個老兵,在上一家公司工作4年,公司沒有spark和flink的業務場景,我也沒有逼迫自己學習這些新技術。
結果現在面試碰壁,其實大部分原因就是人家用的主流技術就是這些,你不會你就被淘汰。
(2)不要給自己設置舒適區,這個就是說,一個公司待久了不要懶惰,不能荒廢自己,始終要保持清醒的頭腦和進取心,不斷學習,不斷完善自己的技術,架構設計能力,項目管理能力,交付能力等。
一定要及時從項目中總結經驗和不足,最好落實到日記本中,最後通過不斷思考,形成自己的做事方法論。
(3)對自己的職業生涯要有一個規劃,以後要做哪一塊一定要有自己的想法,確定了就要從這個方向完善自己,多學多練。
目前大數據這一塊,有數據中臺架構的公司不是很多,除了算法崗外,大多數人在團隊中都是1專多能的角色,今天干幹ETL,明天搞數倉,後天又給BI出數據,可能又搞調度系統、報表系統、標籤系統、反作弊平臺等平臺。
沒有人會專一做某一塊,但是自己一定要想好哪一塊是自己以後要走的方向,那麼這一個方向確定了就要深入的學習這一塊的知識,多看源碼,多做練習,如果接觸到具體項目,要在項目中沉澱自己,最後形成自己的知識體系。
(4)做事情要有擔當,不要根據OKR給自己設置界限,有能力有空閒多做一定要多做,這也是別人認可你的最佳途徑之一。互聯網圈子很小,大家認可你,以後去大廠,換個好工作,也許就更容易。
敖丙的絮絮叨叨
是的結尾我還是說一下吧,投稿的讀者是一個互聯網經驗的老兵了,兩個月的高強度面試也讓他有了很多收穫,有一句話我很喜歡,不要給自己設立舒適區,要有危機感,真的就是這樣。
我們寫代碼,真的不要單純的爲了生計,單純的覺得這是一個青春飯,我們可以把它當做一個一輩子的事業,30歲以後你轉型產品,轉型架構師,你都是要有code的積澱的,不是說能轉就能轉的。
一個一生的事業,我想是值得你付出時間去學習的,雞湯就這麼多了。
對了,電話面試的那個研究生小哥還記得麼,他去了阿里,也恭喜他,也恭喜這個老兵讀者,我實在沒想到我的很多文章確實能幫助到大家這麼多,我會繼續寫的。
我是敖丙,一個在互聯網苟且偷生的工具人。
最好的關係是互相成就,各位的「三連」就是丙丙創作的最大動力,我們下期見!
文章持續更新,可以微信搜索「 三太子敖丙 」第一時間閱讀,回覆【資料】【面試】【簡歷】有我準備的一線大廠面試資料和簡歷模板,本文 GitHub https://github.com/JavaFamily 已經收錄,有大廠面試完整考點,歡迎Star。