金九銀十鐵12,目前騰訊、美團等五家大廠都收到意向offer | 掘金技術徵文

wlysola發表於2018-09-13

網際網路提前批基本告一段落,大大小小的offer也拿了一些,秉著回報社會,堅持中國特色社會主義,挽救新一程式碼農的思想,整理了下各個公司的麵筋、考點,希望能激勵各位搬磚工,起到鼓足幹勁,力爭上游的作用O(∩_∩)O

噱頭

小姐姐♀說先拿出offer炸炸人,否則沒人看...我們不是那麼庸俗的人,但也沒有那麼脫俗...

鄙人從7月中旬開始找工作,找的是大資料研發 or 大資料演算法方向,反正圍著大資料打☯️,截止到9.12號為止,騰訊、美團、360安全研究院、搜狗、貝殼 都收到意向offer

當然掛麵也吃了不少?

  • 阿里招聘系統有點bug,沒找到機會去面,然後接受了一波勸退性筆試,最近看能不能找個好心的小姐姐推我進去面一波
  • 百度三面電話沒接起來,然後沒然後了...
  • 網易接了一波玄面~
  • 頭條也去面了一波,不過真的沒複習那麼全,回來海學一波,也算值
  • 滴滴給了一“真內推”(直接問能來實習不,來就有...),不過最近在風頭上,考慮中...

offer的具體工作內容不介紹了,怕被HR小姐姐查出來,請我去喝茶...

閒聊

本人北京985渣碩一枚,是真的渣,舍友商湯、曠世,出國留學,學校中各類大佬一坨,在夾縫中求生,混口飯吃

主攻方向:無。領導搞行政的,天天端茶倒水取快遞,外掛寫不盡的基金本子,論文全靠個人參悟+上天憐憫

說點正事吧,關於工作路線,我最終選擇的是大資料研發方向,主要原因是研一上了點分散式的課,拿出來吹一吹,還能唬的住人。個人感覺演算法也能做,研發、演算法半斤八兩吧

學校這邊的話,有優秀高校背書自然要好,沒有的話,就沒有吧,大牛們不差這點,渣渣們大家也強不到哪去,不必強求

專案,在讀書過程中,一定要了解個專案,否則面試官真沒啥問題你的,尬場基本就涼涼了。這專案不必真的是你的,當找工作時,所有前輩、朋友的專案全都是你的,包裝下,你說是你的就是你的,沒人去查你底細的,關鍵瞭解要深,這樣和別人說底氣才足。我有幸給一個資料流專案做了些邊角任務,但在簡歷上,我成為了該專案的負責人...自己體會包裝的藝術...

簡歷,我以前認為大家“沒見過豬跑還沒吃過豬肉嗎”,網上那麼多強調簡歷重要性的,直到我看見我小師弟的簡歷,發現真的有人沒吃過豬肉(我學碩他專碩,一起找工作,他有百度大廠背書,可這工作找的唉...)。最簡單的修改方法,讓你附近的同學看看,第一眼感覺可以嗎,可以就ok,不可以就gg,照著人家的改改

現在前頭,準備要早,投的也要早基本7月中旬就陸陸續續開始有提前批了,錯過就沒了>...<

乾貨

這貨也不幹,過去一整陣子了,我能寫多少給大家寫多少吧,考點網上一抓一大把

技術面

先說說技術面流程:

  1. 讓你做自我介紹(準備好)
  2. 看看你簡歷,說你對這個比較熟?balabla...你問的簡單就熟,問的難不好意思不太瞭解
  3. 看看你實習經歷,讓你介紹實習幹啥了,有沒有什麼大專案能拿得出手,幹聊10-20分鐘的
  4. 問問職業規劃。這裡表現出你態度的虔誠,不會亂跳槽,踏踏實實的幹,讓他感受到你想進這家公司,兩眼能放光就更好了... 大佬們可以海吹一波
  5. 你有啥子問題。我一般預備兩個問題,您這部門具體做什麼能介紹一下?我什麼時候能知道自己是過了還是沒過呢?儘量不要不問,各路大佬在貼中都說過了

一定要把主動權掌握在自己手中,面試官會問很多你平時不瞭解或壓根不知道的問題,這時你可以說平時我用不到這些(可以理解啊,應屆生上哪懂這麼多邪門歪道啊,大佬請無視我),然後說自己對xxx領域有點研究,引導他來問你

對面提問你時,其實很考驗你答辯技巧的,當你熟悉的東西時,那很OK,balabala即可,問你不熟悉的(你只知道點皮毛,但也在簡歷上寫了),你可以說“我做專案時碰到過一點,大體查了下,有點印象,您可以試著問一下”,這樣會讓面試官把期望放低,問題難度也會降低,答出來加分,答不出來也無所謂

