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

互聯網提早批基本告一段落,大大小小的offer也拿了一些,秉着回報社會,堅持中國特點社會主義,挽救新一代碼農的思想,整理了下各個公司的麪筋、考點,但願能激勵各位搬磚工,起到鼓足幹勁,力爭上游的做用O(∩_∩)Ohtml

噱頭

小姐姐♀說先拿出offer炸炸人,不然沒人看...咱不是那麼庸俗的人,但也沒有那麼脫俗...python

鄙人從7月中旬開始找工做,找的是大數據研發 or 大數據算法方向,反正圍着大數據打☯️,截止到9.12號爲止,騰訊、美團、360安全研究院、搜狗、貝殼 都收到意向offerlinux

固然掛麪也吃了很多😭面試

  • 阿里招聘系統有點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

1、二面

  • 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內存模型?

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

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內存劃分?

  • 堆:對象
  • 方法區:類、靜態變量和常量
  • 棧:局部變量表

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

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:例舉一下你瞭解的設計模式?

通常說五、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>&一、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太大也放不下去的狀況

三、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的三種調度器?

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

步輦圖

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:基本架構?

  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的原理與設計?

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

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

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

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

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

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

相關文章
相關標籤/搜索