1、Spark目前只持哪哪種語言的API?
Java, Scala, Python, R.
Ref: http://spark.apache.org/
2、RDD執行transformation和執行action的區別是什么?
1,transformation是得到一個新的RDD,方式很多,比如從數據源生成一個新的RDD,從RDD生成一個新的RDD
2,action是得到一個值,或者一個結果(直接將RDDcache到內存中)
所有的transformation都是采用的懶策略,就是如果只是將transformation提交是不會執行計算的,計算只有在action被提交的時候才被觸發。
從運行層面來看,Transformation實際上是一種鏈式的邏輯Action,記錄了RDD演變的過程。Action則是實質觸發Transformation開始計算的動作,由于在每個Transformation的過程中都有記錄,所以每個RDD是知道上一個RDD是怎樣轉變為當前狀態的,所以如果出錯就可以很容易的重新演繹計算過程。
Reference:
- http://blog.csdn.net/map_lixiupeng/article/details/41958561
- http://www.dataguru.cn/thread-588091-1-1.html
- http://my.oschina.net/hanzhankang/blog/200275
3、RDD cache默認的StorageLevel級別是什么?
val MEMORY_ONLY = new StorageLevel(false, true, true)!
緩存策略
class StorageLevel private(!
private var useDisk_ : Boolean,!
private var useMemory_ : Boolean,!
private var deserialized_ : Boolean,!
private var replication_ : Int = 1)!
!
!
val NONE = new StorageLevel(false, false, false)!
val DISK_ONLY = new StorageLevel(true, false, false)!
val DISK_ONLY_2 = new StorageLevel(true, false, false, 2)!
val MEMORY_ONLY_2 = new StorageLevel(false, true, true, 2)!
val MEMORY_ONLY_SER = new StorageLevel(false, true, false)!
val MEMORY_ONLY_SER_2 = new StorageLevel(false, true, false, 2)!
val MEMORY_AND_DISK = new StorageLevel(true, true, true)!
val MEMORY_AND_DISK_2 = new StorageLevel(true, true, true, 2)!
val MEMORY_AND_DISK_SER = new StorageLevel(true, true, false)!
val MEMORY_AND_DISK_SER_2 = new StorageLevel(true, true, false, 2)
4、說明narrow dependency 和 wide dependency的區別? 從計算和容錯兩方面說明!
摘要: narrow dependency和wide dependency的區別,從計算和容錯方面說明
根據不同的transformation操作,RDD的依賴可以分為窄依賴 (Narrow Dependency)和寬依賴(Wide Dependency,在代碼中為ShuffleDependency)兩種類型。
窄依賴指的是生成的RDD中每個partition只依賴于父RDD(s)固定的partition。
寬依賴指的是生成的RDD的每一個partition都依賴于父 RDD(s)所有partition。
窄依賴典型的操作有map, filter, union(特殊)等
寬依賴典型的操作有groupByKey, sortByKey等。
窄依賴的第一個作用,我的理解是可以不用等上一次操作全部做完,每完成一條記錄就可以進行下次操作,如map產生一條新紀錄馬上就做filter
那么對于寬依賴,不能順序執行,比如groupByKey操作。它需要等所有的計算map,filter都做完,才能做ByKey的計算。另外,union這個必須要重點提一下。這個操作只能說不一定,記?。翰灰欢ā槭裁催@么說呢。。因為如果你的計算非常少,最后只有一個DAG在計算,那它就是narrow。。。如果是多個DAG,那此時必然是wide,必然要做shuffle。
可以看到,寬依賴往往意味著shuffle操作,這也是Spark劃分stage(任務集)的主要邊界。對于窄依賴,Spark會將其盡量劃 分在同一個stage中,因為它們可以進行流水線計算。
計算方面:
上圖詳細解釋一下Spark中的Stage劃分。我們從HDFS中讀入數據生成3個不同的RDD,通過一系列 transformation操作后再將計算結果保存回HDFS??梢钥吹竭@幅DAG中只有join操作是一個寬依賴,Spark內核會以此為邊界將其前 后劃分成不同的Stage. 同時我們可以注意到,在圖中Stage2中,從map到union都是窄依賴,這兩步操作可以形成一個流水線操作,通過map操作生成的 partition可以不用等待整個RDD計算結束,而是繼續進行union操作,這樣大大提高了計算的效率。
而Hadoop的MapReduce更像是寬依賴,所以Spark引入了窄依賴大大提高了計算速度。
容錯方面:
narrow dependencies的失敗恢復更有效,因為它只需要重新計算丟失的parent partition即可,而且可以并行地在不同節點進行重計算。而wide dependencies牽涉到RDD各級的多個Parent Partitions。
Reference:
- http://www.dataguru.cn/article-6585-1.html
- http://www.flybi.net/question/14203
- http://www.cnblogs.com/davidwang456/p/5135884.html
5、下載搜狗實驗室用戶查詢日志精簡版:http://www.sogou.com/labs/dl/q.html
(63M),做以下查詢:
① ?戶在00:00:00到12:00:00之間的查詢數?
② 搜索結果排名第一,但是點擊次序排在第二的數據有多少?