HR面

  1. 自我介紹(準備版非技術的! 從本科到大學,研究方向,選擇這家公司理由,實習經歷拉一拉,時間一般能湊夠了,讓對方感覺你是個健談的人)
  2. 聊聊興趣愛好(準備些健康的愛好,遊戲公司可以考慮非健康的...)
  3. 聊聊實習經歷,和上下級處的如何,有壓力怎麼辦
  4. 你有啥問題。我對這部門還有些不瞭解,您能在系統介紹下嗎?入職培訓介紹一下?

下面具體拉拉各廠面試經歷吧,我把比較有特色的問題列出來,統一的我放在下面知識點了,重寫太麻煩了...

騰訊

難度:easy,可能我比較幸運?

一面

電話面,問了問Java的基礎問題,其中有印象的是

  • final這個欄位用在欄位和方法上的區別,在方法上好像能加速,大家自己查吧。。

二面

現場面,基本圍繞著你簡歷上問

  • xgboost相對gbrt改進
  • topK問題

三面

總監面,這面基本聊聊實習的專案,用到的技術等,不知死活的我問了問sp的問題...建議各位0-offer黨(offer滿天飛的大佬請無視我)不要在該環節問sp的問題,最後給不給sp,好像不是這夥計定的,具體還是看聊得情況,聊開了什麼都能聊,聊不開,那就88

美團

難度:normal

一、二面

  • Java問了一堆
  • Spark問了一堆
  • 然後給我介紹部門,我基本在聽他說了...

後面知識點都有我就不展開寫了o_o ....

三面

問我刷題不?(這想要我什麼回答呢),杯子倒水智力題,實習專案聊一聊

360

難度:normal+

一面

上來懟了我一堆python的東西,我python當指令碼用的,說能不能換個方向聊一聊,然後懟了一堆

  • 期望
  • 準確率召回率
  • AUC和ROC
  • 決策樹聊一聊
  • 闡述自己如何設計模型的

開始問題偏向於演算法,後來我說我其實擅長架構類的東西...小姐姐說,這樣啊,不過看你答的還可以啊,架構我就不問你了...

二面

問了些資料倉儲的問題,雪花型和星型資料庫等,我表示一臉懵逼,然後和他扯Spark Streaming,他對這個還挺感興趣的,算是晃點住了,後面說加班怎麼看,然後他開始介紹他NB的團隊,我開始瞻仰,膜拜...最後問問能不能來實習,基本回答都是能(不能的好像都沒了...),時間節點自己需要把握一下,最好等到所有offer都下來的時候,我自己預估是10月中旬吧

頭條

難度:father

一面

  • spark streaming 懟一波
  • 如何保證exactly once
  • tcp中全連線池和半連線池等
  • 劍指offer上一道題:二叉樹蛇皮走位??

二面

  • yarn 排程演算法
  • 扯了扯spark streaming
  • 一道演算法,樹中兩節點找最親的爸爸...
  • 實習聊一聊

面試官不是很感冒,問我還有什麼補充了,我竟然說沒...猝,血淋淋的教訓啊

搜狗

難度:hard

一面

兩個面試官,發了張卷子,裡面什麼題都有:

  1. 排序、有重複的陣列中查詢某數的index,注意不要退化成o(N)的演算法
  2. 在一棵樹中查詢兩個節點的最近公共父節點(就是頭條二面那道題)
  3. linux $$ $# $0 等含義
  4. 智力題 50紅 50黑 分配兩袋子摸球問題
  5. n!後面有多少個0
  6. hdfs的基本操作
  7. 大資料處理問題,用spark處理下

二面

  • 問我為啥不考慮讀博?(學的太渣,感覺沒有必要讀...)
  • 問我對前面面試官的看法(你要炒他們嗎。。。)
  • 實習聊一聊

貝殼

難度:normal+

講道理貝殼我是抱著去打小怪的心態去的,並沒打算留下的,但是面試體驗很好,最後給的薪水超高、福利也爆炸,缺點的話大家懂得,偏養老,看大家選擇吧。算是幫一面的大哥打波廣告吧

一面

資料傾斜怎麼處理,我個人感覺我回答的比較差,以前沒仔細思考過這個問題,後來查了查發現裡面有很多道道。

但面試官很nice,問了問我其他方面,感覺還不錯,後面和我討論了30分鐘的職業發展問題,感覺來的很值,大哥我能加你微信嗎...

二面

比較年輕的高冷小哥面我的

  • Spark架構
  • shuffle過程
  • Spark Streaming 原理
  • 一道關於棋盤左上角跑到右下角的問題,從搜尋、dp、到數學的方法都討論了一遍
  • 機器學習捎帶說了一嘴
  • 實習聊了聊

題外話

寫給需要的,不想死磕網際網路的人:ヽ(。◕‿◕。)ノ

  1. 讀博真的不錯,大家可以考慮下,真的是條出路,尤其你比較年輕的話
  2. 戶口網際網路不可兼得,最近在考慮戶口唉
  3. 國企、銀行、公務員都可以考慮啊,感覺這類工作有空陪家人

