RDD怎么理解?
RDD 是 Spark 的靈魂,也稱為彈性分布式數據集。一個 RDD 代表一個可以被分區的只讀數據集。RDD 內部可以有許多分區(partitions),每個分區又擁有大量的記錄(records)。Rdd的五個特征: 1. dependencies: 建立 RDD 的依賴關系,主要 RDD 之間是寬窄依賴的關系,具有窄依賴關系的 RDD 可以在同一個 stage 中進行計算。 2. partition: 一個 RDD 會有若干個分區,分區的大小決定了對這個 RDD 計算的粒度,每個 RDD 的分區的計算都在一個單獨的任務中進行。 3. preferedlocations: 按照“移動數據不如移動計算”原則,在 Spark 進行任務調度的時候,優先將任務分配到數據塊存儲的位置。 4. compute: Spark 中的計算都是以分區為基本單位的,compute 函數只是對迭代器進行復合,並不保存單次計算的結果。 5. partitioner: 只存在於(K,V)類型的 RDD 中,非(K,V)類型的 partitioner 的值就是 None。
RDD 的算子主要分成2類,action 和 transformation。這里的算子概念,可以理解成就是對數據集的變換。action 會觸發真正的作業提交,而 transformation 算子是不會立即觸發作業提交的。每一個 transformation 方法返回一個新的 RDD。只是某些 transformation 比較復雜,會包含多個子 transformation,因而會生成多個 RDD。這就是實際 RDD 個數比我們想象的多一些 的原因。通常是,當遇到 action 算子時會觸發一個job的提交,然后反推回去看前面的 transformation 算子,進而形成一張有向無環圖。
groupByKey和reduceByKey是屬於Transformation還是 Action?
前者,因為 Action 輸出的不再是 RDD 了,也就意味着輸出不是分布式的,而是回送到 Driver 程序。以上兩種操作都是返回 RDD,所以應該屬於 Transformation。
列舉一些 Transformation 和 Action
Transformantion: Map, Filter, FlatMap, Sample, GroupByKey, ReduceByKey, Union, Join, Cogroup, MapValues, Sort, PartionBy
Action: Collect, Reduce, Lookup, Save
說說Spark的特點,相對於MR來說
減少磁盤 I/O,MR 會把 map 端將中間輸出和結果存儲在磁盤中,reduce 端又需要從磁盤讀寫中間結果,勢必造成磁盤 I/O 稱為瓶頸。Spark 允許將 map 端的中間結果輸出和結果存儲在內存中,reduce 端在拉取中間結果的時候避免了大量的磁盤 I/O。
增加並行度,由於把中間結果寫到磁盤與從磁盤讀取中間結果屬於不同的緩解,Hadoop 將他們簡單地通過串行執行銜接起來,Spark 則把不同的環節抽象成為 Stage,允許多個 Stage 既可以串行又可以並行執行。
避免重新計算,當 Stage 中某個分區的 Task 執行失敗后,會重新對此 Stage 調度,但在重新調度的時候會過濾已經執行成功的分區任務,所以不會造成重復計算和資源浪費。
可選的 Shuffle 排序,MR 在 Shuffle 之前有着固定的排序操作,而 Spark 則可以根據不同場景選擇在 map 端排序還是 reduce 排序。
靈活的內存管理策略,Spark 將內存分為堆上的存儲內存、堆外的存儲內存,堆上的執行內存,堆外的執行內存4個部分。
概述一下spark中的常用算子區別(map、mapPartitions、foreach、foreachPartition)
map:用於遍歷RDD,將函數f應用於每一個元素,返回新的RDD(transformation算子)。
foreach:用於遍歷RDD,將函數f應用於每一個元素,無返回值(action算子)。
mapPartitions:用於遍歷操作RDD中的每一個分區,返回生成一個新的RDD(transformation算子)。
foreachPartition: 用於遍歷操作RDD中的每一個分區。無返回值(action算子)。
總結:一般使用mapPartitions或者foreachPartition算子比map和foreach更加高效,推薦使用。
Pair RDD{(1,2),(3,4),(3,6)}轉化操作.reduceByKey((x,y)=>x+y)的結果是什么?
{(1,2),(3,10)}
Pair RDD{(1,2),(3,4),(3,6)}轉化操作.groupByKey()的結果是什么?
{(1,[2]),(3,[4,6])}
Pair RDD{(1,2),(3,4),(3,6)}轉化操作.mapValues(x=>x+1)的結果是什么?
{(1,3),(3,5),(3,7)}
兩個Pair RDD,分別rdd={(1,2),(3,4),(3,6)},other={(3,9)},rdd.substractByKey(other)的結果是什么?
這是刪除rdd與other不同鍵的操作
結果:{(1,2)}
如果要統計一個文本中的單詞出現次數,寫出主要代碼實現
(py or scala or java皆可)
rdd = sc.textFile(....)
val words = rdd.flatMap(x=>x.split(" "))
val result = words.map(x=>(x,1)).reduceByKey((x,y)=>x+y)
spark支持處理那些文件格式的讀取?
文本、json、csv、hadoop sequenceFiles、Protocal buffers...
spark如何將一個目錄下的所有文件讀到一個pair rdd中?
sc.wholetextFiles("file://root/home/dir")
Transformation和action是什么?區別?舉幾個常用方法
RDD 創建后就可以在 RDD 上進行數據處理。RDD 支持兩種操作: 1. 轉換(transformation): 即從現有的數據集創建一個新的數據集 2. 動作(action): 即在數據集上進行計算后,返回一個值給 Driver 程序
RDD 的轉化操作是返回一個新的 RDD 的操作,比如 map() 和 filter() ,而行動操作則是向驅動器程序返回結果或把結果寫入外部系統的操作,會觸發實際的計算,比如 count() 和 first() 。Spark 對待轉化操作和行動操作的方式很不一樣,因此理解你正在進行的操作的類型是很重要的。如果對於一個特定的函數是屬於轉化操作還是行動操作感到困惑,你可以看看它的返回值類型:轉化操作返回的是 RDD,而行動操作返回的是其他的數據類型。
RDD 中所有的 Transformation 都是惰性的,也就是說,它們並不會直接計算結果。相反的它們只是記住了這些應用到基礎數據集(例如一個文件)上的轉換動作。只有當發生一個要求返回結果給 Driver 的 Action 時,這些 Transformation 才會真正運行。
這個設計讓 Spark 更加有效的運行。
Spark為什么快,Spark SQL 一定比 Hive 快嗎?
From: https://blog.csdn.net/Stefan_xiepj/article/details/80347720
Spark SQL 比 Hadoop Hive 快,是有一定條件的,而且不是 Spark SQL 的引擎比 Hive 的引擎快,相反,Hive 的 HQL 引擎還比 Spark SQL 的引擎更快。其實,關鍵還是在於 Spark 本身快。
消除了冗余的 HDFS 讀寫: Hadoop 每次 shuffle 操作后,必須寫到磁盤,而 Spark 在 shuffle 后不一定落盤,可以 cache 到內存中,以便迭代時使用。如果操作復雜,很多的 shufle 操作,那么 Hadoop 的讀寫 IO 時間會大大增加,也是 Hive 更慢的主要原因了。
消除了冗余的 MapReduce 階段: Hadoop 的 shuffle 操作一定連着完整的 MapReduce 操作,冗余繁瑣。而 Spark 基於 RDD 提供了豐富的算子操作,且 reduce 操作產生 shuffle 數據,可以緩存在內存中。
JVM 的優化: Hadoop 每次 MapReduce 操作,啟動一個 Task 便會啟動一次 JVM,基於進程的操作。而 Spark 每次 MapReduce 操作是基於線程的,只在啟動 Executor 是啟動一次 JVM,內存的 Task 操作是在線程復用的。每次啟動 JVM 的時間可能就需要幾秒甚至十幾秒,那么當 Task 多了,這個時間 Hadoop 不知道比 Spark 慢了多少。
說說SparkContext和SparkSession有什么區別
Application: 用戶編寫的 Spark 應用程序,Driver 即運行上述 Application 的 main() 函數並且創建 SparkContext。Application 也叫應用。
SparkContext: 整個應用的上下文,控制應用的生命周期。
RDD: 不可變的數據集合,可由 SparkContext 創建,是 Spark 的基本計算單元。
SparkSession: 可以由上節圖中看出,Application、SparkSession、SparkContext、RDD之間具有包含關系,並且前三者是1對1的關系。
描述一下運行時架構
https://www.jianshu.com/p/552b2798fe5e