一千個讀者眼中有一千個哈姆雷特,一千名 大數據 程序員心目中就有一千套 大數據面試題。本文就是筆者認爲可以用來面試大數據 程序員的面試題。
這套題的題目跟公司和業務都沒有關係,而且也並不代表筆者本人可以把這些題回答得非常好,筆者只是將一部分覺得比較好的題從收集的面試題裏面抽出來了而已。
收集的面試題有以下三個來源:
- 筆者在準備面試的過程中搜集並整理過的面試題。
- 筆者在準備面試的過程中自己思考過的新題。
- 筆者在面試過程中遇到的覺得比較好的題。
好了不說廢話了 上~~~~~~~題~~~~~~~~~
由於csdn上發圖片不太方便我就做了個文檔給大家已經上傳到我自己創建的大數據學習交流Qun531629188
無論是大牛還是想轉行想學習的大學生
小編我都挺歡迎,晚上20:10都有一節【免費的】大數據直播課程,專注大數據分析方法,大數據編程,大數據倉庫,大數據案例,人工智能,數據挖掘都是純乾貨分享,
1. Spark rdd生成過程
·
Spark的任務調度分爲四步
1RDD objects
RDD的準備階段,組織RDD及RDD的依賴關係生成大概的RDD的DAG圖,DAG圖是有向環圖。
2DAG scheduler
細分RDD中partition的依賴關係確定那些是寬依賴那些是窄依賴,生成更詳細的DAG圖,將DAG圖封裝成 TaskSet任務集合當觸發計算時(執行action型算子)將其提交給集羣。
3TaskScheduler
接收TaskSet任務集,分析確定那個task對應那個worker並將其發送給worker執行。
4worker執行階段
接收task任務,通過spark的block管理器blockManager從集羣節點上獲取對應的block上的數據,啓動executor完成計算
2. Spark 任務提交流程
2.spark-submit命令提交程序後,driver和application也會向Master註冊信息
3.創建SparkContext對象:主要的對象包含DAGScheduler和TaskScheduler
4.Driver把Application信息註冊給Master後,Master會根據App信息去Worker節點啓動Executor
5.Executor內部會創建運行task的線程池,然後把啓動的Executor反向註冊給Dirver
6.DAGScheduler:負責把Spark作業轉換成Stage的DAG(Directed Acyclic Graph有向無環圖),根據寬窄依賴切分Stage,然後把Stage封裝成TaskSet的形式發送個TaskScheduler;
同時DAGScheduler還會處理由於Shuffle數據丟失導致的失敗;
7.TaskScheduler:維護所有TaskSet,分發Task給各個節點的Executor(根據數據本地化策略分發Task),監控task的運行狀態,負責重試失敗的task;
8.所有task運行完成後,SparkContext向Master註銷,釋放資源;
3.Spark sql 創建分區表
spark.sql("use oracledb")
spark.sql("CREATE TABLE IF NOT EXISTS " + tablename + " (OBUID STRING, BUS_ID STRING,REVTIME STRING,OBUTIME STRING,LONGITUDE STRING,LATITUDE STRING,\
GPSKEY STRING,DIRECTION STRING,SPEED STRING,RUNNING_NO STRING,DATA_SERIAL STRING,GPS_MILEAGE STRING,SATELLITE_COUNT STRING,ROUTE_CODE STRING,SERVICE STRING)\
PARTITIONED BY(area STRING,obudate STRING) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' ")
# 設置參數
# hive > set hive.exec.dynamic.partition.mode = nonstrict;
# hive > set hive.exec.dynamic.partition = true;
spark.sql("set hive.exec.dynamic.partition.mode = nonstrict")
spark.sql("set hive.exec.dynamic.partition = true")
# print("創建數據庫完成")
if addoroverwrite:
# 追加
spark.sql("INSERT INTO TABLE " + tablename + " PARTITION(area,obudate) SELECT OBUID,BUS_ID, REVTIME, OBUTIME,LONGITUDE ,LATITUDE,GPSKEY,DIRECTION,SPEED,\
RUNNING_NO,DATA_SERIAL,GPS_MILEAGE, SATELLITE_COUNT ,ROUTE_CODE,SERVICE,'gz' AS area ,SUBSTR(OBUTIME,1,10) AS obudate FROM " + tablename + "_tmp")
4.Java 同步鎖有哪些
Synchronized lock
5.Arrarylist 能存null嗎
可以 添加的數據類型位object類型 null也是object類型
6. Spring cloud 控制權限
Spring Cloud下的微服務權限怎麼管?怎麼設計比較合理?從大層面講叫服務權限,往小處拆分,分別爲三塊:用戶認證、用戶權限、服務校驗。
7. Hashset contains方法
contains方法用來判斷Set集合是否包含指定的對象。
語法 boolean contains(Object o)
返回值:如果Set集合包含指定的對象,則返回true;否則返回false。
8. Spark streaming 數據塊大小
buffer 32k //緩衝區默認大小爲32k SparkConf.set("spark.shuffle.file.buffer","64k")
reduce 48M //reduce端拉取數據的時候,默認大小是48M SparkConf.set("spark.reducer.maxSizeInFlight","96M")
spark.shuffle.file.buffer
默認值:32k
參數說明:該參數用於設置shuffle write task的BufferedOutputStream的buffer緩衝大小。將數據寫到磁盤文件之前,會先寫入buffer緩衝中,待緩衝寫滿之後,纔會溢寫到磁盤。
調優建議:如果作業可用的內存資源較爲充足的話,可以適當增加這個參數的大小(比如64k),從而減少shuffle write過程中溢寫磁盤文件的次數,也就可以減少磁盤IO次數,進而提升性能。在實踐中發現,合理調節該參數,性能會有1%~5%的提升。
spark.reducer.maxSizeInFlight
默認值:48m
參數說明:該參數用於設置shuffle read task的buffer緩衝大小,而這個buffer緩衝決定了每次能夠拉取多少數據。
調優建議:如果作業可用的內存資源較爲充足的話,可以適當增加這個參數的大小(比如96m),從而減少拉取數據的次數,也就可以減少網絡傳輸的次數,進而提升性能。在實踐中發現,合理調節該參數,性能會有1%~5%的提升。
錯誤:reduce oom
reduce task去map拉數據,reduce 一邊拉數據一邊聚合 reduce段有一塊聚合內存(executor memory * 0.2)
解決辦法:1、增加reduce 聚合的內存的比例 設置spark.shuffle.memoryFraction
2、 增加executor memory的大小 --executor-memory 5G
3、減少reduce task每次拉取的數據量 設置spark.reducer.maxSizeInFlight 24m
9.GC
Java GC(Garbage Collection,垃圾收集,垃圾回收)機制,是Java與C++/C的主要區別之一,在使用JAVA的時候,一般不需要專門編寫內存回收和垃圾清理代 碼。這是因爲在Java虛擬機中,存在自動內存管理和垃圾清掃機制。
10.Flume 的推拉 怎麼保證數據的完整性
channel做持久化
11. Java 1/0.0 infinity
在浮點數運算時,有時我們會遇到除數爲0的情況,那java是如何解決的呢?
我們知道,在整型運算中,除數是不能爲0的,否則直接運行異常。但是在浮點數運算中,引入了無限這個概念,我們來看一下Double和Float中的定義。
1. 無限乘以0,結果爲NAN
System.out.println(Float.POSITIVE_INFINITY * 0); // output: NAN
System.out.println(Float.NEGATIVE_INFINITY * 0); // output: NAN
2.無限除以0,結果不變,還是無限
System.out.println((Float.POSITIVE_INFINITY / 0) == Float.POSITIVE_INFINITY); // output: true
System.out.println((Float.NEGATIVE_INFINITY / 0) == Float.NEGATIVE_INFINITY); // output: true
3.無限做除了乘以0意外的運算,結果還是無限
System.out.println(Float.POSITIVE_INFINITY == (Float.POSITIVE_INFINITY + 10000)); // output: true
System.out.println(Float.POSITIVE_INFINITY == (Float.POSITIVE_INFINITY - 10000)); // output: true
System.out.println(Float.POSITIVE_INFINITY == (Float.POSITIVE_INFINITY * 10000)); // output: true
System.out.println(Float.POSITIVE_INFINITY == (Float.POSITIVE_INFINITY / 10000)); // output: true
要判斷一個浮點數是否爲INFINITY,可用isInfinite方法
System.out.println(Double.isInfinite(Float.POSITIVE_INFINITY)); // output: true
12. (int) (char) (byte) -1 = 65535
public class T {
public static void main(String args[]) {
new T().toInt(-1);
new T().toByte((byte) -1);
new T().toChar((char) (byte) -1);
new T().toInt((int)(char) (byte) -1);
}
void toByte(byte b) {
for (int i = 7; i >= 0; i--) {
System.out.print((b>>i) & 0x01);
}
System.out.println();
}
void toInt(int b) {
for (int i = 31; i >= 0; i--) {
System.out.print((b>>i) & 0x01);
}
System.out.println();
}
void toChar(char b) {
for (int i = 15; i >= 0; i--) {
System.out.print((b>>i) & 0x01);
}
System.out.println();
}
}
11111111111111111111111111111111
11111111
1111111111111111
00000000000000001111111111111111
13. Spark shuffle時 是否會在磁盤存儲
會
14. Hive的函數
例如case when
15. Hadoop 的shuffle 會進行幾次排序
16. Shuffle 發生在哪裏
hadoop的核心思想是MapReduce,但shuffle又是MapReduce的核心。shuffle的主要工作是從Map結束到Reduce開始之間的過程。首先看下這張圖,就能瞭解shuffle所處的位置。圖中的partitions、copy phase、sort phase所代表的就是shuffle的不同階段。
17. spark怎麼殺死已經提交的任務
18. 提交spark 任務可以設置哪些參數
19. Zookeeper 有3個進程都是做什麼的
Zookeeper主要可以幹哪些事情:配置管理,名字服務,提供分佈式同步以及集羣管理。
20. Kafka 的三種傳數據的方式,各有什麼優缺點
1.最多一次(At-most-once):客戶端收到消息後,在處理消息前自動提交,這樣kafka就認爲consumer已經消費過了,偏移量增加。
2.最少一次(At-least-once):客戶端收到消息,處理消息,再提交反饋。這樣就可能出現消息處理完了,在提交反饋前,網絡中斷或者程序掛了,那麼kafka認爲這個消息還沒有被consumer消費,產生重複消息推送。
3.正好一次(Exaxtly-once):保證消息處理和提交反饋在同一個事務中,即有原子性。
本文從這幾個點出發,詳細闡述瞭如何實現以上三種方式。
21. Flume 的攔截插件怎麼編寫
建一個maven工程,導入flume-core包,然後實現interceptor接口
22. Hadoop 的小文件聚合怎麼實現
Hadoop 自身提供了幾種機制來解決相關的問題,包括HAR, SequeueFile和CombineFileInputFormat。
23. Spark rdd 存儲數據嗎?
RDD其實是不存儲真實數據的,存儲的的只是真實數據的分區信息getPartitions,還有就是針對單個分區的讀取方法 compute
24. 實現map的線程同步方法
實現同步機制有兩個方法:
1、同步代碼塊:
synchronized(同一個數據){} 同一個數據:就是N條線程同時訪問一個數據。
2、同步方法:
public synchronized 數據返回類型 方法名(){}
就是使用 synchronized 來修飾某個方法,則該方法稱爲同步方法。對於同步方法而言,無需顯示指定同步監視器,同步方法的同步監視器是 this 也就是該對象的本身(這裏指的對象本身有點含糊,其實就是調用該同步方法的對象)通過使用同步方法,可非常方便的將某類變成線程安全的類,具有如下特徵:
1,該類的對象可以被多個線程安全的訪問。
2,每個線程調用該對象的任意方法之後,都將得到正確的結果。
3,每個線程調用該對象的任意方法之後,該對象狀態依然保持合理狀態。
注:synchronized關鍵字可以修飾方法,也可以修飾代碼塊,但不能修飾構造器,屬性等。
實現同步機制注意以下幾點: 安全性高,性能低,在多線程用。性能高,安全性低,在單線程用。
1,不要對線程安全類的所有方法都進行同步,只對那些會改變共享資源方法的進行同步。
2,如果可變類有兩種運行環境,當線程環境和多線程環境則應該爲該可變類提供兩種版本:線程安全版本和線程不安全版本(沒有同步方法和同步塊)。在單線程中環境中,使用線程不安全版本以保證性能,在多線程中使用線程安全版本.
25. Combiner 的組件需要注意什麼
因爲combiner在mapreduce過程中可能調用也肯能不調用,可能調一次也可能調多次,無法確定和控制
所以,combiner使用的原則是:有或沒有都不能影響業務邏輯,使不使用combiner都不能影響最終reducer的結果。而且,combiner的輸出kv應該跟reducer的輸入kv類型要對應起來。因爲有時使用combiner不當的話會對統計結果造成錯誤的結局,還不如不用。比如對所有數求平均數:
Mapper端使用combiner
3 5 7 ->(3+5+7)/3=5
2 6 ->(2+6)/2=4
Reducer
(5+4)/2=9/2 不等於(3+5+7+2+6)/5=23/5
26. Storm 和sparkstreaming 之間的對比
Storm
1) 真正意義上的實時處理。(實時性)
2)想實現一些複雜的功能,比較麻煩,比如:實現滑動窗口 (易用性)
原生的API:spout bolt bolt
Trident框架:使用起來難度還是有一些。
3)沒有一個完整的生態
SparkStreaming
1)有批處理的感覺,一次處理的數據量較小,然後基於內存很快就可以運行完成。相當於是準實時。 (實時性)
2)封裝了很多高級的API,在用戶去實現一個複雜的功能的時候,很容易就可以實現。 (易用性)
3)有完整的生態系統。同時可以配置SparkCore,SparkSQL,Mlib,GraphX等,他們之間可以實現無縫的切換。
做一個比喻來說明這兩個的區別:
Storm就像是超市裏面的電動扶梯,實時的都在運行;
SparkStreaming就像是超市裏面的電梯,每次載一批人。
27. Hdp 在進行容災性測試時,會出現什麼問題嗎
Ambari Server 是存在單點問題的,如果 Server 機器宕機了,就無法恢復整個 Ambari Server 的數據,也就是說無法再通過 Ambari 管理集羣。
28. Kafka的數據流讀取速度快的原因是什麼,爲什麼選擇kafka,而不是別的消息中間件
生產者(寫入數據)
生產者(producer)是負責向Kafka提交數據的,我們先分析這一部分。
Kafka會把收到的消息都寫入到硬盤中,它絕對不會丟失數據。爲了優化寫入速度Kafak採用了兩個技術,順序寫入和MMFile。
順序寫入
因爲硬盤是機械結構,每次讀寫都會尋址->寫入,其中尋址是一個“機械動作”,它是最耗時的。所以硬盤最“討厭”隨機I/O,最喜歡順序I/O。爲了提高讀寫硬盤的速度,Kafka就是使用順序I/O。
29. Spark 與hadoop 對比,有哪些優勢
1)Spark相比Hadoop在處理模型上的優勢
首先,Spark 摒棄了MapReduce 先 map 再 reduce這樣的嚴格方式,Spark引擎執行更通用的有向無環圖(DAG)算子。
另外,基於MR的計算引擎在shuffle過程中會將中間結果輸出到磁盤上,進行存儲和容錯,而且HDFS的可靠機制是將文件存爲3份。Spark是將執行模型抽象爲通用的有向無環圖執行計劃(DAG),當到最後一步時纔會進行計算,這樣可以將多stage的任務串聯或者並行執行,而無須將stage中間結果輸出到HDFS。磁盤IO的性能明顯低於內存,所以Hadoop的運行效率低於spark。
2)數據格式和內存佈局
MR在讀的模型處理方式上會引起較大的處理開銷,spark抽象出彈性分佈式數據集RDD,進行數據的存儲。RDD能支持粗粒度寫操作,但對於讀取操作,RDD可以精確到每條記錄,這使得RDD可以用來作爲分佈式索引。Spark的這些特性使得開發人員能夠控制數據在不同節點上的不同分區,用戶可以自定義分區策略,如hash分區等。
3)執行策略
MR在數據shuffle之前花費了大量的時間來排序,spark可減輕這個開銷。因爲spark任務在shuffle中不是所有的場合都需要排序,所以支持基於hash的分佈式聚合,調度中採用更爲通用的任務執行計劃圖(DAG),每一輪次的輸出結果都在內存中緩存。
4)任務調度的開銷
傳統的MR系統,是爲了運行長達數小時的批量作業而設計的,在某些極端情況下,提交一個任務的延遲非常高。Spark採用了時間驅動的類庫AKKA來啓動任務,通過線程池複用線程來避免進程或線程啓動和切換開銷。
5)內存計算能力的擴展
spark的彈性分佈式數據集(RDD)抽象使開發人員可以將處理流水線上的任何點持久化存儲在跨越集羣節點的內存中,來保證後續步驟需要相同數據集時就不必重新計算或從磁盤加載,大大提高了性能。這個特性使Spark 非常適合涉及大量迭代的算法,這些算法需要多次遍歷相同數據集, 也適用於反應式(reactive)應用,這些應用需要掃描大量內存數據並快速響應用戶的查詢。
6)開發速度的提升
構建數據應用的最大瓶頸不是 CPU、磁盤或者網絡,而是分析人員的生產率。所以spark通過將預處理到模型評價的整個流水線整合在一個編程環境中, 大大加速了開發過程。Spark 編程模型富有表達力,在 REPL 下包裝了一組分析庫,省去了多次往返 IDE 的開銷。而這些開銷對諸如 MapReduce 等框架來說是無法避免的。Spark 還避免了採樣和從HDFS 來回倒騰數據所帶來的問題,這些問題是 R 之類的框架經常遇到的。分析人員在數據上做實驗的速度越快,他們能從數據中挖掘出價值的可能性就越大。
7)功能強大
作爲一個通用的計算引擎,spark的核心 API 爲數據轉換提供了強大的基礎,它獨立於統計學、機器學習或矩陣代數的任何功能。而且它的 Scala 和 Python API 讓我們可以用表達力極強的通用編程語言編寫程序,還可以訪問已有的庫。
Spark 的內存緩存使它適應於微觀和宏觀兩個層面的迭代計算。機器學習算法需要多次遍歷訓練集,可以將訓練集緩存在內存裏。在對數據集進行探索和初步瞭解時,數據科學家可以在運行查詢的時候將數據集放在內存,也很容易將轉換後的版本緩存起來,這樣可以節省訪問磁盤的開銷。
30. Java hash衝突怎麼解決
1)開放定址法:2)鏈地址法3、4)再哈希、建立公共溢出區