知識點

最後,送上我面試過程中整理出的知識點(可能有誤-_-||),供大家查漏補全,希望大家都能找到個好offer (@^0^@)

Java

執行緒併發

這就是一天坑,基本問不完,難度也是拉滿的那種...

Q:程式和執行緒的區別?

  1. 程式是資源分配的基本單位,執行緒是程式執行的最小單位
  2. 程式有獨立的地址空間,執行緒依託於程式存在,執行緒切換的開銷小
  3. 多程式組成的服務更穩定,一個程式掛了不會對另一個程式造成影響,相反,一個執行緒掛了,依託該程式的所有執行緒都會崩潰

Q:程式間通訊方式?

  • 管道
  • 訊號量
  • 訊息佇列
  • 共享記憶體(IPC)
  • socket

核心目的是交換資料

除了會列舉,這些名詞的具體概念也應該做到心中有數,傳送門

Q:執行緒間通訊方式?

  • 鎖機制
  • 訊號量

核心目的是同步

Q:Callable、Runnable區別?

  1. 核心區別 Callable 有返回值,Runnable 沒有返回值
  2. Callable的方法是call(),而 Runnable的方法是run()
  3. Callable可以丟擲異常,而 Runnable不可以丟擲異常

Q:Future和Callable的關係?

  • Callable執行完後會有一個返回結果,可以通過Future類返回(非同步計算的結果)。
  • 此外,應當瞭解下FutureTask,其實現了Runnable和Future,並存在接收Callable的建構函式

Q:建立執行緒的方法?

  1. 繼承Thread,再通過Thread的start()
  2. 實現Runnable,再通過new Thread(runnable)包裝後,start()
  3. 用ExecutorService提交

Q:volatile關鍵字的作用?

  1. 防止指令重排(單例模式中)
  2. 記憶體可見性

Q:synchronized的用法?

  1. 修飾例項方法,作用於當前物件,兩個不同物件不衝突
  2. 修飾靜態方法,作用於當前類,兩個不同物件也衝突
  3. 修飾程式碼塊,對指定物件加鎖

Q:講一下Java記憶體模型?

網上一大堆,引用前人的清明上河圖

金九銀十鐵12,目前騰訊、美團等五家大廠都收到意向offer | 掘金技術徵文

Q:CountDownLatch和CyclicBarrier瞭解嗎?

  • CountDownLatch中一個執行緒等待其他幾個執行緒完成。
  • CyclicBarrier中幾個執行緒相互等待某一事件的達成。
  • CyclicBarrier可以複用。

任意門

Q:Semaphore用法?

控制一組資源的使用,通過acquire()和release()獲取和釋放這組鎖,盼盼防盜門

Q:ThreadLocal作用?

修飾變數,控制變數作用域,使變數在同一個執行緒內的若干個函式中共享。

大佬指路

Q:單例與多例的區別?

  1. 單例非static和static變數都是執行緒不安全的
  2. 多例非static變數是執行緒安全的,但static變數依舊是執行緒不安全的
  3. 可以通過synchronized或ThreadLocal來完成static變數的執行緒安全

大佬

Q:鎖釋放的時機?

  1. 執行完同步程式碼塊後
  2. 執行同步程式碼塊途中,發生了異常,導致執行緒終止
  3. 執行同步程式碼塊途中,遇到wait關鍵字,該執行緒釋放物件鎖,當前執行緒會進入執行緒等待池中,等待被喚醒

Q:notify喚醒時機?

notify後不會立刻喚醒處於執行緒等待池中的執行緒,而是等當前同步程式碼塊執行完,才釋放當前的物件鎖,並喚醒等待執行緒。

Q:notify和notifyAll區別?

notify通知一個執行緒獲取鎖,而notifyAll通知所有相關的執行緒去競爭鎖

Q:講一下Lock?

Lock是為了彌補synchronized的缺陷而誕生的,主要解決兩種場景

  1. 讀寫操作,讀讀不應該互斥
  2. 避免永久的等待某個鎖

Lock是一個類,並非Java本身帶的關鍵字,相對於synchronized而言,需要手動釋放鎖。

Q:鎖的種類?

  1. 可重入鎖,如ReentrantLock
  2. 可中斷鎖,lockInterruptibly()反應了Lock的可中斷性
  3. 公平鎖,synchronized是非公平鎖,Lock預設也是非公平鎖(可調整)
  4. 讀寫鎖,如ReadWriteLock

大佬集散地

集合

集合相對容易,常規送分題,基本都會問到HashMap

Q:TreeSet特性?

內部元素通過compare排序。

Q:LinkedHashMap特性?

內部有個雙向連結串列維護了插入key的順序,使得map能夠依據插入key的順序迭代。

Q:ArrayList與Vector的差別?

ArrayList是非執行緒安全的,Vector是執行緒安全的。

