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 。