一千個讀者眼中有一千個哈姆雷特,一千名 大數據 程序員心目中就有一千套 大數據面試題。本文就是筆者認爲能夠用來面試大數據 程序員的面試題。java
這套題的題目跟公司和業務都沒有關係,並且也並不表明筆者本人能夠把這些題回答得很是好,筆者只是將一部分以爲比較好的題從收集的面試題裏面抽出來了而已。react
收集的面試題有如下三個來源:程序員
好了不說廢話了 上~~~~~~~題~~~~~~~~~面試
因爲掘金上發圖片不太方便我就作了個文檔給你們已經上傳到我本身建立的大數據學習交流Qun531629188算法
不管是大牛仍是想轉行想學習的大學生sql
小編我都挺歡迎,晚上20:10都有一節【免費的】大數據直播課程,專一大數據分析方法,大數據編程,大數據倉庫,大數據案例,人工智能,數據挖掘都是純乾貨分享,數據庫
·編程
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-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註銷,釋放資源;
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")
Synchronized lock
能夠 添加的數據類型位object類型 null也是object類型
Spring Cloud下的微服務權限怎麼管?怎麼設計比較合理?從大層面講叫服務權限,往小處拆分,分別爲三塊:用戶認證、用戶權限、服務校驗。
contains方法用來判斷Set集合是否包含指定的對象。
語法 boolean contains(Object o)
返回值:若是Set集合包含指定的對象,則返回true;不然返回false。
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)
解決辦法:一、增長reduce 聚合的內存的比例 設置spark.shuffle.memoryFraction
二、 增長executor memory的大小 --executor-memory 5G
三、減小reduce task每次拉取的數據量 設置spark.reducer.maxSizeInFlight 24m
Java GC(Garbage Collection,垃圾收集,垃圾回收)機制,是Java與C++/C的主要區別之一,在使用JAVA的時候,通常不須要專門編寫內存回收和垃圾清理代 碼。這是由於在Java虛擬機中,存在自動內存管理和垃圾清掃機制。
channel作持久化
在浮點數運算時,有時咱們會遇到除數爲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
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
例如case when
hadoop的核心思想是MapReduce,但shuffle又是MapReduce的核心。shuffle的主要工做是從Map結束到Reduce開始之間的過程。首先看下這張圖,就能瞭解shuffle所處的位置。圖中的partitions、copy phase、sort phase所表明的就是shuffle的不一樣階段。
Zookeeper主要能夠幹哪些事情:配置管理,名字服務,提供分佈式同步以及集羣管理。
1.最多一次(At-most-once):客戶端收到消息後,在處理消息前自動提交,這樣kafka就認爲consumer已經消費過了,偏移量增長。
2.最少一次(At-least-once):客戶端收到消息,處理消息,再提交反饋。這樣就可能出現消息處理完了,在提交反饋前,網絡中斷或者程序掛了,那麼kafka認爲這個消息尚未被consumer消費,產生重複消息推送。
3.正好一次(Exaxtly-once):保證消息處理和提交反饋在同一個事務中,即有原子性。
本文從這幾個點出發,詳細闡述瞭如何實現以上三種方式。
建一個maven工程,導入flume-core包,而後實現interceptor接口
Hadoop 自身提供了幾種機制來解決相關的問題,包括HAR, SequeueFile和CombineFileInputFormat。
RDD實際上是不存儲真實數據的,存儲的的只是真實數據的分區信息getPartitions,還有就是針對單個分區的讀取方法 compute
實現同步機制有兩個方法:
一、同步代碼塊:
synchronized(同一個數據){} 同一個數據:就是N條線程同時訪問一個數據。
二、同步方法:
public synchronized 數據返回類型 方法名(){}
就是使用 synchronized 來修飾某個方法,則該方法稱爲同步方法。對於同步方法而言,無需顯示指定同步監視器,同步方法的同步監視器是 this 也就是該對象的自己(這裏指的對象自己有點含糊,其實就是調用該同步方法的對象)經過使用同步方法,可很是方便的將某類變成線程安全的類,具備以下特徵:
1,該類的對象能夠被多個線程安全的訪問。
2,每一個線程調用該對象的任意方法以後,都將獲得正確的結果。
3,每一個線程調用該對象的任意方法以後,該對象狀態依然保持合理狀態。
注:synchronized關鍵字能夠修飾方法,也能夠修飾代碼塊,但不能修飾構造器,屬性等。
實現同步機制注意如下幾點: 安全性高,性能低,在多線程用。性能高,安全性低,在單線程用。
1,不要對線程安全類的全部方法都進行同步,只對那些會改變共享資源方法的進行同步。
2,若是可變類有兩種運行環境,當線程環境和多線程環境則應該爲該可變類提供兩種版本:線程安全版本和線程不安全版本(沒有同步方法和同步塊)。在單線程中環境中,使用線程不安全版本以保證性能,在多線程中使用線程安全版本.
由於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
Storm
1) 真正意義上的實時處理。(實時性)
2)想實現一些複雜的功能,比較麻煩,好比:實現滑動窗口 (易用性)
原生的API:spout bolt bolt
Trident框架:使用起來難度仍是有一些。
3)沒有一個完整的生態
SparkStreaming
1)有批處理的感受,一次處理的數據量較小,而後基於內存很快就能夠運行完成。至關因而準實時。 (實時性)
2)封裝了不少高級的API,在用戶去實現一個複雜的功能的時候,很容易就能夠實現。 (易用性)
3)有完整的生態系統。同時能夠配置SparkCore,SparkSQL,Mlib,GraphX等,他們之間能夠實現無縫的切換。
作一個比喻來講明這兩個的區別:
Storm就像是超市裏面的電動扶梯,實時的都在運行;
SparkStreaming就像是超市裏面的電梯,每次載一批人。
Ambari Server 是存在單點問題的,若是 Server 機器宕機了,就沒法恢復整個 Ambari Server 的數據,也就是說沒法再經過 Ambari 管理集羣。
生產者(寫入數據)
生產者(producer)是負責向Kafka提交數據的,咱們先分析這一部分。
Kafka會把收到的消息都寫入到硬盤中,它絕對不會丟失數據。爲了優化寫入速度Kafak採用了兩個技術,順序寫入和MMFile。
順序寫入
由於硬盤是機械結構,每次讀寫都會尋址->寫入,其中尋址是一個「機械動做」,它是最耗時的。因此硬盤最「討厭」隨機I/O,最喜歡順序I/O。爲了提升讀寫硬盤的速度,Kafka就是使用順序I/O。
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 的內存緩存使它適應於微觀和宏觀兩個層面的迭代計算。機器學習算法須要屢次遍歷訓練集,能夠將訓練集緩存在內存裏。在對數據集進行探索和初步瞭解時,數據科學家能夠在運行查詢的時候將數據集放在內存,也很容易將轉換後的版本緩存起來,這樣能夠節省訪問磁盤的開銷。
1)開放定址法:2)鏈地址法三、4)再哈希、創建公共溢出區