rdd 特點(diǎn)
* - A list of partitions
* - A function for computing each split
* - A list of dependencies on other RDDs
* - Optionally, a Partitioner for key-value RDDs (e.g. to say that the RDD is hash-partitioned)
* - Optionally, a list of preferred locations to compute each split on (e.g. block locations for
* an HDFS file)
sparkContext 是通向spark集群的入口
可在不在集群中的機(jī)器上調(diào)用spark-submit或者spark shell
spark-submit腳本提供了提供應(yīng)用到集群最直接的方式。對于Standalone模式而言舶赔,Spark目前支持兩種部署模式半哟。在Client模式中批糟,Driver程序在提交命令的機(jī)器上。在Cluster模式中膘茎,Driver從集群中的worker節(jié)點(diǎn)中任取一個運(yùn)行驅(qū)動程序。
http://blog.csdn.net/liyaohhh/article/details/50753745
yarn-cluster和yarn-client模式的區(qū)別其實就是Application Master進(jìn)程的區(qū)別,yarn-cluster模式下壁却,driver運(yùn)行在AM(Application Master)中,它負(fù)責(zé)向YARN申請資源裸准,并監(jiān)督作業(yè)的運(yùn)行狀況展东。當(dāng)用戶提交了作業(yè)之后,就可以關(guān)掉Client狼速,作業(yè)會繼續(xù)在YARN上運(yùn)行琅锻。然而yarn-cluster模式不適合運(yùn)行交互類型的作業(yè)。而yarn-client模式下向胡,Application Master僅僅向YARN請求executor恼蓬,client會和請求的container通信來調(diào)度他們工作,也就是說Client不能離開僵芹〈τ玻看下下面的兩幅圖應(yīng)該會明白(上圖是yarn-cluster模式,下圖是yarn-client模式):
------------------
standalone master管理worker拇派,進(jìn)而負(fù)責(zé)資源調(diào)度
worker管理當(dāng)前計算節(jié)點(diǎn)荷辕,worker會啟動executor來完成真正的計算
standalone基本配置master上只需要配兩個文件,sparkenv 中寫3個東西 ma?s?te?r ip件豌,master port 這個用于rpc和worker疮方,jdk path
slaves寫worker ip
worker機(jī)器上只需要sparkenv不用slaves。
在master上startall茧彤,在其他worker機(jī)器上startall起不來master骡显。master節(jié)點(diǎn)通過ssh 命令在其他機(jī)器上啟動worker。之后worker與master的通信如注冊,heartbeat通過rpc tcp協(xié)議發(fā)送消息惫谤。
啟動worker壁顶,worker主動向master報告自己的cores和memory大小
standalone模式下,sparkshell不制定master則是本機(jī)啟動溜歪。指定master是集群若专。還可以指定memory與core。
sparksubmit或sparkshell啟動了一個用于提交任務(wù)的客戶端(driver)蝴猪,driver要與master建立連接(sparkcontext)调衰,如果不建立sparkconext,worker上的executor不會啟動拯腮,driver是個進(jìn)程窖式,里面有個sparkcontext object,這個object與master建立連接动壤,這個連接過程中告訴master executor的core與memory萝喘,master會進(jìn)行資源的分配(master已經(jīng)知道每個worker的資源),給符合條件的worker發(fā)消息琼懊,worker啟動executor阁簸,接下來executor要和driver進(jìn)行通信,那么executor怎么知道driver在哪兒呢哼丈?(driver告訴了master启妹,master告訴worker,worker啟動executor醉旦,executor就知道了)
sparkcontext創(chuàng)建好后饶米,可以構(gòu)建dag(trans-trans-action), transformation在driver,action觸發(fā)提交作業(yè)车胡,從后向前切成一個個stage檬输,提交一個個(從第一個)stage。stage是一個個task匈棘,放到一個taskset丧慈,同一個stage中task的業(yè)務(wù)邏輯相同(taskset中的task業(yè)務(wù)邏輯相同),但是數(shù)據(jù)不同主卫。比如數(shù)據(jù)有4個partition逃默,那么就有4個task,有兩個executor,均分到上面簇搅,每個2個task完域。如果不想均分,要改調(diào)度瘩将,對master進(jìn)行一些配置筒主。然后比如要讀取hdfs关噪,hdfs?4個分區(qū),然后一個task讀取一個分區(qū)乌妙,然后每個task不是一下全讀hdfs,而是拿到迭代器建钥,拿一條讀一條藤韵。計算結(jié)果放在executor內(nèi)存或disk(不夠的時候)。action比如是collect熊经,發(fā)給driver泽艘。action比如是寫hdfs,executor就直接并發(fā)寫了镐依。
spark 程序:app
用于提交應(yīng)用程序的: driver
資源管理:master
節(jié)點(diǎn)管理:worker
執(zhí)行真正的業(yè)務(wù)邏輯:executor
細(xì)節(jié)
dag怎么切分
資源怎么調(diào)度
executor中業(yè)務(wù)邏輯怎么執(zhí)行
word count
val rdd = sc.textfile().flatMap(.split(" ")).map(, 1).reduceByKey(_ + _)
textFile 產(chǎn)生hadooprRDD ->mapPartitionsRDD
rdd.toDebugString
rdd.dependencies
flatMap 和map 都是產(chǎn)生mapPartitionsRDD
reduceByKey shuffledRDD
saveAsTextFile mapPartitionsRDD
一共產(chǎn)生6個RDD
經(jīng)過一系列transformation匹涮,action觸發(fā)提交dag到 dagscheduler,dagscheduler 劃分stage,按順序?qū)⒁粋€個taskset(通過taskscheduler)分發(fā)到worker槐壳。
spark 讀hdfs 權(quán)限可在程序里設(shè)置然低, system.setproperty("user.name", "name")
spark repartition 有shuffle write
reparition之后cache,相當(dāng)于cache的是repartition中最后的rdd
val rdd1 = sc.parallelize(List(1,2,3,4,5,6), 2)
val rdd2 = rdd1.repartition(6).cache
val rdd3 = rdd2.map(_ + 1).cache
rdd3.collect
val rdd4 = rdd2.map(_ * 2).cache
rdd4.collect
這樣的話在job圖里會顯示
在stage中會顯示
所以cache不cache住要在job圖里看务唐。即使repartition后的被cache住了雳攘,還是會在stage中的第一個框框里顯示
val RDD1 = sc.parallelize(List(1,2,3,4,5,6),2)
val RDD2 = RDD1.repartition(6)
val RDD3 = RDD2.map(_ + 1).cache
val RDD4 = RDD3.map(_ * 2)
RDD4.collect
val RDD5 = RDD3.map(_ * 3)
RDD5.collect
job UI
stage UI
所以結(jié)論是什么呢?比如你cache了某個rdd