公衆號(五分鐘學大數據)將推出大數據面試系列文章— 五分鐘小面試,此係列文章將會 深刻研究各大廠筆面試真題,並根據筆面試題 擴展相關的知識點,助力你們都可以成功入職大廠!
大數據筆面試系列文章分爲兩種類型:混合型(即一篇文章中會有多個框架的知識點—融會貫通);專項型(一篇文章針對某個框架進行深刻解析—專項演練)。java
此篇文章爲系列文章的第一篇(混合型)mysql
class Father{ static { System.out.println("Static Father"); } { System.out.println("Non-static Father"); } public Father(){ System.out.println("Constructor Father"); } } public class Son extends Father{ static { System.out.println("Static Son"); } { System.out.println("Non-static Son"); } public Son(){ System.out.println("Constructor Son"); } public static void main(String[] args) { System.out.println("First Son"); new Son(); System.out.println("Second Son"); new Son(); } }
運行結果:面試
Static Father Static Son First Son Non-static Father Constructor Father Non-static Son Constructor Son Second Son Non-static Father Constructor Father Non-static Son Constructor Son
分析:算法
這道程序題考察的是Java中的靜態代碼塊、構造代碼塊、構造函數的概念。sql
隨着類的加載而執行,即JVM加載類後就執行,並且只執行一次,執行優先級高於非靜態的初始化塊,它會在類初始化的時候執行一次,執行完成便銷燬,它僅能初始化類變量,即static修飾的數據成員。數據庫
執行的時候若是有靜態代碼塊,先執行靜態代碼塊再執行非靜態代碼塊,在每一個對象生成時都會被執行一次,它能夠初始化類的實例變量。非靜態代碼塊會在構造函數執行時,在構造函數主體代碼執行以前被運行。編程
對象一創建,就會調用與之相應的構造函數,也就是說,不創建對象,構造函數是不會運行的。
一個對象創建,構造函數只運行一次,而通常方法能夠被該對象調用屢次。緩存
再來看本題,程序運行,執行main()方法會先加載main()方法所在的類,加載 Son 類,可是 Son 類繼承自 Father 類,因此先加載父類,同時父類的靜態代碼塊執行,而後加載 Son 類自己,Son 類本身的靜態代碼塊開始執行,類加載完成以後執行main()方法內部的語句,打印 First Son,而後 new Son(),在建立對象時先構造父類的對象,由於靜態代碼塊只在類加載時執行一次,因此再也不執行,而後執行父類的構造代碼塊,構造函數,構造代碼塊的優先級大於構造函數。而後在執行 Son 對象自己。完成以後打印 Second Son,接着又 new Son(),重複以上步驟。構造代碼塊和構造函數在每次new的時候都會執行一次。安全
答:一般咱們定義一個基本數據類型的變量,一個對象的引用,還有就是函數調用的現場保存都使用內存中的棧空間;而經過new關鍵字和構造器建立的對象放在堆空間;程序中的字面量(literal)如直接書寫的100、「hello」和常量都是放在靜態存儲區中。棧空間操做最快可是也很小,一般大量的對象都是放在堆空間,整個內存包括硬盤上的虛擬內存均可以被當成堆空間來使用。mysql優化
String str = new String(「hello」);
上面的語句中str放在棧上,用new建立出來的字符串對象放在堆上,而「hello」這個字面量放在靜態存儲區。
補充:較新版本的Java中使用了一項叫「逃逸分析「的技術,能夠將一些局部對象放在棧上以提高對象的操做性能。(在 Java SE 6u23+ 開始支持,並默認設置爲啓用狀態,能夠不用額外加這個參數。)
答:方案 1:申請 512M 的內存,512M是42億多 bit,一個 bit 位表明一個 unsigned int 值。讀入 40 億個數,設置相應的 bit 位,讀入要查詢的數,查看相應 bit 位是否爲 1,爲 1 表示存在,爲 0 表示不存在。
方案 2:這個問題在《編程珠璣》裏有很好的描述,你們能夠參考下面的思路,探討一下: 由於 2^32 爲 42 億多,因此給定一個數可能在,也可能不在其中; 這裏咱們把 40 億個數中的每個用 32 位的二進制來表示 ,假設這 40 億個數開始放在一個文件中。 而後將這 40 億個數分紅兩類:
並將這兩類分別寫入到兩個文件中,其中一個文件中數的個數<=20 億,而另外一個>=20 億(至關於折半); 與要查找的數的最高位比較並接着進入相應的文件再查找
而後再把這個文件爲又分紅兩類:
並將這兩類分別寫入到兩個文件中,其中一個文件中數的個數<=10 億,而另外一個>=10 億(至關於折半); 與要查找的數的次最高位比較並接着進入相應的文件再查找。
.....
以此類推,就能夠找到了,並且時間複雜度爲 O(logn)。
答:
答:
kafka的數據offset讀取流程:
答:
基於數據庫實現分佈式鎖:(性能較差,鎖表的風險,非阻塞,失敗須要輪詢耗CPU)
利用select … where … for update 排他鎖
注意: 其餘附加功能與實現基本一致,這裏須要注意的是「where name=lock 」,name字段必需要走索引,不然會鎖表。有些狀況下,好比表不大,mysql優化器會不走這個索引,致使鎖表問題。
所謂樂觀鎖與悲觀鎖最大區別在於基於CAS思想,是不具備互斥性,不會產生鎖等待而消耗資源,操做過程當中認爲不存在併發衝突,只有update version失敗後才能覺察到。咱們的搶購、秒殺就是用了這種實現以防止超賣。
樂觀鎖是經過增長遞增的版本號字段實現的。
基於緩存(Redis等)實現分佈式鎖:(過時時間很差控制,非阻塞,失敗須要輪詢耗CPU)
大體思想:每一個客戶端對某個功能加鎖時,在zookeeper上的與該功能對應的指定節點的目錄下,⽣生成⼀個惟一的瞬時有序節點。判斷是否獲取鎖的方式很簡單,只須要判斷有序節點中序號最小的一個。當釋放鎖的時候,只需將這個瞬時節點刪除便可。同時,其能夠避免服務宕機致使的鎖沒法釋放,⽽而產生的死鎖問題。
答:
Hadoop底層使用MapReduce計算架構,只有map和reduce兩種操做,表達能力比較欠缺,並且在MR過程當中會重複的讀寫hdfs,形成大量的磁盤io讀寫操做,因此適合高時延環境下批處理計算的應用;
Spark是基於內存的分佈式計算架構,提供更加豐富的數據集操做類型,主要分紅轉化操做和行動操做,包括map、reduce、filter、flatmap、groupbykey、reducebykey、union和join等,數據分析更加快速,因此適合低時延環境下計算的應用;
spark與hadoop最大的區別在於迭代式計算模型。基於mapreduce框架的Hadoop主要分爲map和reduce兩個階段,兩個階段完了就結束了,因此在一個job裏面能作的處理頗有限;spark計算模型是基於內存的迭代式計算模型,能夠分爲n個階段,根據用戶編寫的RDD算子和程序,在處理完一個階段後能夠繼續往下處理不少個階段,而不僅是兩個階段。因此spark相較於mapreduce,計算模型更加靈活,能夠提供更強大的功能。
可是spark也有劣勢,因爲spark基於內存進行計算,雖然開發容易,可是真正面對大數據的時候,在沒有進行調優的狀況下,可能會出現各類各樣的問題,好比OOM內存溢出等狀況,致使spark程序可能沒法運行起來,而mapreduce雖然運行緩慢,可是至少能夠慢慢運行完。
答:
當 jobclient 向YARN提交一個應用程序後,YARN將分兩個階段運行這個應用程序:一是啓動ApplicationMaster;第二個階段是由ApplicationMaster建立應用程序,爲它申請資源,監控運行直到結束。
具體步驟以下:
答:
如一張表的記錄數在一個已知的範圍內,或者上下浮動不會超過某個閾值:
日活、周活、月活、留存(日周月)、轉化率(日、周、月)GMV(日、周、月)
復購率(日周月)
單表空值檢測
某個字段爲空的記錄數在一個範圍內,或者佔總量的百分比在某個閾值範圍內
單表重複值檢測
一個或多個字段是否知足某些規則
跨表數據量對比
主要針對同步流程,監控兩張表的數據量是否一致
答:這類問題都歸爲求Top K的問題,解決方法都差很少。
將這一天訪問百度的日誌的IP取出來,逐個寫入到一個大文件中。注意到IP是32位的,最多有個2^32個IP。一樣能夠採用映射的方法,好比模1000,把整個大文件映射爲1000個小文件,再找出每一個小文中出現頻率最大的IP(能夠採用 HashMap 進行頻率統計,而後再找出頻率最大的幾個)及相應的頻率。而後再在這1000個最大的IP中找出那個頻率最大的IP,即爲所求。
算法思想:分而治之+Hash
小文件中,這樣每一個小文件最多包含4MB個IP地址; 這裏解釋一下爲何用Hash(IP) % 1024值,若是不用,而直接分類的話,可能會出現這樣一種狀況,就是有個IP在每一個小文件中都存在,並且這個IP並不必定在那個小文件中是數量最多的,那麼最終可能選擇的結果會有問題,因此這裏用了Hash(IP)%1024值,這樣的話,經過計算IP的Hash值,相同IP確定會放到一個文件中,固然了不一樣的IP的Hash值也可能相同,就存在一個小文件中。