Q:LinkedList與ArrayList的差別?

  1. LinkedList基於連結串列,ArrayList基於陣列
  2. LinkedList沒有隨機訪問的特性
  3. ArrayList刪除新增元素沒有LinkedList高效

Q:HashMap與HashTable的差別?

  1. HashTable執行緒安全,HashMap執行緒不安全
  2. HashMap允許null key和value,而HashTable不允許

Q:Set與List的差別?各自有哪些子類?

Set不允許重複元素,List允許重複元素,List有索引

  • Set:HashSet、LinkedHashMap、TreeSet
  • List:Vector、ArrayList、LinkedList

Q:hashCode()、equals()、==區別?

  1. equals 比較兩個物件是否相等,若相等則其hashCode必然相等
  2. 若兩個物件的hashCode不等,則必然不equals
  3. ==比較記憶體地址,比較是否是同一物件

Q:Java容器中新增的物件是引用還是值?

引用

Q:Iterator和ListIterator的區別?

  1. ListIterator 能向前遍歷,也能向後遍歷
  2. 可以新增元素
  3. 可以定位當前index

Q:HashMap實現?

內容巨多,引用大佬面經,值得一看,目錄供大家參考

  • hashing的概念
  • HashMap中解決碰撞的方法(拉鍊法)
  • equals()和hashCode()的應用,在HashMap中到底如何判斷一個物件有無
  • 不可變物件的好處
  • HashMap多執行緒的條件競爭
  • 重新調整HashMap的大小

PS:HashSet是通過HashMap實現的

Q:ConcurrentHashMap和HashTable區別?

  1. HashTable通過synchronized來實現執行緒安全
  2. ConcurrentHashMap通過分段鎖,僅鎖定map的某一部分

GC

這塊主要介紹JVM記憶體的劃分以及GC演算法

Q:什麼是記憶體洩漏和記憶體溢位?

  • 記憶體洩漏:無法釋放已申請的記憶體空間,一次記憶體洩露危害可以忽略,但堆積後果很嚴重,無論多少記憶體,遲早會被漏光。
  • 記憶體溢位:沒有足夠的記憶體空間供其使用。

記憶體洩漏最後會導致沒有足夠的空間分配物件,從而導致記憶體溢位,當然也可能開始分配過大的物件導致記憶體溢位

Q:導致記憶體溢位的因素?

  1. 記憶體中載入的資料量過於龐大,如一次從資料庫取出過多資料。
  2. 集合類中有物件的引用,使用完後未清空,使得JVM不能回收。
  3. 程式碼中存在死迴圈或迴圈產生過多重複的物件實體。
  4. 啟動引數記憶體值設定的過小。

後門

Q:JVM記憶體劃分?

  • 堆:物件
  • 方法區:類、靜態變數和常量
  • 棧:區域性變數表

基本說出上面三條就可以了,更詳細的見下圖,前門

金九銀十鐵12,目前騰訊、美團等五家大廠都收到意向offer | 掘金技術徵文

Q:簡單說一下垃圾回收?

這可不簡單...

垃圾定義:

  • 引用計數法:迴圈引用會bug
  • 可達性演算法:GC Roots,如 棧中的引用物件、方法區靜態、常量物件、本地方法區內的物件,不在堆中就可以

堆中記憶體分佈:

  • 新生代(33%):小物件,Eden:From Survivor:To Survivor=8:1:1
  • 老年代(66%):大物件、長期存活的物件
  • 永生代(三界之外):通常利用永生代來實現方法區

垃圾回收演算法:

  • 標記清除演算法
  • 複製清除(新生代)
  • 標記整理清除(老年代)

反正是門

Q:Minor GC、Major GC和 Full GC的區別?

  • Minor GC是對新生代做垃圾回收
  • Major GC是對老年代做垃圾回收
  • Full GC是對整個堆做垃圾回收

Q:Full GC觸發時機?

  1. System.gc(),並非一定觸發,只是建議
  2. 老年代空間不足(核心觸發點,其他方案都是從這裡衍生出來)
  3. 永生代空間不足(當將方法區放在永生代中時)
  4. Minor GC後晉升到老年代中的大小>老年代剩餘空間(其實就是2.老年代空間不足的一種表現)
  5. 堆中分配大物件(大物件可以直接進入老年代,導致老年代空間不足)

Q:什麼是常量池?

常量池分為靜態常量池和執行時常量池。

  • 靜態常量池:指的是在*.class檔案中的常量池
  • 執行常量池:指的是將*.class檔案中的常量裝載到記憶體中方法區的位置(當方法區放在永生代時,也可以理解為記憶體中的永生代)

包含的資訊:

  • 字串字面量
  • 類、方法資訊

