1蜓竹、Spark目前只持哪哪種語言的API?
Java, Scala, Python, R.
Ref: http://spark.apache.org/
2换吧、RDD執(zhí)行transformation和執(zhí)行action的區(qū)別是什么管引?
1梆靖,transformation是得到一個新的RDD冒签,方式很多在抛,比如從數(shù)據(jù)源生成一個新的RDD,從RDD生成一個新的RDD
2萧恕,action是得到一個值刚梭,或者一個結(jié)果(直接將RDDcache到內(nèi)存中)
所有的transformation都是采用的懶策略肠阱,就是如果只是將transformation提交是不會執(zhí)行計算的,計算只有在action被提交的時候才被觸發(fā)朴读。
從運行層面來看屹徘,Transformation實際上是一種鏈式的邏輯Action,記錄了RDD演變的過程衅金。Action則是實質(zhì)觸發(fā)Transformation開始計算的動作噪伊,由于在每個Transformation的過程中都有記錄,所以每個RDD是知道上一個RDD是怎樣轉(zhuǎn)變?yōu)楫斍盃顟B(tài)的氮唯,所以如果出錯就可以很容易的重新演繹計算過程鉴吹。
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的區(qū)別授滓? 從計算和容錯兩方面說明琳水!
摘要: narrow dependency和wide dependency的區(qū)別,從計算和容錯方面說明
根據(jù)不同的transformation操作般堆,RDD的依賴可以分為窄依賴 (Narrow Dependency)和寬依賴(Wide Dependency在孝,在代碼中為ShuffleDependency)兩種類型。
窄依賴指的是生成的RDD中每個partition只依賴于父RDD(s)固定的partition淮摔。
寬依賴指的是生成的RDD的每一個partition都依賴于父 RDD(s)所有partition私沮。
窄依賴典型的操作有map, filter, union(特殊)等
寬依賴典型的操作有groupByKey, sortByKey等。
窄依賴的第一個作用,我的理解是可以不用等上一次操作全部做完和橙,每完成一條記錄就可以進行下次操作仔燕,如map產(chǎn)生一條新紀錄馬上就做filter
那么對于寬依賴,不能順序執(zhí)行魔招,比如groupByKey操作晰搀。它需要等所有的計算map,filter都做完,才能做ByKey的計算办斑。另外外恕,union這個必須要重點提一下。這個操作只能說不一定乡翅,記琢燮!:不一定。為什么這么說呢蠕蚜。尚洽。因為如果你的計算非常少,最后只有一個DAG在計算靶累,那它就是narrow翎朱。橄维。。如果是多個DAG拴曲,那此時必然是wide,必然要做shuffle争舞。
可以看到,寬依賴往往意味著shuffle操作澈灼,這也是Spark劃分stage(任務集)的主要邊界竞川。對于窄依賴,Spark會將其盡量劃 分在同一個stage中叁熔,因為它們可以進行流水線計算委乌。
計算方面:
上圖詳細解釋一下Spark中的Stage劃分。我們從HDFS中讀入數(shù)據(jù)生成3個不同的RDD荣回,通過一系列 transformation操作后再將計算結(jié)果保存回HDFS遭贸。可以看到這幅DAG中只有join操作是一個寬依賴心软,Spark內(nèi)核會以此為邊界將其前 后劃分成不同的Stage. 同時我們可以注意到壕吹,在圖中Stage2中,從map到union都是窄依賴删铃,這兩步操作可以形成一個流水線操作耳贬,通過map操作生成的 partition可以不用等待整個RDD計算結(jié)束,而是繼續(xù)進行union操作猎唁,這樣大大提高了計算的效率咒劲。
而Hadoop的MapReduce更像是寬依賴,所以Spark引入了窄依賴大大提高了計算速度诫隅。
容錯方面:
narrow dependencies的失敗恢復更有效腐魂,因為它只需要重新計算丟失的parent partition即可,而且可以并行地在不同節(jié)點進行重計算逐纬。而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、下載搜狗實驗室用戶查詢?nèi)罩揪啺妫?a target="_blank" rel="nofollow">http://www.sogou.com/labs/dl/q.html
(63M)风题,做以下查詢:
① ?戶在00:00:00到12:00:00之間的查詢數(shù)判导?
② 搜索結(jié)果排名第一,但是點擊次序排在第二的數(shù)據(jù)有多少沛硅?