網際網路提前批基本告一段落,大大小小的offer也拿了一些,秉著回報社會,堅持中國特色社會主義,挽救新一程式碼農的思想,整理了下各個公司的麵筋、考點,希望能激勵各位搬磚工,起到鼓足幹勁,力爭上游的作用O(∩_∩)O
噱頭
小姐姐♀說先拿出offer炸炸人,否則沒人看...我們不是那麼庸俗的人,但也沒有那麼脫俗...
鄙人從7月中旬開始找工作,找的是大資料研發 or 大資料演算法方向,反正圍著大資料打☯️,截止到9.12號為止,騰訊、美團、360安全研究院、搜狗、貝殼 都收到意向offer
當然掛麵也吃了不少?
- 阿里招聘系統有點bug,沒找到機會去面,然後接受了一波勸退性筆試,最近看能不能找個好心的小姐姐推我進去面一波
- 百度三面電話沒接起來,然後沒然後了...
- 網易接了一波玄面~
- 頭條也去面了一波,不過真的沒複習那麼全,回來海學一波,也算值
- 滴滴給了一“真內推”(直接問能來實習不,來就有...),不過最近在風頭上,考慮中...
offer的具體工作內容不介紹了,怕被HR小姐姐查出來,請我去喝茶...
閒聊
本人北京985渣碩一枚,是真的渣,舍友商湯、曠世,出國留學,學校中各類大佬一坨,在夾縫中求生,混口飯吃
主攻方向:無。領導搞行政的,天天端茶倒水取快遞,外掛寫不盡的基金本子,論文全靠個人參悟+上天憐憫
說點正事吧,關於工作路線,我最終選擇的是大資料研發方向,主要原因是研一上了點分散式的課,拿出來吹一吹,還能唬的住人。個人感覺演算法也能做,研發、演算法半斤八兩吧
學校這邊的話,有優秀高校背書自然要好,沒有的話,就沒有吧,大牛們不差這點,渣渣們大家也強不到哪去,不必強求
專案,在讀書過程中,一定要了解個專案,否則面試官真沒啥問題你的,尬場基本就涼涼了。這專案不必真的是你的,當找工作時,所有前輩、朋友的專案全都是你的,包裝下,你說是你的就是你的,沒人去查你底細的,關鍵瞭解要深,這樣和別人說底氣才足。我有幸給一個資料流專案做了些邊角任務,但在簡歷上,我成為了該專案的負責人...自己體會包裝的藝術...
簡歷,我以前認為大家“沒見過豬跑還沒吃過豬肉嗎”,網上那麼多強調簡歷重要性的,直到我看見我小師弟的簡歷,發現真的有人沒吃過豬肉(我學碩他專碩,一起找工作,他有百度大廠背書,可這工作找的唉...)。最簡單的修改方法,讓你附近的同學看看,第一眼感覺可以嗎,可以就ok,不可以就gg,照著人家的改改
現在前頭,準備要早,投的也要早基本7月中旬就陸陸續續開始有提前批了,錯過就沒了>...<
乾貨
這貨也不幹,過去一整陣子了,我能寫多少給大家寫多少吧,考點網上一抓一大把
技術面
先說說技術面流程:
- 讓你做自我介紹(準備好)
- 看看你簡歷,說你對這個比較熟?balabla...你問的簡單就熟,問的難不好意思不太瞭解
- 看看你實習經歷,讓你介紹實習幹啥了,有沒有什麼大專案能拿得出手,幹聊10-20分鐘的
- 問問職業規劃。這裡表現出你態度的虔誠,不會亂跳槽,踏踏實實的幹,讓他感受到你想進這家公司,兩眼能放光就更好了... 大佬們可以海吹一波
- 你有啥子問題。我一般預備兩個問題,您這部門具體做什麼能介紹一下?我什麼時候能知道自己是過了還是沒過呢?儘量不要不問,各路大佬在貼中都說過了
一定要把主動權掌握在自己手中,面試官會問很多你平時不瞭解或壓根不知道的問題,這時你可以說平時我用不到這些(可以理解啊,應屆生上哪懂這麼多邪門歪道啊,大佬請無視我),然後說自己對xxx領域有點研究,引導他來問你
對面提問你時,其實很考驗你答辯技巧的,當你熟悉的東西時,那很OK,balabala即可,問你不熟悉的(你只知道點皮毛,但也在簡歷上寫了),你可以說“我做專案時碰到過一點,大體查了下,有點印象,您可以試著問一下”,這樣會讓面試官把期望放低,問題難度也會降低,答出來加分,答不出來也無所謂
HR面
- 自我介紹(準備版非技術的! 從本科到大學,研究方向,選擇這家公司理由,實習經歷拉一拉,時間一般能湊夠了,讓對方感覺你是個健談的人)
- 聊聊興趣愛好(準備些健康的愛好,遊戲公司可以考慮非健康的...)
- 聊聊實習經歷,和上下級處的如何,有壓力怎麼辦
- 你有啥問題。我對這部門還有些不瞭解,您能在系統介紹下嗎?入職培訓介紹一下?
下面具體拉拉各廠面試經歷吧,我把比較有特色的問題列出來,統一的我放在下面知識點了,重寫太麻煩了...
騰訊
難度: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
一面
兩個面試官,發了張卷子,裡面什麼題都有:
- 排序、有重複的陣列中查詢某數的index,注意不要退化成o(N)的演算法
- 在一棵樹中查詢兩個節點的最近公共父節點(就是頭條二面那道題)
- linux $$ $# $0 等含義
- 智力題 50紅 50黑 分配兩袋子摸球問題
- n!後面有多少個0
- hdfs的基本操作
- 大資料處理問題,用spark處理下
二面
- 問我為啥不考慮讀博?(學的太渣,感覺沒有必要讀...)
- 問我對前面面試官的看法(你要炒他們嗎。。。)
- 實習聊一聊
貝殼
難度:normal+
講道理貝殼我是抱著去打小怪的心態去的,並沒打算留下的,但是面試體驗很好,最後給的薪水超高、福利也爆炸,缺點的話大家懂得,偏養老,看大家選擇吧。算是幫一面的大哥打波廣告吧
一面
資料傾斜怎麼處理,我個人感覺我回答的比較差,以前沒仔細思考過這個問題,後來查了查發現裡面有很多道道。
但面試官很nice,問了問我其他方面,感覺還不錯,後面和我討論了30分鐘的職業發展問題,感覺來的很值,大哥我能加你微信嗎...
二面
比較年輕的高冷小哥面我的
- Spark架構
- shuffle過程
- Spark Streaming 原理
- 一道關於棋盤左上角跑到右下角的問題,從搜尋、dp、到數學的方法都討論了一遍
- 機器學習捎帶說了一嘴
- 實習聊了聊
題外話
寫給需要的,不想死磕網際網路的人:ヽ(。◕‿◕。)ノ
- 讀博真的不錯,大家可以考慮下,真的是條出路,尤其你比較年輕的話
- 戶口網際網路不可兼得,最近在考慮戶口唉
- 國企、銀行、公務員都可以考慮啊,感覺這類工作有空陪家人
知識點
最後,送上我面試過程中整理出的知識點(可能有誤-_-||),供大家查漏補全,希望大家都能找到個好offer (@^0^@)
Java
執行緒併發
這就是一天坑,基本問不完,難度也是拉滿的那種...
Q:程式和執行緒的區別?
- 程式是資源分配的基本單位,執行緒是程式執行的最小單位
- 程式有獨立的地址空間,執行緒依託於程式存在,執行緒切換的開銷小
- 多程式組成的服務更穩定,一個程式掛了不會對另一個程式造成影響,相反,一個執行緒掛了,依託該程式的所有執行緒都會崩潰
Q:程式間通訊方式?
- 管道
- 訊號量
- 訊息佇列
- 共享記憶體(IPC)
- socket
核心目的是交換資料
除了會列舉,這些名詞的具體概念也應該做到心中有數,傳送門
Q:執行緒間通訊方式?
- 鎖機制
- 訊號量
核心目的是同步
Q:Callable、Runnable區別?
- 核心區別 Callable 有返回值,Runnable 沒有返回值
- Callable的方法是call(),而 Runnable的方法是run()
- Callable可以丟擲異常,而 Runnable不可以丟擲異常
Q:Future和Callable的關係?
- Callable執行完後會有一個返回結果,可以通過Future類返回(非同步計算的結果)。
- 此外,應當瞭解下FutureTask,其實現了Runnable和Future,並存在接收Callable的建構函式
Q:建立執行緒的方法?
- 繼承Thread,再通過Thread的start()
- 實現Runnable,再通過new Thread(runnable)包裝後,start()
- 用ExecutorService提交
Q:volatile關鍵字的作用?
- 防止指令重排(單例模式中)
- 記憶體可見性
Q:synchronized的用法?
- 修飾例項方法,作用於當前物件,兩個不同物件不衝突
- 修飾靜態方法,作用於當前類,兩個不同物件也衝突
- 修飾程式碼塊,對指定物件加鎖
Q:講一下Java記憶體模型?
網上一大堆,引用前人的清明上河圖
Q:CountDownLatch和CyclicBarrier瞭解嗎?
- CountDownLatch中一個執行緒等待其他幾個執行緒完成。
- CyclicBarrier中幾個執行緒相互等待某一事件的達成。
- CyclicBarrier可以複用。
Q:Semaphore用法?
控制一組資源的使用,通過acquire()和release()獲取和釋放這組鎖,盼盼防盜門
Q:ThreadLocal作用?
修飾變數,控制變數作用域,使變數在同一個執行緒內的若干個函式中共享。
Q:單例與多例的區別?
- 單例非static和static變數都是執行緒不安全的
- 多例非static變數是執行緒安全的,但static變數依舊是執行緒不安全的
- 可以通過synchronized或ThreadLocal來完成static變數的執行緒安全
Q:鎖釋放的時機?
- 執行完同步程式碼塊後
- 執行同步程式碼塊途中,發生了異常,導致執行緒終止
- 執行同步程式碼塊途中,遇到wait關鍵字,該執行緒釋放物件鎖,當前執行緒會進入執行緒等待池中,等待被喚醒
Q:notify喚醒時機?
notify後不會立刻喚醒處於執行緒等待池中的執行緒,而是等當前同步程式碼塊執行完,才釋放當前的物件鎖,並喚醒等待執行緒。
Q:notify和notifyAll區別?
notify通知一個執行緒獲取鎖,而notifyAll通知所有相關的執行緒去競爭鎖
Q:講一下Lock?
Lock是為了彌補synchronized的缺陷而誕生的,主要解決兩種場景
- 讀寫操作,讀讀不應該互斥
- 避免永久的等待某個鎖
Lock是一個類,並非Java本身帶的關鍵字,相對於synchronized而言,需要手動釋放鎖。
Q:鎖的種類?
- 可重入鎖,如ReentrantLock
- 可中斷鎖,lockInterruptibly()反應了Lock的可中斷性
- 公平鎖,synchronized是非公平鎖,Lock預設也是非公平鎖(可調整)
- 讀寫鎖,如ReadWriteLock
集合
集合相對容易,常規送分題,基本都會問到HashMap
Q:TreeSet特性?
內部元素通過compare排序。
Q:LinkedHashMap特性?
內部有個雙向連結串列維護了插入key的順序,使得map能夠依據插入key的順序迭代。
Q:ArrayList與Vector的差別?
ArrayList是非執行緒安全的,Vector是執行緒安全的。
Q:LinkedList與ArrayList的差別?
- LinkedList基於連結串列,ArrayList基於陣列
- LinkedList沒有隨機訪問的特性
- ArrayList刪除新增元素沒有LinkedList高效
Q:HashMap與HashTable的差別?
- HashTable執行緒安全,HashMap執行緒不安全
- HashMap允許null key和value,而HashTable不允許
Q:Set與List的差別?各自有哪些子類?
Set不允許重複元素,List允許重複元素,List有索引
- Set:HashSet、LinkedHashMap、TreeSet
- List:Vector、ArrayList、LinkedList
Q:hashCode()、equals()、==區別?
- equals 比較兩個物件是否相等,若相等則其hashCode必然相等
- 若兩個物件的hashCode不等,則必然不equals
- ==比較記憶體地址,比較是否是同一物件
Q:Java容器中新增的物件是引用還是值?
引用
Q:Iterator和ListIterator的區別?
- ListIterator 能向前遍歷,也能向後遍歷
- 可以新增元素
- 可以定位當前index
Q:HashMap實現?
內容巨多,引用大佬面經,值得一看,目錄供大家參考
- hashing的概念
- HashMap中解決碰撞的方法(拉鍊法)
- equals()和hashCode()的應用,在HashMap中到底如何判斷一個物件有無
- 不可變物件的好處
- HashMap多執行緒的條件競爭
- 重新調整HashMap的大小
PS:HashSet是通過HashMap實現的
Q:ConcurrentHashMap和HashTable區別?
- HashTable通過synchronized來實現執行緒安全
- ConcurrentHashMap通過分段鎖,僅鎖定map的某一部分
GC
這塊主要介紹JVM記憶體的劃分以及GC演算法
Q:什麼是記憶體洩漏和記憶體溢位?
- 記憶體洩漏:無法釋放已申請的記憶體空間,一次記憶體洩露危害可以忽略,但堆積後果很嚴重,無論多少記憶體,遲早會被漏光。
- 記憶體溢位:沒有足夠的記憶體空間供其使用。
記憶體洩漏最後會導致沒有足夠的空間分配物件,從而導致記憶體溢位,當然也可能開始分配過大的物件導致記憶體溢位
Q:導致記憶體溢位的因素?
- 記憶體中載入的資料量過於龐大,如一次從資料庫取出過多資料。
- 集合類中有物件的引用,使用完後未清空,使得JVM不能回收。
- 程式碼中存在死迴圈或迴圈產生過多重複的物件實體。
- 啟動引數記憶體值設定的過小。
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觸發時機?
- System.gc(),並非一定觸發,只是建議
- 老年代空間不足(核心觸發點,其他方案都是從這裡衍生出來)
- 永生代空間不足(當將方法區放在永生代中時)
- Minor GC後晉升到老年代中的大小>老年代剩餘空間(其實就是2.老年代空間不足的一種表現)
- 堆中分配大物件(大物件可以直接進入老年代,導致老年代空間不足)
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:講一下類載入過程?
-
載入:將*.class檔案通過各種類載入器裝載到記憶體中
-
連結:分為三步
- 驗證:保證載入進來的位元組流符合JVM的規範,我理解成語法上的驗證(可能不嚴謹)
- 準備:為類變數(非例項變數)分配記憶體,賦予初值(該初值是JVM自已約定的初值,非使用者自定義初值,除非是常量,用final static修飾的)
- 解析:將符號引用替換成直接引用(A.a()=> 某一記憶體地址)
-
初始化:對類變數初始化,執行類變數的構造器
Q:Java初始化順序?
這是在愛奇藝碰到的一面試道題,當時差點兩眼一抹黑過去了...頭一次發現這麼多東西要初始化
- 一個類中初始化順序(先類後例項)
類內容(靜態變數、靜態初始化塊) => 例項內容(變數、初始化塊、構造器)
- 繼承關係的兩個類中初始化順序(先類後例項,再先父後子)
父類的(靜態變數、靜態初始化塊)=> 子類的(靜態變數、靜態初始化塊)=> 父類的(變數、初始化塊、構造器)=> 子類的(變數、初始化塊、構造器)
Q:Java類載入器的種類?
- 啟動Boostrap類載入器:載入路徑<JAVA_HOME>/lib
- 擴充套件Extension類載入器:載入路徑<JAVA_HOME>/lib/ext
- 系統System類載入器:載入路徑 -classpath
Q:雙親委派模式瞭解嗎?
我理解的深度比較淺,個人理解,委派就是載入類時先看上層載入過沒,如果載入過了,當前就不載入了,直接使用當成載入器載入的類。
其次是載入順序,System->Extension->Boostrap
優點:
- 避免重複載入類
- 核心API不會被改動
物件導向
這些問題很弱雞,但考的也比較多
Q:物件導向的三大特性?
順口溜一般的背出來:封裝、繼承、多型
然後會讓你講講這三個特性如何體現,大家自己想想吧,言之有理即可
Q:Java中介面和抽象類區別?
- 可以實現多個介面(implement),但只能繼承一個抽象類(extend)
- 介面中的方法不能實現,抽象類中可以實現部分方法
- 介面中資料全是public static final型別的,方法全是public abstract的
- 本質上,介面是說物件能幹什麼,抽象類是說物件是什麼
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的區別?
- TCP基於連線,而UDP基於無連線
- TCP由於有握手和揮手的過程消費資源相對較多
- TCP是傳輸資料流,而UDP是資料包
- TCP保證資料正確性和順序性,而UDP可能丟包,不保證有序
Q:TCP和UDP的應用?
- TCP:FTP、HTTP、POP、IMAP、SMTP、TELNET、SSH
- UDP:視訊流、網路語音電話
Q:TCP/IP與OSI模型?
TCP/IP模型,自下而上
- 鏈路層
- 網路層(IP、ICMP、IGMP)
- 運輸層(TCP、UDP)
- 應用層(Telnet、FTP)
OSI模型,自下而上
- 物理層
- 資料鏈路層
- 網路層
- 運輸層
- 會話層
- 表示層
- 應用層
Q:ping命令基於哪種協議?
ICMP
Q:阻塞式和非阻塞式IO區別?
阻塞式
- 每來一個連線都會開啟一個執行緒來處理,10個執行緒對應10個請求
- 執行緒大多時候都在等在資料的到來,浪費資源
- 適合併發量小,資料量大的應用
非阻塞式
- 基本思想,將所有連線放在一張table中,然後輪詢處理
- 實現上可以用事件通知機制,可以用10個執行緒處理100個請求
- 適合併發量大,資料量小的應用
資料庫
用資料庫做過開發,但是瞭解的不深入,面試問我會不會寫SQL時,我多答“簡單的可以,複雜的嘗試一下”...SQL複雜起來真不是人寫的...
Q:聚集索引和非聚集索引區別?
- 聚集索引:葉子節點是實際資料,表中只能有一個聚集索引
- 非聚集索引:葉子節點是地址,需要再跳轉一次,表中可以有多個非聚集索引
Q:where、group by、having執行順序?
- where 過濾行資料
- group by 分組
- 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方案?
- reduce side join:最基本的
- map side join:分發小表,做only map
- semi join + reduce side join:提取一表的key,分發出去,再做reduce side join,減輕join的資料量
- 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?
- 簡化JobTracker,將其功能下放到ResourceManager和ApplicationMaster
- 資源以記憶體為單位,相比之前剩餘slot更合理
- 通過Container的抽象,使叢集能支援多種框架如Spark
Q:Yarn的三種排程器?
這三張圖很好,但我認為這樣理解的深度不夠...有興趣的多看看
Q:Yarn延遲排程的含義?
主要針對當作業所需的資源,在本地並沒有滿足時,會延遲一段時間,再嘗試排程,實在不行時會放到別的機器上排程,主要因為本地排程效率最高。
Spark
Q:Spark有幾種部署模式?
- local
- standalone
- yarn
- 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所對應的分割槽先區域性聚合,再統一聚合,面試官一般期待能講到這裡
求大佬點撥,個人認為隨機數這種演算法可以解決一定的資料傾斜,但
- 用combiner的思想和這個是一致的?那random數_key似乎沒有什麼價值了
- 只能解決可以用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原始碼的熟悉程度,是否真正的深入研究過其接收過程,其實糊弄一下還是比較容易的...
- 從receiver接收的資料會從在一個buffer中
- 這時會有兩個定時器來處理
- 定時將buffer中的資料封裝成block
- 定時將block傳播出去存到BlockManager中,保證資料完整性的
Q:exactly once如何保證?
個人認為這個問題是個很狠的問題,這個不是某幾個元件的使用問題,而是整個系統的協調組織,我主要從三個方面來說這個問題
- 資料來源:保證資料來源可回溯,防止資料丟失後,找不到原始資料,這樣需要可靠的訊息佇列來保證,如Kafka
- 處理框架:處理框架需要自身來維護offset,在失敗時,能夠明確自己處理到什麼位置,由於資料完整性由上游保證,這裡用 direct 的方式拉取即可
- 輸出:輸出運算元要保證冪等性
我的理解就這麼多,感覺很淺,歡迎大佬補充...
Kafka
Q:基本架構?
- Producer
- Consumer
- Broker
- Topic
- Partition
- Leader
- Follower
- User Group
- 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沒寫,但感覺問的不深就沒寫了,大家有需求的話我在補上吧 (ฅ´ω`ฅ)
小姐姐說要附上☞【徵文連結】
小姐姐說要點贊╰( ̄▽ ̄)╮