該問題一般會引出字串常量比較

    String s1 = "Hello";
    String s2 = "Hello";
    String s3 = "Hel" + "lo";
    String s4 = "Hel";
    String s5 = "lo";
    String s6 = s4 + s5;
    String s7 = "Hel" + new String("lo");
    String s8 = new String("Hello");
    String s9 = s8.intern();

    System.out.println(s1 == s2);  // true,直接取自常量池
    System.out.println(s1 == s3);  // true,在編譯時會優化成常量池內字串的拼接,區別 s6
    System.out.println(s1 == s6);  // false,本質上是變數拼接,區別 s3
    System.out.println(s1 == s7);  // false,含有物件 new String("lo")
    System.out.println(s1 == s8);  // false,物件與字串常量比較
    System.out.println(s1 == s9);  // true,字面量比較
複製程式碼

類載入

面試時有人問到過,回去大概查了下

Q:講一下類載入過程?

  1. 載入:將*.class檔案通過各種類載入器裝載到記憶體中

  2. 連結:分為三步

    1. 驗證:保證載入進來的位元組流符合JVM的規範,我理解成語法上的驗證(可能不嚴謹)
    2. 準備:為類變數(非例項變數)分配記憶體,賦予初值(該初值是JVM自已約定的初值,非使用者自定義初值,除非是常量,用final static修飾的)
    3. 解析:將符號引用替換成直接引用(A.a()=> 某一記憶體地址)
  3. 初始化:對類變數初始化,執行類變數的構造器

Q:Java初始化順序?

這是在愛奇藝碰到的一面試道題,當時差點兩眼一抹黑過去了...頭一次發現這麼多東西要初始化

  1. 一個類中初始化順序(先類後例項)

類內容(靜態變數、靜態初始化塊) => 例項內容(變數、初始化塊、構造器)

  1. 繼承關係的兩個類中初始化順序(先類後例項,再先父後子)

父類的(靜態變數、靜態初始化塊)=> 子類的(靜態變數、靜態初始化塊)=> 父類的(變數、初始化塊、構造器)=> 子類的(變數、初始化塊、構造器)

石頭門

Q:Java類載入器的種類?

  1. 啟動Boostrap類載入器:載入路徑<JAVA_HOME>/lib
  2. 擴充套件Extension類載入器:載入路徑<JAVA_HOME>/lib/ext
  3. 系統System類載入器:載入路徑 -classpath

Q:雙親委派模式瞭解嗎?

我理解的深度比較淺,個人理解,委派就是載入類時先看上層載入過沒,如果載入過了,當前就不載入了,直接使用當成載入器載入的類。

其次是載入順序,System->Extension->Boostrap

優點:

  • 避免重複載入類
  • 核心API不會被改動

物件導向

這些問題很弱雞,但考的也比較多

Q:物件導向的三大特性?

順口溜一般的背出來:封裝、繼承、多型

然後會讓你講講這三個特性如何體現,大家自己想想吧,言之有理即可

Q:Java中介面和抽象類區別?

  1. 可以實現多個介面(implement),但只能繼承一個抽象類(extend)
  2. 介面中的方法不能實現,抽象類中可以實現部分方法
  3. 介面中資料全是public static final型別的,方法全是public abstract的
  4. 本質上,介面是說物件能幹什麼,抽象類是說物件是什麼

Q:過載和重寫?

豬腦子,老記混

  • 過載:同一個類中,函式名一樣,但接受的引數一定不同,返回的結果可以不同
  • 重寫:不同類中,函式名一樣,引數一樣,結果也一樣

設計模式

Q:例舉一下你瞭解的設計模式?

一般說5、6個,有個樣例就行了

  • 組合模式:集合的addAll
  • 裝飾者模式:stream的各種巢狀
  • 抽象工廠:JDBC中driver建立新連線
  • 建造者模式:StringBuilder或SQL中PreparedStatement
  • 責任鏈:structs2中對請求的處理各種Filter
  • 直譯器:正規表示式
  • 觀察者:swing中的事件監聽各種Listener

Q:手擼單例?

擼完,讓你講講內部細節,volatile或多例問題

    public class Singleton {
        private volatile static Singleton singleton;
        private Singleton(){}
        public static Singleton getSingleton(){
            if (singleton == null) {
                synchronized (Singleton.class) {
                    if (singleton == null) {
                        singleton = new Singleton();
                    }
                }
            }
            return singleton;
        }
    }
複製程式碼

網路協議

Q:TCP3次握手4次揮手?

基本畫張圖就K.O.了,fate門,內部的問題也建議看一下

Q:TCP為什麼是一定要是3次握手,而不是2次或3次以上?

2次揮手的問題

在第1次建立過程中,client請求連結在網路中滯留過久,導致client傳送第2次請求,建立完畢後,這時第1次的請求到達server,server接收又維護一連結,但該連結實際上已經作廢,浪費了server端的資源。

3次以上的方案

理論上,做到3次以上是可行的,但真正想做到一個完美可靠的通訊是不可能的,因為每次答覆都是對上次請求的響應,但該次答覆在不可靠的通道中仍是會丟失的,考慮到現實效率問題,3次足以。

