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