




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
Spark云創(chuàng)大數(shù)據(jù)目錄Spark簡介Spark接口實戰(zhàn)Spark
Shell實戰(zhàn)Spark編程之RDD實戰(zhàn)Spark之WordCount實戰(zhàn)Spark之MLLibSpark簡介Spark簡介基礎(chǔ)概念體系架構(gòu)集群部署計算模型工作機制其他特性基本概念Spark于2009年誕生于伯克利大學(xué)AMPLab,最初它只是伯克利大學(xué)的研究性項目。2010年時Spark正式開源,2013年,伯克利將其捐贈給Aparch基金會。2014年成為Aparch基金的頂級項目,目前已廣泛應(yīng)用于工業(yè)界。由來概念Spark是一個高速的通用型集群計算框架,其內(nèi)部內(nèi)嵌了一個用于執(zhí)行DAG的(有向無環(huán)圖)工作流引擎,能夠?qū)AG類型的Spark-App拆分成Task序列并在底層框架上并行運行。程序接口層:Java、Scala、Python、R等高級語音直接編寫Spark-App。接口專用組件:SQL、Mllib、GraphX、Streaming等專用組件,這些組件內(nèi)置了大量專用算法,充分利用這些組件,能夠大大加快Spark-App開發(fā)進度。Spark主要模塊(基本概念)Spark計算模型(基本概念)Spark計算模型(基本概念)單MapReduce執(zhí)行過程Spark與MapReduce(基本概念)單MapReduce執(zhí)行過程Spark與MapReduce(基本概念)獨立進程獨立進程只有一個進程Reduce進程Reduce進程Executor進程Executor進程Executor進程Executor執(zhí)行MapExecutor執(zhí)行MapExecutor執(zhí)行MapExecutor執(zhí)行MapExecutor執(zhí)行MapExecutor執(zhí)行MapExecutor進程Executor執(zhí)行ReduceExecutor執(zhí)行ReduceExecutor進程Executor執(zhí)行ReduceExecutor執(zhí)行Reduce兩個MapReduce執(zhí)行過程Spark與MapReduce(基本概念)兩個MapReduce執(zhí)行過程Spark與MapReduce(基本概念)只有一個進程獨立進程獨立進程獨立進程獨立進程Reduce進程Reduce進程Map進程Map進程Map進程Reduce進程Reduce進程Map進程Map進程Executor進程Executor進程Executor進程Executor執(zhí)行MapExecutor執(zhí)行MapExecutor執(zhí)行MapExecutor執(zhí)行MapExecutor執(zhí)行MapExecutor執(zhí)行MapExecutor執(zhí)行ReduceExecutor執(zhí)行ReduceExecutor進程Executor執(zhí)行ReduceExecutor執(zhí)行ReduceExecutor進程Executor執(zhí)行MapExecutor執(zhí)行MapExecutor執(zhí)行MapExecutor執(zhí)行MapExecutor執(zhí)行MapExecutor執(zhí)行MapExecutor執(zhí)行ReduceExecutor執(zhí)行ReduceExecutor執(zhí)行ReduceExecutor執(zhí)行ReduceExecutor執(zhí)行ReduceExecutor執(zhí)行Reduce小結(jié)(基本概念)Hadoop的MapReduce框架執(zhí)行MapReduce程序時會啟動一系列進程Spark只在每臺機上啟動一個ExecutorSpark默認不排序MapReduce發(fā)展(基本概念)體系架構(gòu)Spark體系架構(gòu)資源管理層:使用自帶資源管理器,使用第三方資源管理器程序執(zhí)行層:邏輯一樣,進程名不同體系架構(gòu)Spark體系架構(gòu)資源管理層:使用自帶資源管理器,使用第三方資源管理器程序執(zhí)行層:邏輯一樣,進程名不同資源管理層:Standalone、YARN、Mesos體系架構(gòu)Spark體系架構(gòu)程序執(zhí)行層從服務(wù)主服務(wù):Master資源管理層WorkerWorkerWorkerWorker從服務(wù)Eexcutor主服務(wù):DriverEexcutorEexcutor體系架構(gòu)Spark體系架構(gòu)程序執(zhí)行層從服務(wù)主服務(wù):ResourceManager資源管理層NodeManager從服務(wù)主服務(wù):SparkAppMasterNodeManagerNodeManagerChildChildChildChild使用Standalone資源管理器體系架構(gòu)Spark體系架構(gòu)從服務(wù)主服務(wù):Master資源管理層WorkerWorkerWorkerWorker從服務(wù)WorkerWorkerWorker主服務(wù):Master程序執(zhí)行層WorkerStandalone資源管理器Standalone時執(zhí)行層第三方資源管理器體系架構(gòu)Spark體系架構(gòu)程序執(zhí)行層從服務(wù)主服務(wù):ResourceManager資源管理層NodeManager從服務(wù)主服務(wù):SparkAppMasterNodeManagerNodeManagerChildChildChildChildYARN資源管理器YARN時程序執(zhí)行層Spark-App運行模式集群模式是什么/分類客戶端模式判斷依據(jù):運行Spark-App主服務(wù)的機器是否在集群里
Spark-App主服務(wù)位于集群內(nèi):離線作業(yè)實例Spark-App主服務(wù)位于客戶端:交互式執(zhí)行器(如SQL)采用Standalone資源管理器采用YARN資源管理器Spark集群部署Spark集群部署概念:部署資源管理器手工部署Standalone資源管理器演示 手工部署YARN資源管理器Ambari部署YARN資源管理器手工部署SparkStep1
制定部署規(guī)劃。Step2
準備硬件機器,準備機器操作系統(tǒng)環(huán)境,準備機器網(wǎng)絡(luò)環(huán)境。
Step3
對集群內(nèi)每一臺機器,修改機器名,關(guān)閉防火墻,安裝jdk。Step4
為每臺機器,添加集群級別域名映射。Step5
打通主節(jié)點到自身無密鑰認證,打通主節(jié)點到所有從節(jié)點無密鑰認證。Step6
主節(jié)點解壓Spark,配置spark。Step7
將配置好的Spark復(fù)制至所有slave機。Step8
啟動Spark。Step9
測試Spark。P362手工部署Spark效果圖P362[allen@iclient0
spark-1.5.2-bin-hadoop2.6]$
bin/spark-submit
--master
\>spark://cmaster0:7077 --class
org.apache.spark.examples.SparkPi
\>lib/spark-examples-1.5.2-hadoop2.6.0.jar請演示手工部署配置Spark使用HDFS在spark-env.sh里設(shè)置hadoop環(huán)境變量[allen@iclient0
spark-1.5.2-bin-hadoop2.6]$
bin/spark-submit
--masterspark://cmaster0:7077
\--class
org.apache.spark.examples.JavaWordCount
\lib/spark-examples-1.5.2-hadoop2.6.0.jar
/user/allen/in/note2.txt請演示配置宿主于YARN宿主于YARN請演示手工部署YARNStep1
制定部署規(guī)劃。Step2
準備硬件機器和OS環(huán)境。Step3
配置單機OS環(huán)境和集群環(huán)境。Step4
部署HDFS、YARNStep5
部署Spark宿主于YARN請演示使用Ambari部署YARN+SparkStep1
制定部署規(guī)劃。Step2
準備硬件機器和OS環(huán)境。
Step3
配置單機OS環(huán)境和集群環(huán)境。
Step4
部署Ambari-server。Step5
使用Ambari-server部署HDFS、YARN、Spark。宿主于YARNbin/spark-submit
--class
org.apache.spark.examples.SparkPi--master
yarn-cluster
--num-executors
3
--driver-memory
1g--executor-memory
1g
--executor-cores
1
lib/spark-examples*.jar
10請演示在YARN上運行Spark-App[allen@cmaster0
spark-1.5.2-bin-hadoop2.6]$
bin/spark-submit
--classorg.apache.spark.examples.JavaWordCount
--master
yarn-cluster
--num-executors
3 --driver-memory
1g --executor-memory
1g --executor-cores
1
lib/spark-examples-1.5.2-hadoop2.6.0.jarhdfs://cmaster0:8020/user/allen/notes/note2.txtSpark計算模型Spark是一個用于并行處理海量數(shù)據(jù)的分布式計算框架,其內(nèi)部對任務(wù)的并行策略是M-S-R范式。一個標準的Spark-App可拆分成一系列M-S-R任務(wù),
Spark內(nèi)置了DAGSchedule,直接將DAG型M-S-R任務(wù)調(diào)度到集群上執(zhí)行。
Spark的計算模型是,對分散于集群內(nèi)各個計算節(jié)點的數(shù)據(jù):①如果需要對這些數(shù)據(jù)進行若干次本地計算那就進行若干次本地計算(Map)。②如果需要將不同機器上的數(shù)據(jù)進行若干次合并那就進行若干次網(wǎng)絡(luò)合并(Shuffle)。③對于Shuffle后數(shù)據(jù),如果還需要進行若干次Map或Shuffle操作,那就進行若干次Map或Shuffle操作。④可按業(yè)務(wù)需求,可對上述①、②、③進行任意組合,直接任務(wù)結(jié)束。Spark計算模型示例現(xiàn)有一原始文件rawFile0,要求將rawFile0均勻加載到cslave0、cslave1和cslave2中,然后對rawFile0中數(shù)據(jù)執(zhí)行過濾操作,過濾時要求只保留"aa"、"bb"這兩種字符。接著,將"aa"全部發(fā)往cslave0上、"bb"全部發(fā)往cslave1上。最后統(tǒng)計
"aa"和"bb"這兩個單詞出現(xiàn)次數(shù)。示例1:使用MapReduce模式統(tǒng)計單詞出現(xiàn)次數(shù)aa,1bb,2aa,1bb,2cslave0cslave1val
conf
=
new
SparkConf()val
sc:
SparkContext
=
new
SparkContext(conf)val
rawRDDA
=sc.parallelize(List("!!
bb
##
cc","%%
cc
bb
%%","cc
&&
++
aa"),3)var
tmpRDDA1=rawRDDA.flatMap(line=>line.split("
"))var
tmpRDDA2=tmpRDDA1.filter(allWord=>{allWord.contains("aa")
||allWord.contains("bb")})var
tmpRDDA3=tmpRDDA2.map(word
=>
(word,
1))import
org.apache.spark.HashPartitionervar
tmpRDDA4=tmpRDDA3.partitionBy(new
HashPartitioner(2)).groupByKey()var
tmpResultRDDA=tmpRDDA4.map((P:
(String,
Iterable[Int]))
=>
(P._1,
P._2.sum))實例1結(jié)論在Spark中,稱某機上的一個固定數(shù)據(jù)塊為一個Partition;稱一系列相關(guān)Partition組合為一個RDD,如tmpRDDA2擁有三個Partition而tmpResultRDDA擁有兩個Partition。通過上述代碼及其執(zhí)行流程圖可以看出:①RDD是數(shù)據(jù)統(tǒng)一操作所在地;②RDD是數(shù)據(jù)并行化所在地;③RDD并行化范式主要有Map范式和Shuffle范式;④RDD是數(shù)據(jù)隔離核心;⑤RDD是數(shù)據(jù)轉(zhuǎn)換核心;Map范式指的是只對本Partition上數(shù)據(jù)進行操作,其操縱的數(shù)據(jù)對象不跨越多個Partition,即不跨越網(wǎng)絡(luò)。
Shuffle范式指的是對不同Partition上的數(shù)據(jù)進行重組,其操縱的數(shù)據(jù)對象不跨越多個甚至是所有Partition,即跨越網(wǎng)絡(luò)現(xiàn)有兩個原始文件rawFile1和rawFile2,要求將rawFile1的內(nèi)容均勻加載到cslave3、cslave4上,接著對rawFile1的數(shù)據(jù)進行去重操作,即rawFile1里每個條目只保留一項;要求將rawFile2內(nèi)存加載到cslave5,接著對第一問的結(jié)果數(shù)據(jù),再去除rawFile2中所含條目。示例2:使用MapReduce模式統(tǒng)計單詞出現(xiàn)次數(shù)xx,99zz,99xx,99zz,99cslave3cslave4val
conf
=
new
SparkConf()val
sc:
SparkContext
=
new
SparkContext(conf)val
rawRDDB=sc.parallelize(List(("xx",
99),
("yy",
88),("xx",
99),
("zz",
99)),
2)val
rawRDDC=sc.parallelize(List(("yy",
88)),
1)var
tmpResultRDDBC=rawRDDB.distinct.subtract(rawRDDC)⑥在同一個操作中,可以有不同的輸入源。顯然,代碼中的subtract()就是兩個RDD相減,而這兩個又是來自兩個不同的輸入文件。實例2結(jié)論現(xiàn)有三個原始文件rawFile0、rawFile1、rawFile2,要求統(tǒng)計rawFile0中"aa"、
"bb"兩個單詞出現(xiàn)次數(shù);要求對去重后的rawFile1文件,再去掉rawFile2中內(nèi)容;最后,要求將上述兩個結(jié)果合并成同一個文件并存入HDFS。示例3:多次使用MapReduce模式完成要求<bb,2><aa,1>cslave0cslave1<xx,99><zz,99>cslave3cslave4resultRDD<bb,2><aa,1>part-00000<xx,99><zz,99>HDFSpart-00001part-00002part-00003val
conf
=
new
SparkConf()val
sc:
SparkContext
=
new
SparkContext(conf)valrawRDDA=sc.parallelize(List("!!
bb
##
cc","%%
ccbb
%%","cc
&&
++aa"),3)val
rawRDDB=sc.parallelize(List(("xx",
99),
("yy",
88),("xx",
99),
("zz",
99)),2)valrawRDDC=sc.parallelize(List(("yy",
88)),
1)importorg.apache.spark.HashPartitionervartmpResultRDDA=rawRDDA.flatMap(line=>line.split("
")).filter(allWord=>{allWord.contains("aa")||
allWord.contains("bb")}).map(word
=>
(word,
1)).partitionBy(newHashPartitioner(2)).groupByKey().map((P:
(String,
Iterable[Int]))
=>
(P._1,
P._2.sum))vartmpResultRDDBC=rawRDDB.distinct.subtract(rawRDDC)valresultRDDABC=tmpResultRDDA.union(tmpResultRDDBC)resultRDDABC.saveAsTextFile("HDFS路徑")實例3結(jié)論⑦當Map范式作用于RDD時,不會改變前后兩個RDD內(nèi)Partition數(shù)量;當partitionBy、union作用于RDD時,會改變前后兩個RDD內(nèi)Partition數(shù)量。⑧將RDD持久化到HDFS時,RDD對應(yīng)一個文件夾,隸屬于本RDD的每個Partition對應(yīng)于一個獨立文件。⑨各個RDD之間的數(shù)據(jù),不論是Map范式還是Shuffle范式,中間結(jié)果不存入本地磁盤或HDFS。⑩各個RDD之間組成一個有向無環(huán)圖,這個DAG圖可以有多個(本例中為三個)輸入源??梢詫⑦B續(xù)RDD轉(zhuǎn)換操作寫成一個“點”系列操作??梢酝ㄟ^RDD實現(xiàn)數(shù)據(jù)細顆粒操作。Spark計算模型總結(jié)本節(jié)開頭已經(jīng)給出了Spark計算模型,這里再進一步細化其模型內(nèi)容,假設(shè)某RDD持有一定數(shù)量的Partition,對于該RDD:①物理上Partition是一個實體數(shù)據(jù)塊,該RDD的各個Partition會默認分散到集群中各臺機器上。②如果需要對此RDD進行若干次本地計算那就進行若干次本地計算(Map),計算時,其并行化點是,各機器(實際上是Executor)處理存儲于本機的Partition。③如果需要對該RDD內(nèi)各Partition進行若干次重組(如將Partition2的部分數(shù)據(jù)分給Partition7),那就進行若干次(跨網(wǎng)絡(luò))重組(Shuffle)。④對于Shuffle后RDD,如果還需要進行若干次Map或Shuffle操作,那就進行若干次
Map或Shuffle操作。⑤可按業(yè)務(wù)需求,對上述②、③、④中的RDD進行任意組合,直接任務(wù)結(jié)束,不過組合后的RDD必須是一個有向五環(huán)圖。⑥對于這個由RDD構(gòu)成的有向無環(huán)圖,其可以有多個輸入源。Spark的計算模型是:依托RDD作為(邏輯上)分布式存儲中心和并行處理中心,以有向無環(huán)圖方式來執(zhí)行用戶編寫的RDD序列。正如Spark計算模型中所述,RDD是Spark核心。向下RDD以一組Partition方式將數(shù)據(jù)分散到集群中,向上RDD提供了一系列用戶級別操作接口,RDD的Partition更是并行化所在地。不過在Spark程序執(zhí)行過程中,好像看不到RDD存在的痕跡,這是因為RDD是數(shù)據(jù)層、用戶API層、并行執(zhí)行層,這三者實際結(jié)合體,必須高度抽象。用戶編寫的RDD序列,實際上就是Driver進程里,用戶程序的執(zhí)行流程。RDD邏輯層面RDD物理層面工作機制Step1主節(jié)點啟動資源管理主服務(wù)Master進程。
Step2各slave機啟動資源管理從進程Worker進程。
Step3各Worker會自動到Master注冊自己集群資源管理層Spark-App應(yīng)用程序執(zhí)行Step1用戶編寫Spark-App代碼,須將用戶編寫的代碼和Client包打包到一起。Step2
Client向Master提交任務(wù)。Step3
Master在確認Spark-App合法后,要求各Worker啟動相應(yīng)Executor。Step4各個Executor向Driver注冊自己。Step5
Driver指揮各Executor并行處理本次Spark-App。Step1用戶調(diào)用RDD
API接口,編寫類似“場景3”中程序代碼。
Step2用戶調(diào)用Spark提交任務(wù)接口,向Master提交任務(wù)。Step3
Master接收客戶端提交的Spark任務(wù),接著Master要求各Worker啟動Executor。Step4用戶編寫的代碼和提交任務(wù)的客戶端統(tǒng)一稱Driver,各Executor向Driver注冊。
Step5
RDD
Graph將用戶的RDD串組織成DAG-RDD。Step6
DAGSchedule以Shuffle為原則(即遇Shuffle就拆分)將DAG-RDD拆分成一系列StageDAG-RDD(StageDAG-RDD0
StageDAG-RDD1
StageDAG-RDD2
…)。Step7
RDD將通過訪問NameNode,將DataNode上的數(shù)據(jù)塊裝入RDD的Partition。Step8TaskSchedule將StageDAG-RDD0發(fā)往隸屬于本RDD的所有Partition執(zhí)行,在Partition執(zhí)行過程中,Partition所在機上的Executor優(yōu)先執(zhí)行本Partition。Step9
TaskSchedule將StageDAG-RDD1發(fā)往隸屬于本RDD(已改變)的所有Partition執(zhí)行。Step10重復(fù)上述步驟,直至執(zhí)行完所有Stage-DAG-RDD。其他特性以應(yīng)用程序來隔離資源集群管理器網(wǎng)絡(luò)可達Spark接口Spark接口Spark
Web接口Spark
Shell接口Spark
API接口Spark接口Spark
Web接口Spark
Shell接口Spark
API接口Spark
SQL接口
Spark
Streaming接口
Spark
MLlib接口
Spark
Graphx接口Master:8080實戰(zhàn)SparkWeb實戰(zhàn)Spark
Shell集群管理命令任務(wù)管理命令bin/spark-submitspark-shellstop-all.shstart-all.shstart-master.shstart-slave.shspark-sql集群管理任務(wù)管理實戰(zhàn)Spark
Shell[allen@iclient0
spark-1.5.2-bin-Hadoop2.6]$
bin/spark-submit
--help[allen@iclient0
spark-1.5.2-bin-Hadoop2.6]$
bin/spark-submit
--masterspark://cmaster0:7077--class
org.apache.spark.examples.SparkPi
lib/spark-examples-1.5.2-Hadoop2.6.0.jar[allen@iclient0
spark-1.5.2-bin-Hadoop2.6]$
bin/spark-submit
--classorg.apache.spark.examples.SparkPi--master
yarn-cluster --num-executors
3 --driver-memory
1g --executor-memory
1g--executor-cores
1 lib/spark-examples*.jar
10請演示[allen@iclient0
spark-1.5.2-bin-hadoop2.6]$
bin/spark-shell
--master
spark://cmaster0:7077實戰(zhàn)Spark編程之RDD實戰(zhàn)Spark編程之RDDRDD屬性并行化證明RDD、調(diào)試RDDRDD操作RDD屬性RDD(ResilientDistributedDatasets),站在程序員角度上,可將RDD看成一系列Partitions的集合。站在Spark框架角度上,RDD則是一個個需要并行執(zhí)行的操作。一個RDD持有一系列Partition,這些Partition則均勻分散于各slave節(jié)點上,用于存儲實際數(shù)據(jù)。RDD屬性//在內(nèi)存中構(gòu)建“1~9”9個數(shù)據(jù),將其分散到3個Partition上valz=sc.parallelize(List(1,2,3,4,5,6,7,8,9),3)//自定義查看輸入分區(qū)函數(shù)def
myfunc(index:
Int,
iter:
Iterator[(Int)])
:
Iterator[String]
=
{iter.toList.map(x
=>
"[partID:"
+ index+
",
val:
"
+
x
+
"]").iterator}//使用該函數(shù)查看Partition及其IDz.mapPartitionsWithIndex(myfunc).collect.foreach(println)//查看本RDD持有的Partition數(shù)量
z.partitions.length//存儲輸入數(shù)據(jù)至HDFSz.mapPartitionsWithIndex(myfunc).saveAsTextFile("test/hh")下面的程序完成在內(nèi)存中構(gòu)建“1~9”9個數(shù)據(jù)并設(shè)置其并行化因子為3,最后使用自定義函數(shù)查看PartitionID及其存儲在該Partition上的數(shù)據(jù)。RDD屬性//在內(nèi)存中構(gòu)建aa~kk
10個數(shù)據(jù)并將這10個數(shù)據(jù)分散到4個Partition上val
z=sc.parallelize(List("aa","bb","cc","dd","ee","ff","gg","hh","ii","kk"),4)//自定義查看輸入分區(qū)函數(shù)def
myfunc(index:
Int,
iter:
Iterator[(String)])
:
Iterator[String]
=
{iter.toList.map(x
=>
"[partID:"
+ index+
",
val:
"
+
x
+
"]").iterator}//使用該函數(shù)查看Partition及其IDz.mapPartitionsWithIndex(myfunc).collect.foreach(println)//查看本RDD持有的Partition數(shù)量
z.partitions.length//存儲輸入數(shù)據(jù)至HDFSz.mapPartitionsWithIndex(myfunc).saveAsTextFile("test/hh-1")RDD屬性下面的程序完成在內(nèi)存中構(gòu)建“aa~kk”10個數(shù)據(jù)并設(shè)置其并行化因子為4,最后使用自定義函數(shù)查看PartitionID及其存儲在該Partition上的數(shù)據(jù)。RDD屬性獲取RDD實例從持久化數(shù)據(jù)源(如HDFS)構(gòu)建RDDval
conf
=
new
SparkConf()val
sc:
SparkContext
=
new
SparkContext(conf)val
z=
sc.textFile("/user/allen/in/note3.txt",4)從內(nèi)存數(shù)據(jù)源構(gòu)建RDDval
conf
=
new
SparkConf()val
sc:
SparkContext
=
new
SparkContext(conf)val
z
=
sc.parallelize(List("aa","bb","cc","dd","ee","ff","gg","hh","ii","kk"),4)并行化證明RDD、調(diào)試RDDval
z
=
sc.parallelize(List(3,2,1,6,5,4,3,9,7),
3)def
myfunc(index:
Int,
iter:
Iterator[(Int)])
:
Iterator[String]
=
{iter.toList.map(x
=>
"[partID:"
+ index+
",
val:
"
+
x
+
"]").iterator}z.mapPartitionsWithIndex(myfunc).collect.foreach(println)z.aggregate(4)((x1,y1)=>{println(x1+",,"+y1);math.max(x1,
y1)},(x2,y2)=>{println(x2+"::"+y2);
x2
+
y2})z.aggregate(4)(math.max(_,
_),_
+
_)cmaster0:8080首先,對于第一個函數(shù),其處理過程如下?;鶞手担?(圖9-41)第一個函數(shù):math.max(_,_)(圖9-41)輸入數(shù)據(jù):Partition0:(3,2,1)、Partition1:(6,5,4)、Partition2:(3,9,7)三個分區(qū)(圖9-41)Partition0:max(4,3)=4,max(4,2)=4,max(4,1)=4,故Partition0結(jié)果為4(圖9-46)Partition1:max(4,6)=6,max(6,5)=6,max(6,4)=6,故Partition1結(jié)果為6(圖9-43)Partition2:max(4,3)=5,max(5,9)=6,max(6,7)=7,故Partition2結(jié)果為9(圖9-45)接著,對于第二個函數(shù),其處理過程如下?;鶞手担?(圖9-41)第二個函數(shù):_+_輸入數(shù)據(jù):Partition0:4,Partition1:6,Partition2:9計算公式:基準值+Partition0值+Partition1值+Partition2值(注,三個Partition值先后順序可顛倒)計算過程:4+4+6+9=23(注后面三個4,6,9先后順序可顛倒)執(zhí)行過程評價z.aggregate(4)((x1,y1)=>{println(x1+",,"+y1);ma
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 醫(yī)療器械廣告服務(wù)合同范本
- 變更經(jīng)營人合同范本
- 原址回遷合同范本
- 古玩拍賣合同范本
- 健身房代賣健身卡合同范本
- 醫(yī)用眼罩采購合同范本
- 醫(yī)療員工合同范本
- 單位購買門合同范本
- 農(nóng)村樓房分租合同范本
- 出售個人土地合同范本
- 航天集團人才隊伍建設(shè)經(jīng)驗介紹
- 牙周炎-侵襲性牙周炎
- 心理委員工作記錄表
- 新教科版五下科學(xué)1-5《當環(huán)境改變了》公開課課件
- 教師的十大轉(zhuǎn)變課件
- 焦化廠生產(chǎn)工序及工藝流程圖
- 可下載打印的公司章程
- 中藥熏洗法課件
- 本特利探頭應(yīng)用
- QMR-110-00員工手部、接觸面等微生物檢驗記錄記錄
- 外陰及陰道炎癥
評論
0/150
提交評論