spark面試總結2

Spark core面試篇02
1.cache後面能不能接其餘算子,它是否是action操做?
答:cache能夠接其餘算子,可是接了算子以後,起不到緩存應有的效果,由於會從新觸發cache。
cache不是action操做
2.reduceByKey是否是action?
答:不是,不少人都會覺得是action,reduce rdd是action
3.數據本地性是在哪一個環節肯定的?
具體的task運行在那他機器上,dag劃分stage的時候肯定的
4.RDD的彈性表如今哪幾點?
1)自動的進行內存和磁盤的存儲切換;
2)基於Lingage的高效容錯;
3)task若是失敗會自動進行特定次數的重試;
4)stage若是失敗會自動進行特定次數的重試,並且只會計算失敗的分片;
5)checkpoint和persist,數據計算以後持久化緩存
6)數據調度彈性,DAG TASK調度和資源無關
7)數據分片的高度彈性,a.分片不少碎片能夠合併成大的,b.par
5.常規的容錯方式有哪幾種類型?
1).數據檢查點,會發生拷貝,浪費資源
2).記錄數據的更新,每次更新都會記錄下來,比較複雜且比較消耗性能
6.RDD經過Linage(記錄數據更新)的方式爲什麼很高效?
1)lazy記錄了數據的來源,RDD是不可變的,且是lazy級別的,且rDD
之間構成了鏈條,lazy是彈性的基石。因爲RDD不可變,因此每次操做就
產生新的rdd,不存在全局修改的問題,控制難度降低,全部有計算鏈條
將複雜計算鏈條存儲下來,計算的時候從後往前回溯
900步是上一個stage的結束,要麼就checkpoint
2)記錄原數據,是每次修改都記錄,代價很大
若是修改一個集合,代價就很小,官方說rdd是
粗粒度的操做,是爲了效率,爲了簡化,每次都是
操做數據集合,寫或者修改操做,都是基於集合的
rdd的寫操做是粗粒度的,rdd的讀操做既能夠是粗粒度的
也能夠是細粒度,讀能夠讀其中的一條條的記錄。
3)簡化複雜度,是高效率的一方面,寫的粗粒度限制了使用場景
如網絡爬蟲,現實世界中,大多數寫是粗粒度的場景
7.RDD有哪些缺陷?
1)不支持細粒度的寫和更新操做(如網絡爬蟲),spark寫數據是粗粒度的
所謂粗粒度,就是批量寫入數據,爲了提升效率。可是讀數據是細粒度的也就是
說能夠一條條的讀
2)不支持增量迭代計算,Flink支持
8.說一說Spark程序編寫的通常步驟?
答:初始化,資源,數據源,並行化,rdd轉化,action算子打印輸出結果或者也能夠存至相應的數據存儲介質,具體的可看下圖:html

  1. Spark有哪兩種算子?
    答:Transformation(轉化)算子和Action(執行)算子。
  2. Spark提交你的jar包時所用的命令是什麼?
    答:spark-submit。
  3. Spark有哪些聚合類的算子,咱們應該儘可能避免什麼類型的算子?
    答:在咱們的開發過程當中,能避免則儘量避免使用reduceByKey、join、distinct、repartition等會進行shuffle的算子,儘可能使用map類的非shuffle算子。這樣的話,沒有shuffle操做或者僅有較少shuffle操做的Spark做業,能夠大大減小性能開銷。
  4. 你所理解的Spark的shuffle過程?
    答:從下面三點去展開
    1)shuffle過程的劃分
    2)shuffle的中間結果如何存儲
    3)shuffle的數據如何拉取過來
    能夠參考這篇博文:http://www.cnblogs.com/jxhd1/p/6528540.html
  5. 你如何從Kafka中獲取數據?
    1)基於Receiver的方式
    這種方式使用Receiver來獲取數據。Receiver是使用Kafka的高層次Consumer API來實現的。receiver從Kafka中獲取的數據都是存儲在Spark Executor的內存中的,而後Spark Streaming啓動的job會去處理那些數據。
    2)基於Direct的方式
    這種新的不基於Receiver的直接方式,是在Spark 1.3中引入的,從而可以確保更加健壯的機制。替代掉使用Receiver來接收數據後,這種方式會週期性地查詢Kafka,來得到每一個topic+partition的最新的offset,從而定義每一個batch的offset的範圍。當處理數據的job啓動時,就會使用Kafka的簡單consumer api來獲取Kafka指定offset範圍的數據
  6. 對於Spark中的數據傾斜問題你有什麼好的方案? 1)前提是定位數據傾斜,是OOM了,仍是任務執行緩慢,看日誌,看WebUI 2)解決方法,有多個方面 • 避免沒必要要的shuffle,如使用廣播小表的方式,將reduce-side-join提高爲map-side-join •分拆發生數據傾斜的記錄,分紅幾個部分進行,而後合併join後的結果 •改變並行度,可能並行度太少了,致使個別task數據壓力大 •兩階段聚合,先局部聚合,再全局聚合 •自定義paritioner,分散key的分佈,使其更加均勻 15.RDD建立有哪幾種方式? 1).使用程序中的集合建立rdd 2).使用本地文件系統建立rdd 3).使用hdfs建立rdd, 4).基於數據庫db建立rdd 5).基於Nosql建立rdd,如hbase 6).基於s3建立rdd, 7).基於數據流,如socket建立rdd 若是隻回答了前面三種,是不夠的,只能說明你的水平仍是入門級的,實踐過程當中有不少種建立方式。 16.Spark並行度怎麼設置比較合適 答:spark並行度,每一個core承載2~4個partition,如,32個core,那麼64~128之間的並行度,也就是 設置64~128個partion,並行讀和數據規模無關,只和內存使用量和cpu使用 時間有關 17.Spark中數據的位置是被誰管理的? 答:每一個數據分片都對應具體物理位置,數據的位置是被blockManager,不管 數據是在磁盤,內存仍是tacyan,都是由blockManager管理 18.Spark的數據本地性有哪幾種? 答:Spark中的數據本地性有三種: a.PROCESS_LOCAL是指讀取緩存在本地節點的數據 b.NODE_LOCAL是指讀取本地節點硬盤數據 c.ANY是指讀取非本地節點數據 一般讀取數據PROCESS_LOCAL>NODE_LOCAL>ANY,儘可能使數據以PROCESS_LOCAL或NODE_LOCAL方式讀取。其中PROCESS_LOCAL還和cache有關,若是RDD常常用的話將該RDD cache到內存中,注意,因爲cache是lazy的,因此必須經過一個action的觸發,才能真正的將該RDD cache到內存中。 19.rdd有幾種操做類型? 1)transformation,rdd由一種轉爲另外一種rdd 2)action, 3)cronroller,crontroller是控制算子,cache,persist,對性能和效率的有很好的支持 三種類型,不要回答只有2中操做 19.rdd有幾種操做類型? 1)transformation,rdd由一種轉爲另外一種rdd 2)action, 3)cronroller,crontroller是控制算子,cache,persist,對性能和效率的有很好的支持 三種類型,不要回答只有2中操做 20.Spark如何處理不能被序列化的對象? 將不能序列化的內容封裝成object 21.collect功能是什麼,其底層是怎麼實現的? 答:driver經過collect把集羣中各個節點的內容收集過來彙總成結果,collect返回結果是Array類型的,collect把各個節點上的數據抓過來,抓過來數據是Array型,collect對Array抓過來的結果進行合併,合併後Array中只有一個元素,是tuple類型(KV類型的)的。 22.Spaek程序執行,有時候默認爲何會產生不少task,怎麼修改默認task執行個數? 答:1)由於輸入數據有不少task,尤爲是有不少小文件的時候,有多少個輸入 block就會有多少個task啓動;2)spark中有partition的概念,每一個partition都會對應一個task,task越多,在處理大規模數據的時候,就會越有效率。不過task並非越多越好,若是平時測試,或者數據量沒有那麼大,則沒有必要task數量太多。3)參數能夠經過spark_home/conf/spark-default.conf配置文件設置: spark.sql.shuffle.partitions 50 spark.default.parallelism 10 第一個是針對spark sql的task數量 第二個是非spark sql程序設置生效 23.爲何Spark Application在沒有得到足夠的資源,job就開始執行了,可能會致使什麼什麼問題發生? 答:會致使執行該job時候集羣資源不足,致使執行job結束也沒有分配足夠的資源,分配了部分Executor,該job就開始執行task,應該是task的調度線程和Executor資源申請是異步的;若是想等待申請完全部的資源再執行job的:須要將spark.scheduler.maxRegisteredResourcesWaitingTime設置的很大;spark.scheduler.minRegisteredResourcesRatio 設置爲1,可是應該結合實際考慮 不然很容易出現長時間分配不到資源,job一直不能運行的狀況。 24.map與flatMap的區別 map:對RDD每一個元素轉換,文件中的每一行數據返回一個數組對象 flatMap:對RDD每一個元素轉換,而後再扁平化 將全部的對象合併爲一個對象,文件中的全部行數據僅返回一個數組 對象,會拋棄值爲null的值 25.列舉你經常使用的action? collect,reduce,take,count,saveAsTextFile等 26.Spark爲何要持久化,通常什麼場景下要進行persist操做? 爲何要進行持久化? spark全部複雜一點的算法都會有persist身影,spark默認數據放在內存,spark不少內容都是放在內存的,很是適合高速迭代,1000個步驟 只有第一個輸入數據,中間不產生臨時數據,但分佈式系統風險很高,因此容易出錯,就要容錯,rdd出錯或者分片能夠根據血統算出來,若是沒有對父rdd進行persist 或者cache的化,就須要重頭作。 如下場景會使用persist 1)某個步驟計算很是耗時,須要進行persist持久化 2)計算鏈條很是長,從新恢復要算不少步驟,很好使,persist 3)checkpoint所在的rdd要持久化persist, lazy級別,框架發現有checnkpoint,checkpoint時單獨觸發一個job,須要重算一遍,checkpoint前 要持久化,寫個rdd.cache或者rdd.persist,將結果保存起來,再寫checkpoint操做,這樣執行起來會很是快,不須要從新計算rdd鏈條了。checkpoint以前必定會進行persist。 4)shuffle以後爲何要persist,shuffle要進性網絡傳輸,風險很大,數據丟失重來,恢復代價很大 5)shuffle以前進行persist,框架默認將數據持久化到磁盤,這個是框架自動作的。 27.爲何要進行序列化 序列化能夠減小數據的體積,減小存儲空間,高效存儲和傳輸數據,很差的是使用的時候要反序列化,很是消耗CPU 28.介紹一下join操做優化經驗? 答:join其實常見的就分爲兩類: map-side join 和 reduce-side join。當大表和小表join時,用map-side join能顯著提升效率。將多份數據進行關聯是數據處理過程當中很是廣泛的用法,不過在分佈式計算系統中,這個問題每每會變的很是麻煩,由於框架提供的 join 操做通常會將全部數據根據 key 發送到全部的 reduce 分區中去,也就是 shuffle 的過程。形成大量的網絡以及磁盤IO消耗,運行效率極其低下,這個過程通常被稱爲 reduce-side-join。若是其中有張表較小的話,咱們則能夠本身實如今 map 端實現數據關聯,跳過大量數據進行 shuffle 的過程,運行時間獲得大量縮短,根據不一樣數據可能會有幾倍到數十倍的性能提高。 備註:這個題目面試中很是很是大機率見到,務必搜索相關資料掌握,這裏拋磚引玉。 29.介紹一下cogroup rdd實現原理,你在什麼場景下用過這個rdd? 答:cogroup的函數實現:這個實現根據兩個要進行合併的兩個RDD操做,生成一個CoGroupedRDD的實例,這個RDD的返回結果是把相同的key中兩個RDD分別進行合併操做,最後返回的RDD的value是一個Pair的實例,這個實例包含兩個Iterable的值,第一個值表示的是RDD1中相同KEY的值,第二個值表示的是RDD2中相同key的值.因爲作cogroup的操做,須要經過partitioner進行從新分區的操做,所以,執行這個流程時,須要執行一次shuffle的操做(若是要進行合併的兩個RDD的都已是shuffle後的rdd,同時他們對應的partitioner相同時,就不須要執行shuffle,), 場景:表關聯查詢 30 下面這段代碼輸出結果是什麼? -------------------------- def joinRdd(sc:SparkContext) { val name= Array( Tuple2(1,"spark"), Tuple2(2,"tachyon"), Tuple2(3,"hadoop") ) val score= Array( Tuple2(1,100), Tuple2(2,90), Tuple2(3,80) ) val namerdd=sc.parallelize(name); val scorerdd=sc.parallelize(score); val result = namerdd.join(scorerdd); result .collect.foreach(println); } -------------------------- 答案: (1,(Spark,100)) (2,(tachyon,90)) (3,(hadoop,80))
相關文章
相關標籤/搜索