版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
大數(shù)據(jù)簡(jiǎn)介與相關(guān)技術(shù)目錄/Contents01大數(shù)據(jù)簡(jiǎn)介02大數(shù)據(jù)相關(guān)技術(shù)大數(shù)據(jù)簡(jiǎn)介01大數(shù)據(jù)簡(jiǎn)介大數(shù)據(jù)(bigdata),或稱巨量資料,指的是所涉及的資料量規(guī)模巨大到無(wú)法透過(guò)目前主流軟件工具,在合理時(shí)間內(nèi)達(dá)到獲取、管理、處理、并整理成為幫助企業(yè)經(jīng)營(yíng)決策更積極目的的資訊。在維克托·邁爾-舍恩伯格及肯尼斯·庫(kù)克耶編寫的《大數(shù)據(jù)時(shí)代》中大數(shù)據(jù)指不用隨機(jī)分析法(抽樣調(diào)查)這樣捷徑,而采用所有數(shù)據(jù)進(jìn)行分析處理。大數(shù)據(jù)的5V特點(diǎn)(IBM提出):Volume(大量)、Velocity(高速)、Variety(多樣)、Value(低價(jià)值密度)、Veracity(真實(shí)性)。大數(shù)據(jù)簡(jiǎn)介Volume(大量):數(shù)據(jù)量大,截至目前,人類生產(chǎn)的所有印刷材料的數(shù)據(jù)量是200PB,而歷史上全人類總共說(shuō)過(guò)的話的數(shù)據(jù)量大約是5EB。Variety(多樣):種類和來(lái)源多樣化。這種類型的多樣性也讓數(shù)據(jù)被分為結(jié)構(gòu)化數(shù)據(jù)和非結(jié)構(gòu)化數(shù)據(jù)。Value(低價(jià)值密度):價(jià)值密度的高低與數(shù)據(jù)總量的大小成反比。Velocity(高速):數(shù)據(jù)增長(zhǎng)速度快,處理速度也快,時(shí)效性要求高。這是大數(shù)據(jù)區(qū)分于傳統(tǒng)數(shù)據(jù)挖掘的最顯著特征。Veracity:信數(shù)據(jù)的準(zhǔn)確性和可信賴度,即數(shù)據(jù)的質(zhì)量。大數(shù)據(jù)相關(guān)技術(shù)02大數(shù)據(jù)相關(guān)技術(shù)大數(shù)據(jù)技術(shù)的體系龐大且復(fù)雜,基礎(chǔ)的技術(shù)包含數(shù)據(jù)的采集、數(shù)據(jù)預(yù)處理、分布式存儲(chǔ)、NoSQL數(shù)據(jù)庫(kù)、數(shù)據(jù)倉(cāng)庫(kù)、機(jī)器學(xué)習(xí)、并行計(jì)算、可視化等各種技術(shù)范疇和不同的技術(shù)層面。首先科學(xué)的給出一個(gè)通用化的大數(shù)據(jù)處理技術(shù)框架,主要分為下面幾個(gè)方面:數(shù)據(jù)采集與預(yù)處理、數(shù)據(jù)存儲(chǔ)、數(shù)據(jù)清洗、數(shù)據(jù)查詢分析和數(shù)據(jù)可視化。大數(shù)據(jù)相關(guān)技術(shù)數(shù)據(jù)采集與預(yù)處理對(duì)于各種來(lái)源的數(shù)據(jù)包括移動(dòng)互聯(lián)網(wǎng)數(shù)據(jù)、社交網(wǎng)絡(luò)的數(shù)據(jù)等,這些結(jié)構(gòu)化和非結(jié)構(gòu)化的海量數(shù)據(jù)是零散的,也就是所謂的數(shù)據(jù)孤島,此時(shí)的這些數(shù)據(jù)并沒(méi)有什么意義,數(shù)據(jù)采集就是將這些數(shù)據(jù)寫入數(shù)據(jù)倉(cāng)庫(kù)中,把零散的數(shù)據(jù)整合在一起,對(duì)這些數(shù)據(jù)綜合起來(lái)進(jìn)行分析。數(shù)據(jù)采集包括文件日志的采集、數(shù)據(jù)庫(kù)日志的采集、關(guān)系型數(shù)據(jù)庫(kù)的接入和應(yīng)用程序的接入等。在數(shù)據(jù)量比較小的時(shí)候,可以寫個(gè)定時(shí)的腳本將日志寫入存儲(chǔ)系統(tǒng),但隨著數(shù)據(jù)量的增長(zhǎng),這些方法無(wú)法提供數(shù)據(jù)安全保障,并且運(yùn)維困難,需要更強(qiáng)壯的解決方案。大數(shù)據(jù)相關(guān)技術(shù)數(shù)據(jù)存儲(chǔ)Hadoop作為一個(gè)開源的框架,專為離線和大規(guī)模數(shù)據(jù)分析而設(shè)計(jì),HDFS作為其核心的存儲(chǔ)引擎,已被廣泛用于數(shù)據(jù)存儲(chǔ)。數(shù)據(jù)清洗MapReduce作為Hadoop的查詢引擎,用于大規(guī)模數(shù)據(jù)集的并行計(jì)算,”Map(映射)”和”Reduce(歸約)”,是它的主要思想。它極大的方便了編程人員在不會(huì)分布式并行編程的情況下,將自己的程序運(yùn)行在分布式系統(tǒng)中。大數(shù)據(jù)相關(guān)技術(shù)數(shù)據(jù)查詢分析Hive的核心工作就是把SQL語(yǔ)句翻譯成MR程序,可以將結(jié)構(gòu)化的數(shù)據(jù)映射為一張數(shù)據(jù)庫(kù)表,并提供HQL(HiveSQL)查詢功能。Impala是對(duì)Hive的一個(gè)補(bǔ)充,可以實(shí)現(xiàn)高效的SQL查詢。使用Impala來(lái)實(shí)現(xiàn)SQLonHadoop,用來(lái)進(jìn)行大數(shù)據(jù)實(shí)時(shí)查詢分析。Spark擁有HadoopMapReduce所具有的特點(diǎn),它將Job中間輸出結(jié)果保存在內(nèi)存中,從而不需要讀取HDFS。Nutch是一個(gè)開源Java實(shí)現(xiàn)的搜索引擎。它提供了我們運(yùn)行自己的搜索引擎所需的全部工具,包括全文搜索和Web爬蟲。Solr用Java編寫、運(yùn)行在Servlet容器(如ApacheTomcat或Jetty)的一個(gè)獨(dú)立的企業(yè)級(jí)搜索應(yīng)用的全文搜索服務(wù)器。Elasticsearch是一個(gè)開源的全文搜索引擎,基于Lucene的搜索服務(wù)器,可以快速的儲(chǔ)存、搜索和分析海量的數(shù)據(jù)。大數(shù)據(jù)相關(guān)技術(shù)數(shù)據(jù)可視化對(duì)接一些BI平臺(tái),將分析得到的數(shù)據(jù)進(jìn)行可視化,用于指導(dǎo)決策服務(wù)。主流的BI平臺(tái)比如,國(guó)外的敏捷BITableau、Qlikview、PowrerBI等,國(guó)內(nèi)的SmallBI和新興的有數(shù)BI等。控制權(quán)限的ranger是一個(gè)Hadoop集群權(quán)限框架,提供操作、監(jiān)控、管理復(fù)雜的數(shù)據(jù)權(quán)限,它提供一個(gè)集中的管理機(jī)制,管理基于yarn的Hadoop生態(tài)圈的所有數(shù)據(jù)權(quán)限??梢詫?duì)Hadoop生態(tài)的組件如Hive,Hbase進(jìn)行細(xì)粒度的數(shù)據(jù)訪問(wèn)控制。通過(guò)操作Ranger控制臺(tái),管理員可以輕松的通過(guò)配置策略來(lái)控制用戶訪問(wèn)HDFS文件夾、HDFS文件、數(shù)據(jù)庫(kù)、表、字段權(quán)限。這些策略可以為不同的用戶和組來(lái)設(shè)置,同時(shí)權(quán)限可與hadoop無(wú)縫對(duì)接。感謝大家的聆聽Spark簡(jiǎn)介目錄/Contents01Spark特性02Spark的歷史與發(fā)展01Spark組件Spark特性01Spark特性運(yùn)行速度快面向磁盤的MapReduce受限于磁盤讀/寫性能和網(wǎng)絡(luò)I/O性能的約束,在處理迭代計(jì)算、實(shí)時(shí)計(jì)算、交互式數(shù)據(jù)查詢等方面并不高效,但是這些卻在圖計(jì)算、數(shù)據(jù)挖掘和機(jī)器學(xué)習(xí)等相關(guān)應(yīng)用領(lǐng)域中非常常見。針對(duì)這一不足,將數(shù)據(jù)存儲(chǔ)在內(nèi)存中并基于內(nèi)存進(jìn)行計(jì)算是一個(gè)有效的解決途徑。易用性Spark不僅計(jì)算性能突出,在易用性方面也是其他同類產(chǎn)品難以比擬的。一方面,Spark提供了支持多種語(yǔ)言的API,如Scala、Java、Python、R等,使得用戶開發(fā)Spark程序十分方便。另一方面,Spark是基于Scala語(yǔ)言開發(fā)的,由于Scala是一種面向?qū)ο蟮摹⒑瘮?shù)式的靜態(tài)編程語(yǔ)言,其強(qiáng)大的類型推斷、模式匹配、隱式轉(zhuǎn)換等一系列功能結(jié)合豐富的描述能力使得Spark應(yīng)用程序代碼非常簡(jiǎn)潔。Spark的易用性還體現(xiàn)在其針對(duì)數(shù)據(jù)處理提供了豐富的操作。Spark特性通用性相對(duì)于第一代的大數(shù)據(jù)生態(tài)系統(tǒng)Hadoop中的MapReduce,Spark無(wú)論是在性能還是在方案的統(tǒng)一性方面,都有著極大的優(yōu)勢(shì)。Spark框架包含了多個(gè)緊密集成的組件,如圖1-5所示。位于底層的是SparkCore,其實(shí)現(xiàn)了Spark的作業(yè)調(diào)度、內(nèi)存管理、容錯(cuò)、與存儲(chǔ)系統(tǒng)交互等基本功能,并針對(duì)彈性分布式數(shù)據(jù)集提供了豐富的操作。在SparkCore的基礎(chǔ)上,Spark提供了一系列面向不同應(yīng)用需求的組件,主要有SparkSQL、SparkStreaming、MLlib、GraphX。支持多種資源管理器Spark不僅計(jì)算性能突出,在易用性方面也是其他同類產(chǎn)品難以比擬的。一方面,Spark提供了支持多種語(yǔ)言的API,如Scala、Java、Python、R等,使得用戶開發(fā)Spark程序十分方便。另一方面,Spark是基于Scala語(yǔ)言開發(fā)的,由于Scala是一種面向?qū)ο蟮?、函?shù)式的靜態(tài)編程語(yǔ)言,其強(qiáng)大的類型推斷、模式匹配、隱式轉(zhuǎn)換等一系列功能結(jié)合豐富的描述能力使得Spark應(yīng)用程序代碼非常簡(jiǎn)潔。Spark的易用性還體現(xiàn)在其針對(duì)數(shù)據(jù)處理提供了豐富的操作。Spark的歷史與發(fā)展02Spark的歷史與發(fā)展Spark發(fā)展歷程:Spark在2009年由MateiZaharia在加州大學(xué)柏克萊分校AMPLab開創(chuàng)2010年通過(guò)BSD許可協(xié)議開源發(fā)布。2013年6月,該項(xiàng)目被捐贈(zèng)給Apache軟件基金會(huì)并切換許可協(xié)議至Apache2.0。2014年2月,Spark成為Apache的頂級(jí)項(xiàng)目。2014年11月,Databricks團(tuán)隊(duì)使用Spark刷新數(shù)據(jù)排序世界記錄。2014年5月底Spark1.0.0發(fā)布。2014年9月Spark1.1.0發(fā)布2014年12月Spark1.2.0發(fā)布...2016年1月4號(hào)Spark1.6.0發(fā)布...2016年6月26號(hào)Spark2.0發(fā)布...時(shí)至今日的2.2.0版本Spark組件03Spark組件相對(duì)于第一代的大數(shù)據(jù)生態(tài)系統(tǒng)Hadoop中的MapReduce,Spark無(wú)論是在性能還是在方案的統(tǒng)一性方面,都有著極大的優(yōu)勢(shì)。Spark框架包含了多個(gè)緊密集成的組件,如圖1-6所示。位于底層的是SparkCore,其實(shí)現(xiàn)了Spark的作業(yè)調(diào)度、內(nèi)存管理、容錯(cuò)、與存儲(chǔ)系統(tǒng)交互等基本功能,并針對(duì)彈性分布式數(shù)據(jù)集提供了豐富的操作。在SparkCore的基礎(chǔ)上,Spark提供了一系列面向不同應(yīng)用需求的組件,主要有SparkSQL、SparkStreaming、MLlib、GraphX。Spark軟件棧Spark組件SparkSQLSparkSQL是Spark用來(lái)操作結(jié)構(gòu)化數(shù)據(jù)的組件。通過(guò)SparkSQL,用戶可以使用SQL或者ApacheHive版本的SQL方言(HQL)來(lái)查詢數(shù)據(jù)。SparkSQL支持多種數(shù)據(jù)源類型,例如Hive表、Parquet以及JSON等。SparkSQL不僅為Spark提供了一個(gè)SQL接口,還支持開發(fā)者將SQL語(yǔ)句融入到Spark應(yīng)用程序開發(fā)過(guò)程中,無(wú)論是使用Python、Java還是Scala,用戶可以在單個(gè)的應(yīng)用中同時(shí)進(jìn)行SQL查詢和復(fù)雜的數(shù)據(jù)分析。由于能夠與Spark所提供的豐富的計(jì)算環(huán)境緊密結(jié)合,SparkSQL得以從其他開源數(shù)據(jù)倉(cāng)庫(kù)工具中脫穎而出。SparkSQL在Sparkl.0中被首次引入。在SparkSQL之前,美國(guó)加州大學(xué)伯克利分校曾經(jīng)嘗試修改ApacheHive以使其運(yùn)行在Spark上,進(jìn)而提出了組件Shark。然而隨著SparkSQL的提出與發(fā)展,其與Spark引擎和API結(jié)合得更加緊密,使得Shark已經(jīng)被SparkSQL所取代。Spark組件SparkStreaming眾多應(yīng)用領(lǐng)域?qū)?shí)時(shí)數(shù)據(jù)的流式計(jì)算有著強(qiáng)烈的需求,例如網(wǎng)絡(luò)環(huán)境中的網(wǎng)頁(yè)服務(wù)器日志或是由用戶提交的狀態(tài)更新組成的消息隊(duì)列等,這些都是實(shí)時(shí)數(shù)據(jù)流。SparkStreaming是Spark平臺(tái)上針對(duì)實(shí)時(shí)數(shù)據(jù)進(jìn)行流式計(jì)算的組件,提供了豐富的處理數(shù)據(jù)流的API。由于這些API與SparkCore中的基本操作相對(duì)應(yīng),因此開發(fā)者在熟知Spark核心概念與編程方法之后,編寫SparkStreaming應(yīng)用程序會(huì)更加得心應(yīng)手。從底層設(shè)計(jì)來(lái)看,SparkStreaming支持與SparkCore同級(jí)別的容錯(cuò)性、吞吐量以及可伸縮性。Spark組件MLlibMLlib是Spark提供的一個(gè)機(jī)器學(xué)習(xí)算法庫(kù),其中包含了多種經(jīng)典、常見的機(jī)器學(xué)習(xí)算法,主要有分類、回歸、聚類、協(xié)同過(guò)濾等。MLlib不僅提供了模型評(píng)估、數(shù)據(jù)導(dǎo)入等額外的功能,還提供了一些更底層的機(jī)器學(xué)習(xí)原語(yǔ),包括一個(gè)通用的梯度下降優(yōu)化基礎(chǔ)算法。所有這些方法都被設(shè)計(jì)為可以在集群上輕松伸縮的架構(gòu)。Spark組件GraphXGraphX是Spark面向圖計(jì)算提供的框架與算法庫(kù)。GraphX中提出了彈性分布式屬性圖的概念,并在此基礎(chǔ)上實(shí)現(xiàn)了圖視圖與表視圖的有機(jī)結(jié)合與統(tǒng)一;同時(shí)針對(duì)圖數(shù)據(jù)處理提供了豐富的操作,例如取子圖操作subgraph、頂點(diǎn)屬性操作mapVertices、邊屬性操作mapEdges等。GraphX還實(shí)現(xiàn)了與Pregel的結(jié)合,可以直接使用一些常用圖算法,如PageRank、三角形計(jì)數(shù)等。感謝大家的聆聽其他數(shù)據(jù)處理框架目錄/Contents01Hadoop02Storm03Flink04BeamHadoop01HadoopHadoop是一個(gè)由Apache基金會(huì)所開發(fā)的分布式系統(tǒng)基礎(chǔ)架構(gòu),是一個(gè)存儲(chǔ)系統(tǒng)+計(jì)算框架的軟件框架。主要解決海量數(shù)據(jù)存儲(chǔ)與計(jì)算的問(wèn)題,是大數(shù)據(jù)技術(shù)中的基石。Hadoop以一種可靠、高效、可伸縮的方式進(jìn)行數(shù)據(jù)處理,用戶可以在不了解分布式底層細(xì)節(jié)的情況下,開發(fā)分布式程序,用戶可以輕松地在Hadoop上開發(fā)和運(yùn)行處理海量數(shù)據(jù)的應(yīng)用程序。Hadoop的核心是HDFS和MapReduce、YARN。HadoopDHDFS是一個(gè)高度容錯(cuò)性的系統(tǒng),能檢測(cè)和應(yīng)對(duì)硬件故障,適合部署在廉價(jià)的機(jī)器上HDFS采用master/slave架構(gòu)。一個(gè)HDFS集群是由一個(gè)Namenode和一定數(shù)目的Datanodes組成。EMapReduce是一個(gè)基于java的并行分布式計(jì)算框架,使用它來(lái)編寫的數(shù)據(jù)處理應(yīng)用可以運(yùn)行在大型的商用硬件集群上來(lái)處理大型數(shù)據(jù)集中的可并行化問(wèn)題,數(shù)據(jù)處理可以發(fā)生在存儲(chǔ)在文件系統(tǒng)(非結(jié)構(gòu)化)或數(shù)據(jù)庫(kù)(結(jié)構(gòu)化)中的數(shù)據(jù)上。FApacheHadoopYARN是開源Hadoop分布式處理框架中的資源管理和作業(yè)調(diào)度技術(shù)。作為ApacheHadoop的核心組件之一,YARN負(fù)責(zé)將系統(tǒng)資源分配給在Hadoop集群中運(yùn)行的各種應(yīng)用程序,并調(diào)度要在不同集群節(jié)點(diǎn)上執(zhí)行的任務(wù)。(1)HDFS(2)
MapReduce(3)
YARNStorm02Storm簡(jiǎn)單的編程模型:類似于MapReduce降低了并行批處理復(fù)雜性,Storm降低了實(shí)時(shí)處理的復(fù)雜性,只需實(shí)現(xiàn)幾個(gè)接口即可(Spout實(shí)現(xiàn)ISpout接口,Bolt實(shí)現(xiàn)IBolt接口)。支持多種語(yǔ)言:你可以在Storm之上使用各種編程語(yǔ)言。默認(rèn)支持Clojure、Java、Ruby和Python。要增加對(duì)其他語(yǔ)言的支持,只需實(shí)現(xiàn)一個(gè)簡(jiǎn)單的Storm通信協(xié)議即可。容錯(cuò)性:nimbus、supervisor都是無(wú)狀態(tài)的,可以用kill-9來(lái)殺死Nimbus和Supervisor進(jìn)程,然后再重啟它們,任務(wù)照常進(jìn)行;當(dāng)worker失敗后,supervisor會(huì)嘗試在本機(jī)重啟它。分布式:計(jì)算是在多個(gè)線程、進(jìn)程和服務(wù)器之間并行進(jìn)行的。持久性、可靠性:消息被持久化到本地磁盤,并且支持?jǐn)?shù)據(jù)備份防止數(shù)據(jù)丟失。可靠的消息處理:Storm保證每個(gè)消息至少能得到一次完整處理。任務(wù)失敗時(shí),它會(huì)負(fù)責(zé)從消息源重試消息(ack機(jī)制)??焖?、實(shí)時(shí):Storm保證每個(gè)消息能能得到快速的處理。StormStorm的核心組件Nimbus:即Storm的Master,負(fù)責(zé)資源分配和任務(wù)調(diào)度。一個(gè)Storm集群只有一個(gè)Nimbus。Supervisor:即Storm的Slave,負(fù)責(zé)接收Nimbus分配的任務(wù),管理所有Worker,一個(gè)Supervisor節(jié)點(diǎn)中包含多個(gè)Worker進(jìn)程。Worker:工作進(jìn)程,每個(gè)工作進(jìn)程中都有多個(gè)Task。Task:任務(wù),在Storm集群中每個(gè)Spout和Bolt都由若干個(gè)任務(wù)(tasks)來(lái)執(zhí)行。每個(gè)任務(wù)都與一個(gè)執(zhí)行線程相對(duì)應(yīng)。Topology:計(jì)算拓?fù)?,Storm的拓?fù)涫菍?duì)實(shí)時(shí)計(jì)算應(yīng)用邏輯的封裝,它的作用與MapReduce的任務(wù)(Job)很相似,區(qū)別在于MapReduce的一個(gè)Job在得到結(jié)果之后總會(huì)結(jié)束,而拓?fù)鋾?huì)一直在集群中運(yùn)行,直到你手動(dòng)去終止它。Stream:數(shù)據(jù)流(Streams)是Storm中最核心的抽象概念。一個(gè)數(shù)據(jù)流指的是在分布式環(huán)境中并行創(chuàng)建、處理的一組元組(tuple)的無(wú)界序列。StormStorm的核心組件Spout:數(shù)據(jù)源(Spout)是拓?fù)渲袛?shù)據(jù)流的來(lái)源。一般Spout會(huì)從一個(gè)外部的數(shù)據(jù)源讀取元組然后將他們發(fā)送到拓?fù)渲?。Bolt:拓?fù)渲兴械臄?shù)據(jù)處理均是由Bolt完成的。通過(guò)數(shù)據(jù)過(guò)濾(filtering)、函數(shù)處理(functions)、聚合(aggregations)、聯(lián)結(jié)(joins)、數(shù)據(jù)庫(kù)交互等功能,Bolt幾乎能夠完成任何一種數(shù)據(jù)處理需求。Streamgrouping:為拓?fù)渲械拿總€(gè)Bolt的確定輸入數(shù)據(jù)流是定義一個(gè)拓?fù)涞闹匾h(huán)節(jié)。數(shù)據(jù)流分組定義了在Bolt的不同任務(wù)(tasks)中劃分?jǐn)?shù)據(jù)流的方式。在Storm中有八種內(nèi)置的數(shù)據(jù)流分組方式。Reliability:可靠性。Storm可以通過(guò)拓?fù)鋪?lái)確保每個(gè)發(fā)送的元組都能得到正確處理。通過(guò)跟蹤由Spout發(fā)出的每個(gè)元組構(gòu)成的元組樹可以確定元組是否已經(jīng)完成處理。Flink03Flink1.處理無(wú)界和有界數(shù)據(jù)任何類型的數(shù)據(jù)都是作為事件流產(chǎn)生的。信用卡交易,傳感器測(cè)量,機(jī)器日志或網(wǎng)站或移動(dòng)應(yīng)用程序上的用戶交互,所有這些數(shù)據(jù)都作為流生成。2.隨處部署應(yīng)用程序ApacheFlink是一個(gè)分布式系統(tǒng),需要計(jì)算資源才能執(zhí)行應(yīng)用程序。Flink與所有常見的集群資源管理器(如HadoopYARN,ApacheMesos和Kubernetes)集成,但也可以設(shè)置為作為獨(dú)立群集運(yùn)行。3.運(yùn)行任意規(guī)模應(yīng)用Flink旨在任意規(guī)模上運(yùn)行有狀態(tài)流式應(yīng)用。因此,應(yīng)用程序被并行化為可能數(shù)千個(gè)任務(wù),這些任務(wù)分布在集群中并發(fā)執(zhí)行。所以應(yīng)用程序能夠充分利用無(wú)盡的CPU、內(nèi)存、磁盤和網(wǎng)絡(luò)IO。4.利用內(nèi)存性能有狀態(tài)的Flink程序針對(duì)本地狀態(tài)訪問(wèn)進(jìn)行了優(yōu)化。任務(wù)的狀態(tài)始終保留在內(nèi)存中,如果狀態(tài)大小超過(guò)可用內(nèi)存,則會(huì)保存在能高效訪問(wèn)的磁盤數(shù)據(jù)結(jié)構(gòu)中。5.Flink組件棧運(yùn)行時(shí)層以JobGraph形式接收程序。JobGraph即為一個(gè)一般化的并行數(shù)據(jù)流圖(dataflow),它擁有任意數(shù)量的Task來(lái)接收和產(chǎn)生datastream。Beam04Beam1.ApacheBeamSDKBeamSDK提供了一個(gè)統(tǒng)一的編程模型,該模型可以表示和轉(zhuǎn)換任何大小的數(shù)據(jù)集,無(wú)論輸入是來(lái)自批處理數(shù)據(jù)源的有限數(shù)據(jù)集,還是來(lái)自流數(shù)據(jù)源的無(wú)限數(shù)據(jù)集。BeamSDK使用相同的類來(lái)表示有界和無(wú)界數(shù)據(jù),并且使用相同的轉(zhuǎn)換對(duì)這些數(shù)據(jù)進(jìn)行操作。您可以使用選擇的BeamSDK來(lái)構(gòu)建定義數(shù)據(jù)處理管道的程序。Beam當(dāng)前支持以下特定于語(yǔ)言的SDK:①Java②Python③Go2.ApacheBeamPipelineRunnersBeamPipeline運(yùn)行器將您使用Beam程序定義的數(shù)據(jù)處理管道轉(zhuǎn)換為與您選擇的分布式處理后端兼容的API。運(yùn)行Beam程序時(shí),需要為要在其中執(zhí)行管道的后端指定適當(dāng)?shù)倪\(yùn)行程序。Beam當(dāng)前支持與以下分布式處理后端一起使用的Runner:ApacheApexApacheFlinkApacheGearpump(incubating)ApacheSamzaApacheSparkGoogleCloudDataflow HazelcastJet感謝大家的聆聽集群環(huán)境準(zhǔn)備目錄/Contents01系統(tǒng)環(huán)境配置02JDK安裝03Hadoop集群部署04ZooKeeper集群部署05Scala安裝系統(tǒng)環(huán)境配置01系統(tǒng)環(huán)境配置1.安裝linux系統(tǒng):Centos關(guān)于系統(tǒng)的安裝這里不做詳細(xì)的介紹,本次安裝的系統(tǒng)為centos7,可以在阿里鏡像鏡像網(wǎng)站(/centos/7/isos/x86_64/)或者官網(wǎng)(/download/)下載鏡像。使用的軟件:VMwareWorkstation系統(tǒng)安裝要求:無(wú)桌面版最小化安裝網(wǎng)絡(luò)連接方式:NAT內(nèi)存2G及以上磁盤大小30G及以上CPU1核以上2.網(wǎng)絡(luò)環(huán)境配置在系統(tǒng)安裝完成后需要配置虛擬機(jī)的網(wǎng)卡信息。(1)NAT信息查看①打開VMware②找到菜單欄中的“編輯”,選擇“虛擬網(wǎng)絡(luò)編輯器”③選擇VMnet8,NAT設(shè)置(2)打開虛擬機(jī)命令行界面,修改網(wǎng)卡信息系統(tǒng)環(huán)境配置3.配置防火墻CentOS7默認(rèn)使用的是firewall作為防火墻。firewall操作:#servicefirewalldstatus;#查看防火墻狀態(tài)(disabled表明已經(jīng)禁止開啟啟動(dòng)enable表示開機(jī)自啟,inactive表示防火墻關(guān)閉狀態(tài)activated(running)表示為開啟狀態(tài))4.主機(jī)名修改vi與vimvi編輯器是所有Unix及Linux系統(tǒng)下標(biāo)準(zhǔn)的編輯器,他就相當(dāng)于windows系統(tǒng)中的記事本一樣,它的強(qiáng)大不遜色于任何最新的文本編輯器。他是我們使用Linux系統(tǒng)不能缺少的工具。由于對(duì)Unix及Linux系統(tǒng)的任何版本,vi編輯器是完全相同的,學(xué)會(huì)它后,你將在Linux的世界里暢行無(wú)阻。vim具有程序編輯的能力,可以以字體顏色辨別語(yǔ)法的正確性,方便程序設(shè)計(jì),因?yàn)槌绦蚝?jiǎn)單,編輯速度相當(dāng)快速。JDK安裝02JDK安裝1.面向?qū)ο缶幊陶Z(yǔ)言——JavaJava是一門面向?qū)ο缶幊陶Z(yǔ)言,不僅吸收了C++語(yǔ)言的各種優(yōu)點(diǎn),還摒棄了C++里難以理解的多繼承、指針等概念,因此Java語(yǔ)言具有功能強(qiáng)大和簡(jiǎn)單易用兩個(gè)特征。Java語(yǔ)言作為靜態(tài)面向?qū)ο缶幊陶Z(yǔ)言的代表,極好地實(shí)現(xiàn)了面向?qū)ο罄碚摚奖愠绦騿T以面向?qū)ο蟮乃季S方式進(jìn)行復(fù)雜的編程。Java具有簡(jiǎn)單性、面向?qū)ο?、分布式、健壯性、安全性、平臺(tái)獨(dú)立與可移植性、多線程、動(dòng)態(tài)性等特點(diǎn)。Java可以編寫桌面應(yīng)用程序、Web應(yīng)用程序、分布式系統(tǒng)和嵌入式系統(tǒng)應(yīng)用程序等。Storm2.JDKJDK(JavaDevelopmentKit)是Java語(yǔ)言的軟件開發(fā)工具包,主要用于移動(dòng)設(shè)備、嵌入式設(shè)備上的Java應(yīng)用程序。JDK是整個(gè)Java開發(fā)的核心,它包含了Java的運(yùn)行環(huán)境(JVM+Java系統(tǒng)類庫(kù))和Java工具。JDK包含的基本組件包括:javac:編譯器,將源程序轉(zhuǎn)成字節(jié)碼。jar:打包工具,將相關(guān)的類文件打包成一個(gè)文件。javadoc:文檔生成器,從源碼注釋中提取文檔。jdb:debugger,查錯(cuò)工具。java:運(yùn)行編譯后的Java程序(.class后綴的)。appletviewer:小程序?yàn)g覽器,一種執(zhí)行HTML文件上的Java小程序的Java瀏覽器。Javah:產(chǎn)生可以調(diào)用Java過(guò)程的C過(guò)程,或建立能被Java程序調(diào)用的C過(guò)程的頭文件。Javap:Java反匯編器,顯示編譯類文件中的可訪問(wèn)功能和數(shù)據(jù),同時(shí)顯示字節(jié)代碼含義。Jconsole:Java進(jìn)行系統(tǒng)調(diào)試和監(jiān)控的工具。JDK安裝3.JREJRE(JavaRuntimeEnvironment)Java運(yùn)行環(huán)境,包括兩部分:JavaRuntimeEnvironment和JavaPlug-in。JRE是可以在其上運(yùn)行、測(cè)試和傳輸應(yīng)用程序的Java平臺(tái)。它包括JVM(Java虛擬機(jī))、Java核心類庫(kù)和支持文件。它不包含開發(fā)工具(JDK)——編譯器、調(diào)試器和其它工具。JRE需要輔助軟件(JavaPlug-in)以便在瀏覽器中運(yùn)行applet。JRE可以支撐Java程序的運(yùn)行,包括JVM虛擬機(jī)(java.exe等)和基本的類庫(kù)(rt.jar等),JDK可以支持Java程序的開發(fā),包括編譯器(javac.exe)、開發(fā)工具(javadoc.exe、jar.exe、keytool.exe、jconsole.exe)和更多的類庫(kù)(如tools.jar)等。Storm4.JDK安裝Hadoop采用的開發(fā)語(yǔ)言是Java,所以搭建Hadoop集群的前提是先安裝JDK。本書選擇的JDK版本是Oracle官方的JDK8,這里使用的是tar.gz安裝包(/technetwork/java/javase/downloads/java-archive-javase8-2177648.html)Hadoop集群部署03Hadoop集群部署Hadoop集群部署1.基礎(chǔ)環(huán)境配置搭建Hadoop集群需要配置以下信息:①配置虛擬機(jī)網(wǎng)絡(luò)(NAT聯(lián)網(wǎng)方式)②網(wǎng)卡信息修改③主機(jī)名修改④主機(jī)名與IP映射⑤關(guān)閉防火墻⑥ssh免密登錄⑦JDK安裝⑧同步集群時(shí)間根據(jù)1.1.1與1.1.2節(jié)中的內(nèi)容完成①②③⑤⑦這五個(gè)操作,在配置完成后開始主機(jī)名與IP映射、ssh免密登錄、同步集群時(shí)間的操作。ZooKeeper集群部署04ZooKeeper集群部署ZooKeeper是一個(gè)分布式的,開放源碼的分布式應(yīng)用程序協(xié)調(diào)服務(wù),是Google的Chubby一個(gè)開源的實(shí)現(xiàn),是Hadoop和Hbase的重要組件。它是一個(gè)為分布式應(yīng)用提供一致性服務(wù)的軟件,提供的功能包括:配置維護(hù)、域名服務(wù)、分布式同步、組服務(wù)等。Flink(1)安裝包下載(2)配置zoo.cfg文件(3)myid文件(4)環(huán)境變量配置(5)安裝包分發(fā)(6)啟動(dòng)集群(7)驗(yàn)證Scala安裝05Scala安裝spark是處理大數(shù)據(jù)的開源框架,底層是使用scala腳本語(yǔ)言開發(fā),對(duì)scala支持最好,同時(shí)支持java、python、r語(yǔ)言等。scala是一種綜合了面向?qū)ο蠛秃瘮?shù)式編程概念的靜態(tài)類型的多范式編程語(yǔ)言。Scala運(yùn)行于Java平臺(tái)(Java虛擬機(jī)),并兼容現(xiàn)有的Java程序。本節(jié)主要講解Linux中Scala的安裝與配置。Flink(1)安裝包下載解壓(2)環(huán)境變量配置(3)安裝文件分發(fā)(4)驗(yàn)證感謝大家的聆聽Spark環(huán)境搭建目錄/Contents01
Standalone模式部署02JDK安裝03Hadoop集群部署04
ZooKeeper集群部署05Scala安裝
Standalone模式部署01
Standalone模式部署即獨(dú)立模式,自帶完整的服務(wù),可單獨(dú)部署到一個(gè)集群中,無(wú)需依賴任何其他資源管理系統(tǒng)。從一定程度上說(shuō),該模式是其他兩種的基礎(chǔ)。借鑒Spark開發(fā)模式,我們可以得到一種開發(fā)新型計(jì)算框架的一般思路:先設(shè)計(jì)出它的standalone模式,為了快速開發(fā),起初不需要考慮服務(wù)(比如master/slave)的容錯(cuò)性,之后再開發(fā)相應(yīng)的wrapper,將stanlone模式下的服務(wù)原封不動(dòng)的部署到資源管理系統(tǒng)yarn或者mesos上,由資源管理系統(tǒng)負(fù)責(zé)服務(wù)本身的容錯(cuò)。目前Spark在standalone模式下是沒(méi)有任何單點(diǎn)故障問(wèn)題的,這是借助zookeeper實(shí)現(xiàn)的,思想類似于HBasemaster單點(diǎn)故障解決方案。將Sparkstandalone與MapReduce比較,會(huì)發(fā)現(xiàn)它們兩個(gè)在架構(gòu)上是完全一致的:
Standalone模式部署1.下載安裝spark2.配置spark在spark官網(wǎng)下載tar.gz安裝包,本節(jié)使用的是spark2.3.2。在下載安裝包時(shí)需要對(duì)應(yīng)好Hadoop的版本,本書使用的是Hadoop2.7.4安裝包解壓完成后需要進(jìn)行相關(guān)的配置,可以在一臺(tái)機(jī)器上配置好之后使用scp命令copy到其他機(jī)器上,在配置之前需要將四臺(tái)虛擬機(jī)關(guān)機(jī)后做一個(gè)快照,方便后面兩種模式的部署。SparkonYARN模式部署02SparkonYARN模式部署這是一種很有前景的部署模式。但限于YARN自身的發(fā)展,目前僅支持粗粒度模式(Coarse-grainedMode)。這是由于YARN上的Container資源是不可以動(dòng)態(tài)伸縮的,一旦Container啟動(dòng)之后,可使用的資源不能再發(fā)生變化,不過(guò)這個(gè)已經(jīng)在YARN計(jì)劃中了。sparkonyarn支持兩種模式:1)yarn-cluster:適用于生產(chǎn)環(huán)境;2)yarn-client:適用于交互、調(diào)試,希望立即看到app的輸出SparkonYARN模式部署安裝包下載解壓2.配置spark-env.sh3.重命名slaves.template文件4.配置slaves文件5.環(huán)境變量配置6.文件分發(fā)7.啟動(dòng)集群8.驗(yàn)證9.運(yùn)行實(shí)例10.任務(wù)監(jiān)控SparkHA集群部署03SparkHA集群部署SparkStandalone集群是Master-Slaves架構(gòu)的集群模式,和大部分的Master-Slaves結(jié)構(gòu)集群一樣,存在著Master單點(diǎn)故障的問(wèn)題。如何解決這個(gè)單點(diǎn)故障的問(wèn)題,Spark提供了兩種方案:(1)基于文件系統(tǒng)的單點(diǎn)恢復(fù)(Single-NodeRecoverywithLocalFileSystem)。主要用于開發(fā)或測(cè)試環(huán)境。當(dāng)spark提供目錄保存sparkApplication和worker的注冊(cè)信息,并將他們的恢復(fù)狀態(tài)寫入該目錄中,這時(shí),一旦Master發(fā)生故障,就可以通過(guò)重新啟動(dòng)Master進(jìn)程(sbin/start-master.sh),恢復(fù)已運(yùn)行的sparkApplication和worker的注冊(cè)信息。(2)基于zookeeper的StandbyMasters(StandbyMasterswithZooKeeper)。用于生產(chǎn)模式。其基本原理是通過(guò)zookeeper來(lái)選舉一個(gè)Master,其他的Master處于Standby狀態(tài)。將spark集群連接到同一個(gè)ZooKeeper實(shí)例并啟動(dòng)多個(gè)Master,利用zookeeper提供的選舉和狀態(tài)保存功能,可以使一個(gè)Master被選舉成活著的master,而其他Master處于Standby狀態(tài)。如果現(xiàn)任Master死去,另一個(gè)Master會(huì)通過(guò)選舉產(chǎn)生,并恢復(fù)到舊的Master狀態(tài),然后恢復(fù)調(diào)度。整個(gè)恢復(fù)過(guò)程可能要1-2分鐘。SparkHA集群部署下載解壓安裝包2.配置spark-env.sh3.重命名slaves.template文件4.配置slaves文件5.環(huán)境變量配置6.文件分發(fā)7.啟動(dòng)集群8.驗(yàn)證感謝大家的聆聽Spark運(yùn)行架構(gòu)與原理目錄/Contents01基本概念02Spark集群運(yùn)行架構(gòu)03Spark運(yùn)行基本流程基本概念01基本概念Spark運(yùn)行架構(gòu)包括集群資源管理器(ClusterManager)、運(yùn)行作業(yè)任務(wù)的工作節(jié)點(diǎn)(WorkerNode)、每個(gè)應(yīng)用的任務(wù)控制節(jié)點(diǎn)(Driver)和每個(gè)工作節(jié)點(diǎn)上負(fù)責(zé)具體任務(wù)的執(zhí)行進(jìn)程(Executor)。其中,集群資源管理器可以是Spark自帶的資源管理器,也可以是YARN或Mesos等資源管理框架。與HadoopMapReduce計(jì)算框架相比,Spark所采用的Executor有兩個(gè)優(yōu)點(diǎn):一是利用多線程來(lái)執(zhí)行具體的任務(wù)(HadoopMapReduce采用的是進(jìn)程模型),減少任務(wù)的啟動(dòng)開銷;二是Executor中有一個(gè)BlockManager存儲(chǔ)模塊,會(huì)將內(nèi)存和磁盤共同作為存儲(chǔ)設(shè)備,當(dāng)需要多輪迭代計(jì)算時(shí),可以將中間結(jié)果存儲(chǔ)到這個(gè)存儲(chǔ)模塊里,下次需要時(shí),就可以直接讀該存儲(chǔ)模塊里的數(shù)據(jù),而不需要讀寫到HDFS等文件系統(tǒng)里,因而有效減少了IO開銷;或者在交互式查詢場(chǎng)景下,預(yù)先將表緩存到該存儲(chǔ)系統(tǒng)上,從而可以提高讀寫IO性能。
Standalone模式部署ApplicationDriver用戶編寫的Spark應(yīng)用程序,包含了DriverProgram以及在集群上運(yùn)行的程序代碼,物理機(jī)器上涉及了driver,master,worker三個(gè)節(jié)點(diǎn)。
Spark中的Driver即運(yùn)行Application的main函數(shù)并創(chuàng)建SparkContext,創(chuàng)建SparkContext的目的是為了準(zhǔn)備Spark應(yīng)用程序的運(yùn)行環(huán)境,在Spark中由SparkContext負(fù)責(zé)與ClusterManager通信,進(jìn)行資源申請(qǐng)、任務(wù)的分配和監(jiān)控等,當(dāng)Executor部分運(yùn)行完畢后,Driver同時(shí)負(fù)責(zé)將SparkContext關(guān)閉。
Standalone模式部署WorkerExecutor集群中任何一個(gè)可以運(yùn)行spark應(yīng)用代碼的節(jié)點(diǎn)。Worker就是物理節(jié)點(diǎn),可以在上面啟動(dòng)Executor進(jìn)程。在每個(gè)Worker上為某應(yīng)用啟動(dòng)的一個(gè)進(jìn)程,該進(jìn)程負(fù)責(zé)運(yùn)行Task,并且負(fù)責(zé)將數(shù)據(jù)存在內(nèi)存或者磁盤上,每個(gè)任務(wù)都有各自獨(dú)立的Executor。Executor是一個(gè)執(zhí)行Task的容器。RDDRDD(ResilientDistributedDataset)叫做彈性分布式數(shù)據(jù)集,是Spark中最基本的數(shù)據(jù)抽象,它代表一個(gè)不可變、可分區(qū)、里面的元素可并行計(jì)算的集合。
Standalone模式部署TaskJob被送到某個(gè)Executor上的工作單元,但hadoopMR中的MapTask和ReduceTask概念一樣,是運(yùn)行Application的基本單位,多個(gè)Task組成一個(gè)Stage,而Task的調(diào)度和管理等是由TaskScheduler負(fù)責(zé)。包含多個(gè)Task組成的并行計(jì)算,往往由SparkAction觸發(fā)生成,一個(gè)Application中往往會(huì)產(chǎn)生多個(gè)Job。Stage每個(gè)Job會(huì)被拆分成多組Task,作為一個(gè)TaskSet,其名稱為Stage,Stage的劃分和調(diào)度是有DAGScheduler來(lái)負(fù)責(zé)的,Stage有非最終的Stage(ShuffleMapStage)和最終的Stage(ResultStage)兩種,Stage的邊界就是發(fā)生shuffle的地方。Spark集群運(yùn)行架構(gòu)02Spark集群運(yùn)行架構(gòu)Spark是基于內(nèi)存計(jì)算的大數(shù)據(jù)并行計(jì)算框架,比MapReduce計(jì)算框架具有更高的實(shí)時(shí)性,同時(shí)具有高效容錯(cuò)性和可伸縮性,在學(xué)習(xí)Spark操作之前,首先介紹Sprk運(yùn)行架構(gòu)。Spark運(yùn)行基本流程03Spark運(yùn)行基本流程Spark運(yùn)行架構(gòu)主要由SparkContext、ClusterManagaer和Worker組成,其中ClusterManager負(fù)責(zé)整個(gè)集群的同一資源管理,Worker節(jié)點(diǎn)中的Executor是應(yīng)用執(zhí)行的主要進(jìn)程,內(nèi)部含有多個(gè)Task線程以及內(nèi)存空間。Spark運(yùn)行基本流程1)構(gòu)建SparkApplication的運(yùn)行環(huán)境(啟動(dòng)SparkContext),SparkContext向ClusterManager注冊(cè),并申請(qǐng)運(yùn)行Executor資源。2)ClusterManager為Executor分配資源并啟動(dòng)Executor進(jìn)程,Executor運(yùn)行情況將隨著“心跳”發(fā)送到ClusterManager上。3)SparkContext構(gòu)建DAG圖,將DAG圖分解成多個(gè)Stage,并把每個(gè)Stage的TaskSet(任務(wù)集)發(fā)送給TaskScheduler(任務(wù)調(diào)度器)。Executor向SparkContext申請(qǐng)Task,TaskScheduler將Task發(fā)放給Executor,同時(shí),SparkContext將應(yīng)用程序代碼發(fā)放給Executor。4)Task在Executor上運(yùn)行,把執(zhí)行結(jié)果反饋給TaskScheduler,然后再反饋給DAGScheduler。運(yùn)行完畢后寫入數(shù)據(jù),SparkContext向ClusterManager注銷并釋放所有資源。感謝大家的聆聽SparkShell目錄/Contents01Spark-Shell簡(jiǎn)介與交互Spark-Shell簡(jiǎn)介與交互01Spark-Shell簡(jiǎn)介與交互在spark/bin目錄中,執(zhí)行Spark-Shell命令就可以進(jìn)入Spark-Shell交互式環(huán)境,命令如下。bin/spark-shell--master<master-url>Spark的運(yùn)行模式取決于傳遞給SparkContext的MasterURL的值<master-url>用來(lái)指定Spark的運(yùn)行模式。MasterURL可以是以下任一種形式:Spark-Shell簡(jiǎn)介與交互 local使用一個(gè)Worker線程本地化運(yùn)行Spark(完全不并行)。
local[*]使用邏輯CPU個(gè)數(shù)數(shù)量的線程來(lái)本地化運(yùn)行Spark。
local[K]使用K個(gè)Worker線程本地化運(yùn)行Spark(理想情況下,K應(yīng)該根據(jù)運(yùn)行機(jī)器的CPU核數(shù)設(shè)定)。
spark://HOST:PORT連接到指定的Sparkstandalonemaster。默認(rèn)端口是7077。
yarn-client以客戶端模式連接YARN集群。集群的位置可以在HADOOP_CONF_DIR環(huán)境變量中找到。
yarn-cluster以集群模式連接YARN集群。集群的位置可以在HADOOP_CONF_DIR環(huán)境變量中找到。
mesos://HOST:PORT連接到指定的Mesos集群。默認(rèn)接口是5050。如果要使用更多的使用方式可以執(zhí)行“--help”命令查看命令以及功能,Spark-Shell簡(jiǎn)介與交互圖2-43Spark-Shell命令列表感謝大家的聆聽Scala簡(jiǎn)介目錄/Contents01
Scala簡(jiǎn)介Scala簡(jiǎn)介01Scala簡(jiǎn)介Scala是一門多范式的編程語(yǔ)言,一種類似java的編程語(yǔ)言,設(shè)計(jì)初衷是實(shí)現(xiàn)可伸縮的語(yǔ)言、并集成面象對(duì)象編程的各種特性。Scala將面向?qū)ο蠛秃瘮?shù)式編程結(jié)合成一種簡(jiǎn)潔的高級(jí)語(yǔ)言。Scala的靜態(tài)類型有助于避免復(fù)雜應(yīng)用程序中的錯(cuò)誤,它的JVM和JavaScript運(yùn)行時(shí)讓你可以輕松地訪問(wèn)龐大的庫(kù)生態(tài)系統(tǒng)來(lái)構(gòu)建高性能系統(tǒng)。Scala簡(jiǎn)介Scala是一門以Java虛擬機(jī)(JVM)為運(yùn)行環(huán)境并將面向?qū)ο蠛秃瘮?shù)式編程的最佳特性結(jié)合在一起的靜態(tài)類型編程語(yǔ)言(靜態(tài)語(yǔ)言需要提前編譯的如:Java、c、c++等,動(dòng)態(tài)語(yǔ)言如:js)。Scala特點(diǎn)如下:1、Scala是一門多范式的編程語(yǔ)言,Scala支持面向?qū)ο蠛秃瘮?shù)式編程。(多范式,就是多種編程方法的意思。有面向過(guò)程、面向?qū)ο蟆⒎盒?、函?shù)式四種程序設(shè)計(jì)方法。)2、Scala源代碼(.scala)會(huì)被編譯成Tava字節(jié)碼(.class),然后運(yùn)行于JVM之上,并可以調(diào)用現(xiàn)有的Java類庫(kù),實(shí)現(xiàn)兩種語(yǔ)言的無(wú)縫對(duì)接。3、Scala單作為一門語(yǔ)言來(lái)看,非常的簡(jiǎn)潔高效。感謝大家的聆聽Scala環(huán)境準(zhǔn)備目錄/Contents01
Windows下Scala安裝02
IDEA安裝Scala
Windows下Scala安裝01
Windows下Scala安裝在Scala官網(wǎng)(/)單擊DOWNLOAD進(jìn)入下載頁(yè)面,目前最新的版本是2.13.1,考慮到版本的穩(wěn)定性和兼容性,本書選擇的是2.12.8(/download/2.12.8.html)
Windows下Scala安裝下載成功后解壓安裝包,并配置Scala的環(huán)境變量
Windows下Scala安裝環(huán)境變量配置完成后測(cè)試是否安裝成功。進(jìn)入Windows命令行界面,輸入scala然后回車IDEA安裝Scala02IDEA安裝Scala目前主流的開發(fā)工具有Eclipse和IDEA兩種,在這兩個(gè)開發(fā)工具中可以安裝對(duì)應(yīng)的Scala插件來(lái)進(jìn)行Scala開發(fā)。現(xiàn)在大多數(shù)Scala開發(fā)程序員都會(huì)選擇IDEA作為開發(fā)Scala的工具。本書以Windows操作系統(tǒng)為例,講解如何在IDEA中下載安裝Scala插件。
Windows下Scala安裝(1)首先下載IDEA工具(/idea/download/other.html),本書選擇的版本是2018.2.5,然后打開安裝包進(jìn)行安裝,具體的安裝步驟這里不做詳解。(2)打開IDEA安裝Scala插件。本書選擇的版本是2018.2.11(scala-intellij-bin-2018.2.11.zip),Scala的插件分為在線安裝與離線安裝,但是在線安裝很慢,所以建議下載后離線安裝。打開IDEA后點(diǎn)擊【File】下拉按鈕,然后選擇【Settings】,在彈出的對(duì)話框中點(diǎn)擊【Plugins】,然后點(diǎn)擊【InstallJetBrainsplugin】,在搜索框中輸入scala,點(diǎn)擊Scala,在對(duì)話框右邊出現(xiàn)該Intellij對(duì)應(yīng)的Scala版本,從圖中看到對(duì)應(yīng)的Scala版本是2018/9/5更新的。
Windows下Scala安裝在/plugin/1347-scala/versions找到Scala對(duì)應(yīng)的版本,然后下載即可。
Windows下Scala安裝插件下載完成后點(diǎn)擊【Installpluginfromdisk】按鈕,選擇Scala插件所在的路徑,然后單擊ok。
Windows下Scala安裝插件安裝完成后需要重啟IDEA,Scala插件才會(huì)生效,單擊【Restart】重啟IDEA。感謝大家的聆聽Scala基礎(chǔ)語(yǔ)法目錄/Contents01
Scala數(shù)據(jù)類型02Scala變量03方法與函數(shù)Scala數(shù)據(jù)類型01Scala數(shù)據(jù)類型Scala中沒(méi)有基本數(shù)據(jù)類型的概念,所有的類型都是對(duì)象。Scala的數(shù)據(jù)類型和Java是類似的,所有Java的基本類型在scala包中都有對(duì)應(yīng)的類,將Scala代碼編譯為Java字節(jié)碼時(shí),Scala編譯器將盡可能使用Java的基本類型,從而提供基本類型的性能優(yōu)勢(shì)。Scala數(shù)據(jù)類型
AnyVal:所有值類型的父類型。包含Byte、Short、Int、Long、Float、Double、Char、Boolean、Unit。其中Unit類型用來(lái)標(biāo)識(shí)過(guò)程,也就是沒(méi)有明確返回值的函數(shù)。由此可見,Unit類似于Java里的void。Unit只有一個(gè)實(shí)例,(),這個(gè)實(shí)例也沒(méi)有實(shí)質(zhì)的意義。
AnyRef:Scala里所有引用類(referenceclass)的基類。與其他語(yǔ)言稍微有點(diǎn)不同的是,Scala還定義了底類型,分別是Nothing、Null。
Nothing:在Scala的類層級(jí)的最低端;它是任何其他類型的子類型,可以賦值給任何其他類型,用于異常,表明不正常的返回。
Null:所有引用類型的子類型,而Nothing是所有類型的子類型。Null類只有一個(gè)實(shí)例對(duì)象,null,類似于Java中的null引用。null可以賦值給任意引用類型,但是不能賦值給值類型。Scala變量02Scala變量Scala有兩種變量,val和var。val類似于Java里的final變量。一旦初始化了,val就不能再被賦值。相反,var如同Java里面的非final變量,可以在它的生命周期中被多次賦值。即,常量或變量。變量:在程序運(yùn)行過(guò)程中其值可能發(fā)生改變的量叫做變量。如:時(shí)間,年齡。常量:在程序運(yùn)行過(guò)程中其值不會(huì)發(fā)生變化的量叫做常量。如:數(shù)值3,字符'A'。Scala變量在Scala中,聲明變量使用關(guān)鍵詞“var”,實(shí)例如下:varmyVar:String="Foo"varmyVar:String="Too"在這里,myVar使用關(guān)鍵字var聲明。這意味著它是一個(gè)可以改變值的變量,被稱為可變變量。下面是使用val關(guān)鍵字來(lái)定義變量的語(yǔ)法:valmyVal:String="Foo"這里,myVal是使用關(guān)鍵字val聲明。這意味著,它是不能改變的變量,這是不可變變量。1.變量聲明Scala變量2.變量類型引用在Scala中聲明變量和常量不一定要指明數(shù)據(jù)類型,在沒(méi)有指明數(shù)據(jù)類型的情況下,其數(shù)據(jù)類型是通過(guò)變量或常量的初始值推斷出來(lái)的。所以,如果在沒(méi)有指明數(shù)據(jù)類型的情況下聲明變量或常量必須要給出其初始值,否則將會(huì)報(bào)錯(cuò)。如下面的實(shí)例所示,myVar會(huì)被推斷為Int類型,myVal會(huì)被推斷為String類型。varmyVar=10valmyVal="Hello,Scala!"
方法與函數(shù)03Scala有方法與函數(shù),二者在語(yǔ)義上的區(qū)別很小。Scala中的方法跟Java的類似,方法是組成類的一部分,而函數(shù)是一個(gè)對(duì)象可以賦值給一個(gè)變量。換句話來(lái)說(shuō)在類中定義的函數(shù)即是方法。Scala中使用val語(yǔ)句可以定義函數(shù),def語(yǔ)句定義方法。方法與函數(shù)方法與函數(shù)1.方法Scala方法聲明格式如下:deffunctionName([參數(shù)列表]):[returntype]如果你不寫等于號(hào)和方法主體,那么方法會(huì)被隱式聲明為抽象(abstract),包含它的類型于是也是一個(gè)抽象類型。Scala方法定義格式如下:deffunctionName([參數(shù)列表]):[returntype]={functionbodyreturn[expr]}方法定義由一個(gè)def關(guān)鍵字開始,緊接著是可選的參數(shù)列表,一個(gè)冒號(hào):和方法的返回類型,一個(gè)等于號(hào)=,最后是方法的主體。以上代碼中returntype可以是任意合法的Scala數(shù)據(jù)類型。參數(shù)列表中的參數(shù)可以使用逗號(hào)分隔。如果方法沒(méi)有返回值,可以返回為Unit,這個(gè)類似于Java的void。2.函數(shù)在Scala中,由于使用def語(yǔ)句定義以及調(diào)用函數(shù)的格式均與方法一樣,因此,這里不做贅述。然而,Scala函數(shù)與Scala方法也是有區(qū)別的。具體如下:(1) 函數(shù)可作為一個(gè)參數(shù)傳入到方法中,而方法不行。(2) 在Scala中無(wú)法直接操作方法,如果要操作方法,必須先將其轉(zhuǎn)換成函數(shù)。(3) 函數(shù)必須要有參數(shù)列表,而方法可以沒(méi)有參數(shù)列表valfunctionName([參數(shù)列表]):[returntype]={functionbodyreturn[expr]}方法與函數(shù)方法與函數(shù)3.方法轉(zhuǎn)函數(shù)方法轉(zhuǎn)函數(shù)的格式如下:valf1=m1_在上面的格式中,方法名后面有一個(gè)空格和一個(gè)下劃線。神奇的下劃線將m1這個(gè)方法變成了函數(shù),而方法名與下劃線之間至少有一個(gè)空格,沒(méi)有會(huì)報(bào)錯(cuò)。感謝大家的聆聽Scala面向?qū)ο竽夸?Contents01類和對(duì)象02繼承03單例對(duì)象和伴生對(duì)象類和對(duì)象01類和對(duì)象
類是對(duì)象的抽象,而對(duì)象是類的具體實(shí)例。類是抽象的,不占用內(nèi)存,而對(duì)象是具體的,占用存儲(chǔ)空間。類是用于創(chuàng)建對(duì)象的藍(lán)圖,它是一個(gè)定義包括在特定類型的對(duì)象中的方法和變量的軟件模板。繼承02繼承Scala繼承一個(gè)基類跟Java很相似,但我們需要注意以下幾點(diǎn):重寫一個(gè)非抽象方法必須使用override修飾符。只有主構(gòu)造函數(shù)才可以往基類的構(gòu)造函數(shù)里寫參數(shù)。在子類中重寫超類的抽象方法時(shí),你不需要使用override關(guān)鍵字。單例對(duì)象和伴生對(duì)象03單例對(duì)象和伴生對(duì)象在Scala中,是沒(méi)有static這個(gè)東西的,所以不能像Java一樣直接用類名就可以訪問(wèn)類中的方法和字段。但是它也為我們提供了單例模式的實(shí)現(xiàn)方法,那就是使用關(guān)鍵字object,使用關(guān)鍵字object創(chuàng)建對(duì)象就是單例對(duì)象。感謝大家的聆聽Scala基本數(shù)據(jù)結(jié)構(gòu)目錄/Contents01數(shù)組02
元祖03集合
數(shù)組01
數(shù)組Scala提供了一種數(shù)據(jù)結(jié)構(gòu)叫作數(shù)組,數(shù)組是一種存儲(chǔ)了相同類型元素的固定大小順序集合。數(shù)組用于存儲(chǔ)數(shù)據(jù)集合,但將數(shù)組視為相同類型變量的集合通常更為有用??梢月暶饕粋€(gè)數(shù)組變量,例如:numbers,使用numbers[0],numbers[1]和...,numbers[99]來(lái)表示單個(gè)變量,而不是分別地聲明每個(gè)變量,例如number0,number1,...等變量。本教程介紹如何使用索引變量聲明數(shù)組變量,創(chuàng)建數(shù)組和使用數(shù)組。數(shù)組的第一個(gè)元素的索引是數(shù)字0,最后一個(gè)元素的索引是元素的總數(shù)減去1。
數(shù)組1.?dāng)?shù)組的定義和使用在scala中數(shù)組有兩種:定長(zhǎng)數(shù)組和變長(zhǎng)數(shù)組。定長(zhǎng)數(shù)組:由于Array是不可變的,初始化就有了固定的長(zhǎng)度,所以不能直接對(duì)其元素進(jìn)行刪除操作,也不能多增加元素,只能修改某個(gè)位置的元素值,要實(shí)現(xiàn)刪除可以通過(guò)過(guò)濾生成新的數(shù)組。所以也就沒(méi)有:add,insert,remove等操作。變長(zhǎng)數(shù)組:ArrayBuffer是可變的,本身提供了很多元素的操作,當(dāng)然包括增加,刪除操作。
數(shù)組2.?dāng)?shù)組的遍歷與Java一樣,如果想要獲取數(shù)組中的每一個(gè)元素,需要將數(shù)組進(jìn)行遍歷操作。數(shù)組的遍歷分為for循環(huán)遍歷、while循環(huán)遍歷、do...while循環(huán)遍歷。下面是用for循環(huán)對(duì)數(shù)組進(jìn)行遍歷。元祖02元祖元組也是可以理解為一個(gè)容器,可以存放各種相同或不同類型的數(shù)據(jù)。說(shuō)的簡(jiǎn)單點(diǎn),就是將多個(gè)無(wú)關(guān)的數(shù)據(jù)封裝為一個(gè)整體,稱為元組。與列表一樣,元祖也是不可變的,但與列表不同的是元祖可以包含不同類型的元素,元祖的值是通過(guò)將不同的值包含在圓括號(hào)中構(gòu)成的。1.元祖的創(chuàng)建2.訪問(wèn)元祖中的元素訪問(wèn)元祖的元素可以通過(guò)數(shù)字索引,我們可以使用t._1訪問(wèn)第一個(gè)元素,使用t._2訪問(wèn)第二個(gè)元素,依次類推。3.元素交換當(dāng)元組中的元素為兩個(gè)時(shí),可以通過(guò)Tuple.swap方法進(jìn)行元素交換,生成新的元祖。原先的元祖不會(huì)被改變。集合03
集合(1)Scala的集合有三大類:序列Seq、集Set、映射Map,所有的集合都擴(kuò)展自Iterable特質(zhì)。(2)對(duì)于幾乎所有的集合類,Scala都同時(shí)提供了可變和不可變的版本,分別位于以下兩個(gè)包:不可變集合:scala.collection.immutable可變集合:scala.collection.mutable(3)Scala不可變集合,就是指該集合對(duì)象不可修改,每次修改就會(huì)返回一個(gè)新對(duì)象,而不會(huì)對(duì)原對(duì)象進(jìn)行修改。類似于java中的String對(duì)象。(4)可變集合,就是這個(gè)集合可以直接對(duì)原對(duì)象進(jìn)行修改,而不會(huì)返回新的對(duì)象。類似于java中StringBuilder對(duì)象。建議:在操作集合的時(shí)候,不可變用符號(hào),可變用方法元祖Scala列表類似于數(shù)組,它們所有元素的類型都相同,但是它們也有所不同:列表是不可變的,值一旦被定義了就不能改變,其次列表具有遞歸的結(jié)構(gòu)(也就是鏈接表結(jié)構(gòu))而數(shù)組不是。1.List(列表)2.Set(集合)與其他任何一種編程語(yǔ)言一樣,Scala中的Set集合類具有如下特點(diǎn):①不存在有重復(fù)的元素。②集合中的元素是無(wú)序的。換句話說(shuō),不能以索引的方式訪問(wèn)集合中的元素。③判斷某一個(gè)元素在集合中比Seq類型的集合要快。元祖Map(映射)是一種可迭代的鍵值對(duì)(key/value)結(jié)構(gòu)。所有的值都可以通過(guò)鍵來(lái)獲取。Map中的鍵都是唯一的。Map有兩種類型,可變與不可變,區(qū)別在于可變對(duì)象可以修改它,而不可變對(duì)象不可以。默認(rèn)情況下Scala使用不可變Map。如果你需要使用可變集合,你需要顯式的引入importscala.collection.mutable.Map類。在Scala中你可以同時(shí)使用可變與不可變Map,不可變的直接使用Map,可變的使用mutable.Map。3.Map(映射)感謝大家的聆聽RDD概述目錄/Contents01
RDD概述RDD概述01RDD概述RDD(ResilientDistributedDataset)叫做分布式數(shù)據(jù)集,是Spark中最基本的數(shù)據(jù)抽象,它代表一個(gè)不可變、可分區(qū)、里面的元素可并行計(jì)算的集合。在Spark中,對(duì)數(shù)據(jù)的所有操作不外乎創(chuàng)建RDD、轉(zhuǎn)化已有RDD以及調(diào)用RDD操作進(jìn)行求值。每個(gè)RDD都被分為多個(gè)分區(qū),這些分區(qū)運(yùn)行在集群中的不同節(jié)點(diǎn)上。RDD可以包含Python、Java、Scala中任意類型的對(duì)象,甚至可以包含用戶自定義的對(duì)象。RDD具有數(shù)據(jù)流模型的特點(diǎn):自動(dòng)容錯(cuò)、位置感知性調(diào)度和可伸縮性。RDD允許用戶在執(zhí)行多個(gè)查詢時(shí)顯式地將工作集緩存在內(nèi)存中,后續(xù)的查詢能夠重用工作集,這極大地提升了查詢速度。RDD支持兩種操作:transformation操作和action操作。RDD的轉(zhuǎn)化操作是返回一個(gè)新的RDD的操作,比如map()和filter(),而action操作則是向驅(qū)動(dòng)器程序返回結(jié)果或把結(jié)果寫入外部系統(tǒng)的操作。比如count()和first()。RDD概述RDD具有如下五個(gè)特性:1、一組分片(Partition),即數(shù)據(jù)集的基本組成單位。對(duì)于RDD來(lái)說(shuō),每個(gè)分片都會(huì)被一個(gè)計(jì)算任務(wù)處理,并決定并行計(jì)算的粒度。2、一個(gè)計(jì)算每個(gè)分區(qū)的函數(shù)。Spark中RDD的計(jì)算是以分片為單位的,每個(gè)RDD都會(huì)實(shí)現(xiàn)compute函數(shù)以達(dá)到這個(gè)目的。3、RDD之間的依賴關(guān)系。RDD的每次轉(zhuǎn)換都會(huì)生成一個(gè)新的RDD,所以RDD之間就會(huì)形成類似于流水線一樣的前后依賴關(guān)系。在部分分區(qū)數(shù)據(jù)丟失時(shí),Spark可以通過(guò)這個(gè)依賴關(guān)系重新計(jì)算丟失的分區(qū)數(shù)據(jù),而不是對(duì)RDD的所有分區(qū)進(jìn)行重新計(jì)算。RDD概述4、一個(gè)Partitioner,即RDD的分片函數(shù)(分區(qū)器)。當(dāng)前Spark中實(shí)現(xiàn)了兩種類型的分片函數(shù),一個(gè)是基于哈希的HashPartitioner,另外一個(gè)是基于范圍的RangePartitioner。只有對(duì)于于key-value的RDD,才會(huì)有Partitioner,非key-value的RDD的Parititioner的值是None。Partitioner函數(shù)不但決定了RDD本身的分片數(shù)量,也決定了parentRDDShuffle輸出時(shí)的分片數(shù)量。5、一個(gè)列表,存儲(chǔ)存取每個(gè)Partition的優(yōu)先位置(preferredlocation)。對(duì)于一個(gè)HDFS文件來(lái)說(shuō),這個(gè)列表保存的就是每個(gè)Partition所在的塊的位置。按照“移動(dòng)數(shù)據(jù)不如移動(dòng)計(jì)算”的理念,Spark在進(jìn)行任務(wù)調(diào)度的時(shí)候,會(huì)盡可能地將計(jì)算任務(wù)分配到其所要處理數(shù)據(jù)塊的存儲(chǔ)位置。感謝大家的聆聽RDD創(chuàng)建方式目錄/Contents01通過(guò)讀取文件生成RDD02通過(guò)并行化方式創(chuàng)建RDD通過(guò)讀取文件生成RDD01通過(guò)讀取文件生成RDDSpark是支持使用任何Hadoop支持的存儲(chǔ)系統(tǒng)上的文件創(chuàng)建RDD的,比如說(shuō)HDFS、Cassandra、HBase以及本地文件。通過(guò)調(diào)用SparkContext的textFile()方法,可以針對(duì)本地文件或HDFS文件創(chuàng)建RDD。1.通過(guò)加載本地文件數(shù)據(jù)創(chuàng)建RDD2.通過(guò)加載HDFS文件數(shù)據(jù)創(chuàng)建RDD通過(guò)并行化方式創(chuàng)建RDD02通過(guò)并行化方式創(chuàng)建RDD如果要通過(guò)并行化集合來(lái)創(chuàng)建RDD,需要針對(duì)程序中已經(jīng)存在的集合、數(shù)組,調(diào)用SparkContext中的parallelize()方法。Spark會(huì)將集合中的數(shù)據(jù)拷貝到集群上去,形成一個(gè)分布式的數(shù)據(jù)集合,也就是一個(gè)RDD。即:集合中的部分?jǐn)?shù)據(jù)會(huì)到一個(gè)節(jié)點(diǎn)上,而另一部分?jǐn)?shù)據(jù)會(huì)到其它節(jié)點(diǎn)上。然后就可以采用并行的方式來(lái)操作這個(gè)分布式數(shù)據(jù)集合。感謝大家的聆聽RDD類型操作目錄/Contents01
轉(zhuǎn)換算子02行動(dòng)算子轉(zhuǎn)換算子01轉(zhuǎn)換算子Transformation:轉(zhuǎn)換算子,這類轉(zhuǎn)換并不觸發(fā)提交作業(yè),完成作業(yè)中間過(guò)程處理。下面是一些常用的轉(zhuǎn)換算子操作的API。操作介紹map(func)將RDD中的每個(gè)元素傳入自定義函數(shù),獲取一個(gè)新的元素,然后用新的元素組成新的RDDfilter(func)對(duì)RDD中每個(gè)元素進(jìn)行判斷,如果返回true則保留,返回false則剔除flatMap(func)與map類似,但是對(duì)每個(gè)元素都可以返回一個(gè)或多個(gè)新元素groupByKey(func)根據(jù)key進(jìn)行分組,每個(gè)key對(duì)應(yīng)一個(gè)Iterable<value>reduceByKey(func)對(duì)每個(gè)key對(duì)應(yīng)value進(jìn)行reduce操作轉(zhuǎn)換算子1.map(func)map(func)操作是對(duì)RDD中的每個(gè)元素都執(zhí)行一個(gè)指定的函數(shù)來(lái)產(chǎn)生一個(gè)新的RDD。2.filter(func)filter(func)操作會(huì)篩選出滿足條件(即func)的元素,返回一個(gè)新的數(shù)據(jù)集。3.flatMap(func)類似于map,但是每一個(gè)輸入元素,會(huì)被映射為0到多個(gè)輸出元素(因此,func函數(shù)的返回值是一個(gè)Seq,而不是單一元素)。在一個(gè)由(K,V)對(duì)組成的數(shù)據(jù)集上調(diào)用,返回一個(gè)(K,Seq[V])對(duì)的數(shù)據(jù)集。4.groupByKey(func)5.reduceByKey(func)顧名思義,reduceByKey就是對(duì)元素為KV對(duì)的RDD中Key相同的元素的Value進(jìn)行reduce,因此,Key相同的多個(gè)元素的值被reduce為一個(gè)值,然后與原RDD中的Key組成一個(gè)新的KV對(duì)。行動(dòng)算子02行動(dòng)算子Action:行動(dòng)算子,這類算子會(huì)觸發(fā)SparkContext提交Job作業(yè)。下面是一些常用的行動(dòng)算子操作的API。操作介紹
reduce(func)通過(guò)函數(shù)func聚集數(shù)據(jù)集中的所有元素。Func函數(shù)接受2個(gè)參數(shù),返回一個(gè)值。這個(gè)函數(shù)必須是關(guān)聯(lián)性的,確??梢员徽_的并發(fā)執(zhí)行collect()在Driver的程序中,以數(shù)組的形式,返回?cái)?shù)據(jù)集的所有元素。count()返回?cái)?shù)據(jù)集的元素個(gè)數(shù)take(n)返回一個(gè)數(shù)組,由數(shù)據(jù)集的前n個(gè)元素組成。first()返回?cái)?shù)據(jù)集的第一個(gè)元素(類似于take(1))foreach(func)在數(shù)據(jù)集的每一個(gè)元素上,運(yùn)行函數(shù)func。
saveAsTextFile(path)將數(shù)據(jù)集的元素,以textfile的形式,保存到本地文件系統(tǒng),hdfs或者任何其它hadoop支持的文件系統(tǒng)。Spark將會(huì)調(diào)用每個(gè)元素的toString方法,并將它轉(zhuǎn)換為文件中的一行文本行動(dòng)算子1.reduce(func)reduce將RDD中元素兩兩傳遞給輸入函數(shù),同時(shí)產(chǎn)生一個(gè)新的值,新產(chǎn)生的值與RDD中下一個(gè)元素再被傳遞給輸入函數(shù)直到最后只有一個(gè)值為止。2.collect()在Driver的程序中,以數(shù)組的形式,返回?cái)?shù)據(jù)集的所有元素。這通常會(huì)在使用filter或者其它操作后,返回一個(gè)足夠小的數(shù)據(jù)子集再使用,直接將整個(gè)RDD集Collect返回,很可能會(huì)讓Driver程序OOM。3.count()count返回整個(gè)RDD的元素個(gè)數(shù)。我們可以定義一個(gè)RDD,使用count()來(lái)統(tǒng)計(jì)RDD的元素個(gè)數(shù)。
take和collect操作類似,只是collect操作獲取的所有數(shù)據(jù),而take操作是獲取前n個(gè)元素。4.take(n)5.first()first()的作用是返回?cái)?shù)據(jù)集的第一個(gè)元素.我們可以定義一個(gè)RDD,使用first()來(lái)獲取RDD中的第一個(gè)元素。6.foreach(func)foreach對(duì)RDD中的每個(gè)元素都應(yīng)用func函數(shù)操作,不返回RDD和Array,而是返回Uint。感謝大家的聆聽RDD之間的依賴關(guān)系目錄/Contents01
RDD之間的依賴關(guān)系RDD之間的依賴關(guān)系01RDD之間的依賴關(guān)系RDD和它依賴的父RDD的關(guān)系有兩種不同的類型,即窄依賴(narrowdependency)和寬依賴(widedependency)。RDD之間的依賴關(guān)系窄依賴指的是每一個(gè)父RDD的Partition最多被子RDD的一個(gè)Partition使用??偨Y(jié):窄依賴我們形象的比喻為獨(dú)生子女。1、窄依賴RDD之間的依賴關(guān)系寬依賴指的是多個(gè)子RDD的Partition會(huì)依賴同一個(gè)父RDD的Partition。總結(jié):寬依賴我們形象的比喻為超生。2、寬依賴RDD之間的依賴關(guān)系RDD只支持粗粒度轉(zhuǎn)換,即只記錄單個(gè)塊上執(zhí)行的單個(gè)操作。將創(chuàng)建RDD的一系列Lineage(即血統(tǒng))記錄下來(lái),以便恢復(fù)丟失的分區(qū)。RDD的Lineage會(huì)記錄RDD的元數(shù)據(jù)信息和轉(zhuǎn)換行為,當(dāng)該RDD的部分分區(qū)數(shù)據(jù)丟失時(shí),它可以根據(jù)這些信息來(lái)重新運(yùn)算和恢復(fù)丟失的數(shù)據(jù)分區(qū)。3、Lineage(血統(tǒng))感謝大家的聆聽RDD機(jī)制目錄/Contents01持久化機(jī)制01容錯(cuò)機(jī)制持久化機(jī)制01持久化機(jī)制多次對(duì)某個(gè)RDD進(jìn)行transformation或者action,如果沒(méi)有做RDD持久化,那么每次都要重新計(jì)算一個(gè)RDD,會(huì)消耗大量時(shí)間,降低Spark性能。Spark非常重要的一個(gè)功能特性就是可以將RDD持久化在內(nèi)存中。當(dāng)對(duì)RDD執(zhí)行持久化操作時(shí),每個(gè)節(jié)點(diǎn)都會(huì)將自己操作的RDD的partition持久化到內(nèi)存中,并且在之后對(duì)該RDD的反復(fù)使用中,直接使用內(nèi)存緩存的partition。這樣的話,對(duì)于針對(duì)一個(gè)RDD反復(fù)執(zhí)行多個(gè)操作的場(chǎng)景,就只要對(duì)RDD計(jì)算一次即可,后面直接使用該RDD,而不需要反復(fù)計(jì)算多次該RDD。持久化機(jī)制存儲(chǔ)級(jí)別說(shuō)明
MEMORY_ONLY將RDD以反序列化Java對(duì)象的形式存儲(chǔ)在JVM中。如果內(nèi)存空間不夠,部分分區(qū)將不再緩存,在每次需要用到這些數(shù)據(jù)時(shí)重新進(jìn)行計(jì)算。這是默認(rèn)的存儲(chǔ)級(jí)別。
MEMORY_AND_DISK將RDD以反序列化Java對(duì)象的形式存儲(chǔ)在JVM中。如果內(nèi)存空間不夠,將未緩存的數(shù)據(jù)分區(qū)存儲(chǔ)到磁盤,在需要使用這些分區(qū)時(shí)從磁盤讀取。
MEMORY_ONLY_SER將RDD以序列化的Java對(duì)象的形式進(jìn)行存儲(chǔ)(每個(gè)分區(qū)為一個(gè)字節(jié)數(shù)組)。這種方式比反序列化的Java對(duì)象節(jié)省空間,但
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年汽車維修行業(yè)技師崗位勞動(dòng)合同范本3篇
- 《《智慧之和》(節(jié)選)翻譯實(shí)踐報(bào)告》
- 《交替?zhèn)髯g中的信息重組技巧》
- 《幾類分?jǐn)?shù)階偏微分方程的守恒數(shù)值方法》
- 2024年電影劇本定制創(chuàng)作合同版B版
- 2025單位向個(gè)人的汽車租賃合同
- 2024年度智能家電技術(shù)知識(shí)產(chǎn)權(quán)歸屬及保密服務(wù)合同3篇
- 課題申報(bào)書:指向?qū)W生個(gè)性創(chuàng)造力發(fā)展的階位課程設(shè)計(jì)研究
- 2025客房預(yù)訂合同范文
- 2025簡(jiǎn)易廣告服務(wù)合同
- 50205-2020-鋼結(jié)構(gòu)工程施工質(zhì)量驗(yàn)收標(biāo)準(zhǔn)
- 國(guó)開2023秋《藥劑學(xué)》形考任務(wù)1-3參考答案
- 六年級(jí)上冊(cè)美術(shù)教學(xué)設(shè)計(jì) 第15課 壯錦圖案 |廣西版
- 2023-2024學(xué)年河南省洛陽(yáng)市洛龍區(qū)數(shù)學(xué)四年級(jí)第一學(xué)期期末預(yù)測(cè)試題含答案
- 項(xiàng)目管理績(jī)效考核管理辦法
- 冀教版九年級(jí)下英語(yǔ)單詞表(漢譯英)
- 亞馬遜跨境電商運(yùn)營(yíng)與廣告實(shí)戰(zhàn)
- 高級(jí)FAE現(xiàn)場(chǎng)應(yīng)用工程師工作計(jì)劃工作總結(jié)述職報(bào)告
- 落實(shí)國(guó)家組織藥品集中采購(gòu)使用檢測(cè)和應(yīng)急預(yù)案
- 高標(biāo)準(zhǔn)農(nóng)田建設(shè)項(xiàng)目(二標(biāo)段)施工圖設(shè)計(jì)說(shuō)明
- 豬場(chǎng)配懷工作安排方案設(shè)計(jì)
評(píng)論
0/150
提交評(píng)論