Q:TCP為什麼是4次揮手,而不是3次呢?

  • 握手的第二次攜帶了,響應ACK和請求SYN資訊
  • 揮手過程中不能一次性攜帶這兩種資訊,因為server方可能還有資料沒傳輸完。

Q:TCP半連線池與全連線池?

  • 半連線池:接受client握手第一步請求時,將該次連結放到半連線池中,Synflood的主要攻擊物件
  • 全連線池:接受client握手第二步請求時,將該次連結從半連線池中取出放到全連線池中。

Q:TCP和UDP的區別?

  1. TCP基於連線,而UDP基於無連線
  2. TCP由於有握手和揮手的過程消費資源相對較多
  3. TCP是傳輸資料流,而UDP是資料包
  4. TCP保證資料正確性和順序性,而UDP可能丟包,不保證有序

Q:TCP和UDP的應用?

  • TCP:FTP、HTTP、POP、IMAP、SMTP、TELNET、SSH
  • UDP:視訊流、網路語音電話

Q:TCP/IP與OSI模型?

TCP/IP模型,自下而上

  1. 鏈路層
  2. 網路層(IP、ICMP、IGMP)
  3. 運輸層(TCP、UDP)
  4. 應用層(Telnet、FTP)

OSI模型,自下而上

  1. 物理層
  2. 資料鏈路層
  3. 網路層
  4. 運輸層
  5. 會話層
  6. 表示層
  7. 應用層

Q:ping命令基於哪種協議?

ICMP

Q:阻塞式和非阻塞式IO區別?

阻塞式

  • 每來一個連線都會開啟一個執行緒來處理,10個執行緒對應10個請求
  • 執行緒大多時候都在等在資料的到來,浪費資源
  • 適合併發量小,資料量大的應用

非阻塞式

  • 基本思想,將所有連線放在一張table中,然後輪詢處理
  • 實現上可以用事件通知機制,可以用10個執行緒處理100個請求
  • 適合併發量大,資料量小的應用

資料庫

用資料庫做過開發,但是瞭解的不深入,面試問我會不會寫SQL時,我多答“簡單的可以,複雜的嘗試一下”...SQL複雜起來真不是人寫的...

Q:聚集索引和非聚集索引區別?

  • 聚集索引:葉子節點是實際資料,表中只能有一個聚集索引
  • 非聚集索引:葉子節點是地址,需要再跳轉一次,表中可以有多個非聚集索引

Q:where、group by、having執行順序?

  1. where 過濾行資料
  2. group by 分組
  3. having 過濾分組

Q:星型、雪花結構?

  • 星型:存在部分冗餘
  • 雪花:表切分的十分細,沒有冗餘

出自

Q:SQL縱向轉橫向,橫向轉縱列?

基本上,除了 group by + 聚集函式 外,這是最難的 SQL 題了

  • 縱向轉橫向

sum(case when A='a' then B else 0 end) as D

這裡需要用sum或其他聚集函式,因為作用在一個group中

  • 橫向轉縱向

核心用union

記住這兩條做到舉一反三就可以了,Demo

Q:髒讀、不可重複讀、幻讀?

  • 髒讀:事務A讀取了事務B提交的值
  • 不可重複讀:事務A兩次讀取了事務B的值,事務B在該過程中修改並提交過,導致A兩次讀取值不一致
  • 幻讀:事務A修改 a 到 b ,事務B在該過程中新增了新的a,導致新新增的a,沒有修改成b

這引出事務隔離級別

事務隔離級別 髒讀 不可重複讀 幻讀
讀未提交(read-uncommitted)
不可重複讀(read-committed)
可重複讀(repeatable-read)
序列化(serializable)

Q:join實現的三種方式?

  • nested loops:巢狀迭代,相當於兩個for迴圈,內部表有索引時,效果較好
  • merge join:將兩表先sort(如果沒sort的話),再合併
  • hash join:將表hash,然後掃描另一表

Linux

Q:檢視xxx埠占用?

  • netstat -tunlp |grep xxx
  • lsof -i:xxx

Q:檢視xxx程式佔用?

  • ps -ef |grep xxx

Q:檢視CPU使用情況?

  • top

Q:檢視記憶體使用情況?

  • free
  • top

Q:檢視硬碟使用情況?

  • df -l

Q:$0、$n、$#、$*、$@、$?、$$含義?

變數 含義
$0 當前指令碼的檔名
$n 傳遞給指令碼的第n個引數
$# 傳遞給指令碼的引數個數
$* 傳遞給指令碼所有引數
$@ 傳遞給指令碼所有引數。與$*有小差別,出門下扒
$? 上個命令的退出狀態
$$ 當前Shell程式ID

Q:>、>>區別?

  • >:重定向到一個檔案
  • >>:追加到一個檔案

