根據個人面試經歷總結
1、簡單說一下hadoop和spark的shuffle相同和差異?
聯系:
Apache Spark 的 Shuffle 過程與 Apache Hadoop 的 Shuffle 過程有着諸多類似,一些概念可直接套用,例如,Shuffle 過程中,提供數據的一端,被稱作 Map 端,Map 端每個生成數據的任務稱為 Mapper,對應的,接收數據的一端,被稱作 Reduce 端,Reduce 端每個拉取數據的任務稱為 Reducer,Shuffle 過程本質上都是將 Map 端獲得的數據使用分區器進行划分,並將數據發送給對應的 Reducer 的過程。
主要的區別:
一個落盤,一個不落盤,spark就是為了解決mr落盤導致效率低下的問題而產生的,原理還是mr的原理,只是shuffle放在內存中計算了,所以效率提高很多。
2、Spark有哪些算子,列舉幾個你熟悉的?
轉換(transformation)算子 :常見的有map 、flatMap、filter、groupByKey、reduceByKey、union
flatMap與map區別在於map為“映射”,而flatMap“先映射,后扁平化”,map對每一次(func)都產生一個元素,返回一個對象,而flatMap多一步就是將所有對象合並為一個對象。
行動(action)算子:reduce、collect、count、foreach
3、groupByKey與reduceByKey的區別
reduceByKey將結果發送給reducer之前在本地進行merge,這樣數據量會大幅度減小,從而減小傳輸,保證reduce端能夠更快的進行結果計算。所以reduceByKey更適合作用在較大的數據集上
4、spark中的RDD是什么,有哪些特性?
RDD彈性分布式數據集、分區記錄集合;特性有:只讀、分布式、彈性、基於內存
5、談談spark中的寬窄依賴? spark rdd 如何區分寬依賴和窄依賴?
6、spark中的數據傾斜的現象、原因、后果?
7、如何解決spark中的數據傾斜問題?
1.首先從源頭選擇可以split的數據源,從源頭避免傾斜
2.shuffle過程中,增加並行度,減少shuffle 在map-side進行數據合並,避免reduce fetch數據傾斜
3.sample采樣將傾斜的數據,特殊處理,這個方法可以適用於所有的數據傾斜問題
通過sample采樣,得到傾斜的key,然后進行特殊處理,將傾斜的key通過加鹽的方式,增大並行處理,之后將結果再合並,進而減少單個task的壓力
4.另外,就是我們盡量使用spark-sql,spark-sql里面優化器提供很多基本CRO和CBO的優化策略,不僅幫我們從源頭幫我們去除無關的數據減少計算數據量,其次在計算過程中會根據我們的table 的數據量,自動幫我們計算合適task partition數量,和選擇合適join策略,從而提升計算性能,也避免shuffle 數據傾斜
8、spark on yarn中executor如何管理內存分配?
Spark的Excutor的Container內存有兩大部分組成:堆外內存和Excutor內存。
其中
堆外內存
由spark.yarn.executor.memoryOverhead參數設置。 主要用於JVM自身的開銷。默認:MAX(executorMemory*0.10,384MB)
這里384 的含義為,JVM自身開銷,最小的需求是384MB
Excutor內存
由spark.executor.memory參數設置,分為兩部分。
Execution:shuffle、排序、聚合等用於計算的內存
Storage:用於集群中緩沖和傳播內部數據的內存(cache、廣播變量)
具體見這篇文章https://blog.csdn.net/zhuiqiuuuu/article/details/86539385
9、Spark driver的功能是什么?
driver驅動器
一個Spark作業運行時包括一個Driver進程,也是作業的主進程,具有main函數,並且有SparkContext的實例,是程序的人口點;
功能:負責向集群申請資源,向master注冊信息,負責了作業的調度,負責作業的解析、生成Stage並調度Task到Executor(執行器)上。包括DAGScheduler,TaskScheduler。