實戰(zhàn)hadoop2配套未美化版9spark_第1頁
實戰(zhàn)hadoop2配套未美化版9spark_第2頁
實戰(zhàn)hadoop2配套未美化版9spark_第3頁
實戰(zhàn)hadoop2配套未美化版9spark_第4頁
實戰(zhàn)hadoop2配套未美化版9spark_第5頁
已閱讀5頁,還剩111頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論