Q:>、1>、2>、2>&1、2>1區別?

  • >:預設是正確輸出到某一檔案,錯誤直接輸出到控制檯
  • 1>:正確輸出
  • 2>:錯誤輸出
  • 2>&1:將錯誤輸出重定向到正確輸出中,一般前面會有 1> a.txt,這樣後面的錯誤也會輸出到 a.txt,通過正確輸出
  • 2>1:錯誤輸出到 1 檔案中,錯誤寫法,區分&1

Q:定時任務命令?

  • crontab

演算法

演算法的海洋的無邊無際,但是應付面試題的演算法,個人認為《劍指offer》一本足矣...

個人《劍指offer》刷了大概四遍,基本上看到一道題,所有解法都知道,面試上也基本從這裡出

我遇到現場出的演算法題(除了《劍指offer》上的),一般是暴力搜尋題,不要上來想DP...

經典問題

  • 子串匹配問題
  • 子序列匹配問題
  • 合併連結串列
  • 樹中兩個節點最近的公共父節點
  • 快排、堆排
  • 各種型別的二分查詢
  • 兩數交換,不用第三變數
  • 水塘抽樣,大佬題解

智力題

  • 一根棍子隨機折三節,組成三角形的概率
  • 倒水問題
  • 麵粉稱重問題
  • 燒繩子問題

大資料

這方面一般問的是偏向於各類框架

  • Hadoop
  • Yarn
  • Spark
  • Hive
  • HBase
  • Zookeeper

以上框架,大家各取所需吧,總有幾個要能拿出來吹的,我個人主要吹Spark這塊

Hive、HBase一般也是當工具用的,主要問平時用沒用過,用過的話就會多問些,我一般是回答搭建過,照著文件看過一陣子,對方一般就不問了

Zookeeper在底層維護分散式的一致性,多少了解一些分散式協議raft這類的也是加分點

Hadoop

Q:兩表Join方案?

  1. reduce side join:最基本的
  2. map side join:分發小表,做only map
  3. semi join + reduce side join:提取一表的key,分發出去,再做reduce side join,減輕join的資料量
  4. semi join + bloomfilter + reduce side join:基於上面方案的改良,主要應對key太大也放不下去的情況

3、4方案瞭解即可,個人感覺有些不靠譜,面試中一般沒提,面試官一般要求到2,有資料傾斜的另說

Q:MapReduce過程?

大資料崗位必考題

三言兩語也說不清,建議去看網上大佬的,傳送門

看完後能回答如下幾個問題即可:

  • map處理過程中,資料滿了如何處理的
  • combiner作用、位置
  • 幾次sort,發生位置,什麼樣的sort

Q:Hadoop 中 Secondary NameNode作用?

合併fsimage與editlog

Yarn

Q:Yarn架構?

洛神賦圖

Q:Yarn相對於Hadoop的優勢,或說為什麼要有Yarn?

  1. 簡化JobTracker,將其功能下放到ResourceManager和ApplicationMaster
  2. 資源以記憶體為單位,相比之前剩餘slot更合理
  3. 通過Container的抽象,使叢集能支援多種框架如Spark

Q:Yarn的三種排程器?

這三張圖很好,但我認為這樣理解的深度不夠...有興趣的多看看

金九銀十鐵12,目前騰訊、美團等五家大廠都收到意向offer | 掘金技術徵文

金九銀十鐵12,目前騰訊、美團等五家大廠都收到意向offer | 掘金技術徵文

金九銀十鐵12,目前騰訊、美團等五家大廠都收到意向offer | 掘金技術徵文

步輦圖

Q:Yarn延遲排程的含義?

主要針對當作業所需的資源,在本地並沒有滿足時,會延遲一段時間,再嘗試排程,實在不行時會放到別的機器上排程,主要因為本地排程效率最高。

Spark

Q:Spark有幾種部署模式?

  1. local
  2. standalone
  3. yarn
  4. mesos

Q:standalone基本架構?

  • Client:提交job
  • Master:收集client提交的job,管理worker
  • Worker:管理本節點的資源,定時想master彙報使用情況
  • Driver:含DAGScheduler、TaskScheduler,根據client與cluster決定driver的具體在client還是worker上
  • Executer:位於Worker上,job真正執行的地方

Q:groupByKey和reduceByKey哪個效率高?

  • reduceByKey效率更高,在每個executor上執行時,附帶合併邏輯,結果更緊湊(可以理解為 key,value),shuffle量小
  • groupByKey保留同key的所有資料(可以理解為 key,List)

Q:資料傾斜是什麼?如何處理?

必考題,可以問的很深...

定義:shuffle過程中,某個幾個key對應的value太多,集中在某一個reduce task中,導致該task處理過慢或直接崩掉(out of memory)

解決方案:

  • 換用更高效能的計算機,加memory:從而避免記憶體溢位,不過治標不治本,面試官一般不會滿意
  • 修改並行度:說不定剛好把這幾個擁有眾多value的key劃分開來,當都集中在少數的key,或說在1個key上時,無效
  • 加隨機數,做兩次聚合:第一次聚合時,key以 random數_key 作為新key,第二次聚合時,去掉random數,相當於將原始key所對應的分割槽先區域性聚合,再統一聚合,面試官一般期待能講到這裡

