1. 程式人生 > >出一套高階大資料開發面試題(刷起來!!!)

出一套高階大資料開發面試題(刷起來!!!)

一千個讀者眼中有一千個哈姆雷特,一千名 大資料 程式設計師心目中就有一千套 大資料面試題。本文就是筆者認為可以用來面試大資料 程式設計師的面試題。

這套題的題目跟公司和業務都沒有關係,而且也並不代表筆者本人可以把這些題回答得非常好,筆者只是將一部分覺得比較好的題從收集的面試題裡面抽出來了而已。

收集的面試題有以下三個來源:

  1. 筆者在準備面試的過程中搜集並整理過的面試題。
  2. 筆者在準備面試的過程中自己思考過的新題。
  3. 筆者在面試過程中遇到的覺得比較好的題。

好了不說廢話了 上~~~~~~~題~~~~~~~~~

由於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)再雜湊、建立公共溢位區