Spark系列面試題
- Spark面試題(一)
- Spark面試題(二)
- Spark面試題(三)
- Spark面試題(四)
- Spark面試題(五)——數據傾斜調優
- Spark面試題(六)——Spark資源調優
- Spark面試題(七)——Spark程序開發調優
- Spark面試題(八)——Spark的Shuffle配置調優
1、Spark中的HashShufle的有哪些不足?
1)shuffle產生海量的小文件在磁盤上,此時會產生大量耗時的、低效的IO操作;
2)容易導致內存不夠用,由於內存需要保存海量的文件操作句柄和臨時緩存信息,如果數據處理規模比較大的話,容易出現OOM;
3)容易出現數據傾斜,導致OOM。
2、 conslidate是如何優化Hash shuffle時在map端產生的小文件?
1)conslidate為了解決Hash Shuffle同時打開過多文件導致Writer handler內存使用過大以及產生過多文件導致大量的隨機讀寫帶來的低效磁盤IO;
2)conslidate根據CPU的個數來決定每個task shuffle map端產生多少個文件,假設原來有10個task,100個reduce,每個CPU有10個CPU,那么
使用hash shuffle會產生10100=1000個文件,conslidate產生1010=100個文件
注意:conslidate部分減少了文件和文件句柄,並行讀很高的情況下(task很多時)還是會很多文件。
3、spark.default.parallelism這個參數有什么意義,實際生產中如何設置?
1)參數用於設置每個stage的默認task數量。這個參數極為重要,如果不設置可能會直接影響你的Spark作業性能;
2)很多人都不會設置這個參數,會使得集群非常低效,你的cpu,內存再多,如果task始終為1,那也是浪費,
spark官網建議task個數為CPU的核數*executor的個數的2~3倍。
4、spark.shuffle.memoryFraction參數的含義,以及優化經驗?
1)spark.shuffle.memoryFraction是shuffle調優中 重要參數,shuffle從上一個task拉去數據過來,要在Executor進行聚合操作,
聚合操作時使用Executor內存的比例由該參數決定,默認是20%如果聚合時數據超過了該大小,那么就會spill到磁盤,極大降低性能;
2)如果Spark作業中的RDD持久化操作較少,shuffle操作較多時,建議降低持久化操作的內存占比,提高shuffle操作的內存占比比例,
避免shuffle過程中數據過多時內存不夠用,必須溢寫到磁盤上,降低了性能。此外,如果發現作業由於頻繁的gc導致運行緩慢,意味着task執行用戶代碼的內存不夠用,
那么同樣建議調低這個參數的值。
5、Spark中standalone模式特點,有哪些優點和缺點?
1)特點:
(1)standalone是master/slave架構,集群由Master與Worker節點組成,程序通過與Master節點交互申請資源,Worker節點啟動Executor運行;
(2)standalone調度模式使用FIFO調度方式;
(3)無依賴任何其他資源管理系統,Master負責管理集群資源。
2)優點:
(1)部署簡單;
(2)不依賴其他資源管理系統。
3)缺點:
(1)默認每個應用程序會獨占所有可用節點的資源,當然可以通過spark.cores.max來決定一個應用可以申請的CPU cores個數;
(2)可能有單點故障,需要自己配置master HA。
6、FIFO調度模式的基本原理、優點和缺點?
基本原理:按照先后順序決定資源的使用,資源優先滿足最先來的job。第一個job優先獲取所有可用的資源,接下來第二個job再獲取剩余資源。
以此類推,如果第一個job沒有占用所有的資源,那么第二個job還可以繼續獲取剩余資源,這樣多個job可以並行運行,如果第一個job很大,占用所有資源,
則第二job就需要等待,等到第一個job釋放所有資源。
優點和缺點:
1)適合長作業,不適合短作業;
2)適合CPU繁忙型作業(計算時間長,相當於長作業),不利於IO繁忙型作業(計算時間短,相當於短作業)。
7、FAIR調度模式的優點和缺點?
所有的任務擁有大致相當的優先級來共享集群資源,spark多以輪訓的方式為任務分配資源,不管長任務還是端任務都可以獲得資源,並且獲得不錯的響應時間,
對於短任務,不會像FIFO那樣等待較長時間了,通過參數spark.scheduler.mode 為FAIR指定。
8、CAPCACITY調度模式的優點和缺點?
1)原理:
計算能力調度器支持多個隊列,每個隊列可配置一定的資源量,每個隊列采用 FIFO 調度策略,為了防止同一個用戶的作業獨占隊列中的資源,該調度器會對
同一用戶提交的作業所占資源量進行限定。調度時,首先按以下策略選擇一個合適隊列:計算每個隊列中正在運行的任務數與其應該分得的計算資源之間的
比值(即比較空閑的隊列),選擇一個該比值最小的隊列;然后按以下策略選擇該隊列中一個作業:按照作業優先級和提交時間順序選擇,
同時考慮用戶資源量限制和內存限制
2)優點:
(1)計算能力保證。支持多個隊列,某個作業可被提交到某一個隊列中。每個隊列會配置一定比例的計算資源,且所有提交到隊列中的作業
共享該隊列中的資源;
(2)靈活性。空閑資源會被分配給那些未達到資源使用上限的隊列,當某個未達到資源的隊列需要資源時,一旦出現空閑資源資源,便會分配給他們;
(3)支持優先級。隊列支持作業優先級調度(默認是FIFO);
(4)多重租賃。綜合考慮多種約束防止單個作業、用戶或者隊列獨占隊列或者集群中的資源;
(5)基於資源的調度。 支持資源密集型作業,允許作業使用的資源量高於默認值,進而可容納不同資源需求的作業。不過,當前僅支持內存資源的調度。
9、常見的數壓縮方式,你們生產集群采用了什么壓縮方式,提升了多少效率?
1)數據壓縮,大片連續區域進行數據存儲並且存儲區域中數據重復性高的狀況下,可以使用適當的壓縮算法。數組,對象序列化后都可以使用壓縮,數更緊湊,
減少空間開銷。常見的壓縮方式有snappy,LZO,gz等
2)Hadoop生產環境常用的是snappy壓縮方式(使用壓縮,實際上是CPU換IO吞吐量和磁盤空間,所以如果CPU利用率不高,不忙的情況下,
可以大大提升集群處理效率)。snappy壓縮比一般20%~30%之間,並且壓縮和解壓縮效率也非常高(參考數據如下):
(1)GZIP的壓縮率最高,但是其實CPU密集型的,對CPU的消耗比其他算法要多,壓縮和解壓速度也慢;
(2)LZO的壓縮率居中,比GZIP要低一些,但是壓縮和解壓速度明顯要比GZIP快很多,其中解壓速度快的更多;
(3)Zippy/Snappy的壓縮率最低,而壓縮和解壓速度要稍微比LZO要快一些。
提升了多少效率可以從2方面回答:1)數據存儲節約多少存儲,2)任務執行消耗時間節約了多少,可以舉個實際例子展開描述。
10、使用scala代碼實現WordCount?
val conf = new SparkConf()
val sc = new SparkContext(conf)
val line = sc.textFile("xxxx.txt") line.flatMap(.split(" ")).map((,1)).reduceByKey(+). collect().foreach(println) sc.stop()
11、Spark RDD 和 MapReduce2的區別?
1)mr2只有2個階段,數據需要大量訪問磁盤,數據來源相對單一 ,spark RDD ,可以無數個階段進行迭代計算,數據來源非常豐富,數據落地介質也
非常豐富spark計算基於內存;
2)MapReduce2需要頻繁操作磁盤IO,需要大家明確的是如果是SparkRDD的話,你要知道每一種數據來源對應的是什么,RDD從數據源加載數據,
將數據放到不同的partition針對這些partition中的數據進行迭代式計算計算完成之后,落地到不同的介質當中。
12、spark和Mapreduce快? 為什么快呢? 快在哪里呢?
Spark更加快的主要原因有幾點:
1)基於內存計算,減少低效的磁盤交互;
2)高效的調度算法,基於DAG;
3)容錯機制Lingage,主要是DAG和Lianage,即使spark不使用內存技術,也大大快於mapreduce。
13、Spark sql為什么比hive快呢?
計算引擎不一樣,一個是spark計算模型,一個是mapreudce計算模型。
14、RDD的數據結構是怎么樣的?
一個RDD對象,包含如下5個核心屬性。
1)一個分區列表,每個分區里是RDD的部分數據(或稱數據塊)。
2)一個依賴列表,存儲依賴的其他RDD。
3)一個名為compute的計算函數,用於計算RDD各分區的值。
4)分區器(可選),用於鍵/值類型的RDD,比如某個RDD是按散列來分區。
5)計算各分區時優先的位置列表(可選),比如從HDFS上的文件生成RDD時,RDD分區的位置優先選擇數據所在的節點,這樣可以避免數據移動帶來的開銷。
15、RDD算子里操作一個外部map,比如往里面put數據,然后算子外再遍歷map,會有什么問題嗎?
頻繁創建額外對象,容易oom。
16、 說說你對Hadoop生態的認識。
hadoop生態主要分為三大類型,1)分布式文件系統,2)分布式計算引擎,3)周邊工具
1)分布式系統:HDFS,hbase
2)分布式計算引擎:Spark,MapReduce
3)周邊工具:如zookeeper,pig,hive,oozie,sqoop,ranger,kafka等
17、hbase region多大會分區,spark讀取hbase數據是如何划分partition的?
region超過了hbase.hregion.max.filesize這個參數配置的大小就會自動裂分,默認值是1G。
默認情況下,hbase有多少個region,Spark讀取時就會有多少個partition 。