求大佬點撥,個人認為隨機數這種演算法可以解決一定的資料傾斜,但

  1. 用combiner的思想和這個是一致的?那random數_key似乎沒有什麼價值了
  2. 只能解決可以用combiner的場景,不能用combiner的場景如何解決呢?

Q:傾斜join如何處理?

和上面的資料傾斜有一定聯絡,但不完全相同

  • map side join:在hadoop那邊講join方式提到過
  • 加隨機值並擴容表:將傾斜key中,較小表對映成 range_key,其中range取遍[0,...,n-1]中每個數,即小表中每條記錄會被對映成n條不一樣key的記錄;將較大表對映成single_key,其中single 是由 random(n) 產生,即大小表中每條記錄會被對映成唯一一條隨機key的記錄,然後做join即可

Q:基本概念?

問的很多,主要看你對Spark的瞭解程度

  • RDD
  • DAG
  • Stage
  • 寬依賴、窄依賴
  • 並行度

Q:列舉一下transform和action?

  • transform:filter、map、flatmap、reduceByKey、groupByKey
  • action:take、collect、count、foreach

Spark Streaming

我一般和麵試官吹 Spark Streaming,這部分提供給有需要的人吧

Q:Spark Streaming原理?

將資料流劃分成mini batch,本質上是小批量資料的連續處理,核心是定時觸發Job的提交,除此之外,針對流計算中window一類的概念做了一些特殊處理,面試官要是還問你就給他展開講講...這裡我就不展開了

Q:資料接收方式?

這點我一般結合Kafka來說,從Kafka接受資料有兩種方案:

  • 基於receiver:需要拉取資料到本地,並做好備份,自己保證資料的完整性
  • 基於底層API(direct):由kafka保證資料的完整性,spark streaming這邊只是計算好需要拉取的offset就可以了

Q:基於receiver資料接收的實現細節?

面試官這點主要想了解你對Spark Streaming原始碼的熟悉程度,是否真正的深入研究過其接收過程,其實糊弄一下還是比較容易的...

  1. 從receiver接收的資料會從在一個buffer中
  2. 這時會有兩個定時器來處理
    • 定時將buffer中的資料封裝成block
    • 定時將block傳播出去存到BlockManager中,保證資料完整性的

Q:exactly once如何保證?

個人認為這個問題是個很狠的問題,這個不是某幾個元件的使用問題,而是整個系統的協調組織,我主要從三個方面來說這個問題

  1. 資料來源:保證資料來源可回溯,防止資料丟失後,找不到原始資料,這樣需要可靠的訊息佇列來保證,如Kafka
  2. 處理框架:處理框架需要自身來維護offset,在失敗時,能夠明確自己處理到什麼位置,由於資料完整性由上游保證,這裡用 direct 的方式拉取即可
  3. 輸出:輸出運算元要保證冪等性

我的理解就這麼多,感覺很淺,歡迎大佬補充...

Kafka

Q:基本架構?

金九銀十鐵12,目前騰訊、美團等五家大廠都收到意向offer | 掘金技術徵文

金九銀十鐵12,目前騰訊、美團等五家大廠都收到意向offer | 掘金技術徵文

金九銀十鐵12,目前騰訊、美團等五家大廠都收到意向offer | 掘金技術徵文

  1. Producer
  2. Consumer
  3. Broker
  4. Topic
  5. Partition
  6. Leader
  7. Follower
  8. User Group
  9. Offset

能把以上這些概念串起來基本就OK

Q:介紹下ISR副本策略?

一個leader與一堆副本follower,follower從leader上拉取副本並返回ack,leader收集到足夠多的ack後,認為該message是committed,並返回給client。

該leader與這些follower被稱為 in sync 狀態,這個集合是動態變化的,當某個follower拉下太多時,會被踢出該集合,從而保證了能快速的響應使用者請求,當它追上來時會再加入該集合。

為了保證資料不丟失,可以設定該集合最少需要多少個follwer,當小於該數時該partition便不可用

瞅一眼?

HBase

Q:介紹下HBase的原理與設計?

金九銀十鐵12,目前騰訊、美團等五家大廠都收到意向offer | 掘金技術徵文

講的很棒的一篇文章,唐宮仕女圖

看完後能複述下面基本概念

  • Master
  • RegionServer
  • Region
  • memstore
  • HFile
  • HLog

其實還有章ML沒寫,但感覺問的不深就沒寫了,大家有需求的話我在補上吧 (ฅ´ω`ฅ)

小姐姐說要附上☞【徵文連結】

小姐姐說要點贊╰( ̄▽ ̄)╮

金九銀十鐵12,目前騰訊、美團等五家大廠都收到意向offer | 掘金技術徵文

相關文章