原創|行業資訊|編輯:陳俊吉|2016-07-08 09:41:54.000|閱讀 1404 次
概述:本文帶大家一起進行Spark的大數據之旅。本文的內容主要分為兩個部分:一是Spark的背景介紹,二是介紹Spark的基礎。
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
相關鏈接:
1、什么是Spark
在Apache的網站上,有非常簡單的一句話,”Spark is a fast and general engine ”,就是Spark是一個統一的計算引擎,而且突出了fast。那么具體是做什么的呢?是做large-scale的processing,即大數據的處理。
“Spark is a fast and general engine for large-scale processing”這句話非常簡單,但是它突出了Spark的一些特點:第一個特點就是spark是一個并行式的、內存的計算密集型的計算引擎。
那么來說內存的,因為Spark是基于Map Reduce的,但是它的空間數據不是存在于HDFS上面,而是存在于內存中,所以他是一個內存式的計算,這樣就導致Spark的計算速度非常得快,同時它可以部署在集群上,所以它可以分布到各個的節點上,并行式地計算;Spark上還有很多機器學習和數據挖掘的學習包,用戶可以利用學習包進行數據的迭代式計算,所以它又是一個計算密集型的計算工具。
2、Spark的發展歷程
了解完什么是Spark之后,我們看一下Spark的發展歷程。
Spark 2009年作為研究項目創建,13年成為Apache的孵化項目,14年成為Apache的頂級項目,Spark2.0還沒有正式發布,目前只有比較draft的版本。
3、Spark2.0的最新特性
Spark2.0是剛出的,今天主要講解它的兩個部分,一個是它的new feature,就是它有哪些新的特性;另一部分是community,大家知道Spark是一個開源社區,社區對Spark的發展功不可沒。
在feature這一部分,可以看到,Spark2.0中有比較重要的兩個部分,其中一個就是Structured API。
Spark2.0統一了DataFrame和Dataset,并且引入了新的SparkSession。SparkSession提供了一個新的切入點,這個切入點統一了sql和sql context,對用戶來說是透明的,用戶不需要再去區分用什么context或者怎么創建,直接用SparkSession就可以了。還有一個是結構化的流,streaming。在Spark2.0中,流和bash做了一個統一,這樣的話對用戶來說也是透明的,就不在區分什么是流處理,什么是批量處理的數據了。
后面幾個特性,比如MLlib,相信對data scientists非常有吸引力。MLlib可以將用戶訓練過的模型存儲下來,等需要的時候再導入所需要的訓練模型;從R上來說,原來SparkR上支持的只是單機單節點的,不支持分布式的計算,但是R的分布式的開發在Spark2.0中是非常有力的feature。此外,在Spark2.0中,SQL 2003的support可以讓Spark在對結構化的數據進行處理的時候,基本上支持了所有的SQL語句。
4、為什么使用Spark
在傳統方法中,MapReduce需要大量的磁盤I/O,從對比圖中可以看到,MapReduce會將大量的數據存在HDFS上,而Spark因為是內存式的,就不需要大量的磁盤I/O,這一塊就會非常快。
性能方面,在通用的任務上,Spark可以提高20-100倍的速度,因此Spark性能的第一點就是快;第二個就是比較高效,用過Scala開發程序的人應該有感受,Spark語法的表達非常強大,原來可能用十行去描述一段匹配的代碼,Scala可能一行就可以做到,所以它效率非常地高,包括它也支持一些主流的編程的語言,java,Python,Scala,還有R等。
此外,Spark2.0可以利用已有的資產。大家知道hadoop的生態系統是非常有吸引力的,Spark可以很好地和hadoop的生態系統結合在一起。上面我們提到了社區的貢獻,社區的貢獻者不斷得對Spark進行 improvement,使得Spark的發展越來越好,而且速度越來愈快。
以上這些特點導致了Spark現在越來越流行,更多的data scientists包括學者都愿意去使用Spark,Spark讓大數據的計算更簡單,更高效,更智能。
5、IBM對Spark的支持
IBM內部對Spark也是越來越重視,主要支持力度體現在社區培育、產品化和Spark Core上。社區方面,big data university的在線課程內容十分豐富,包括數據科學家、包括最基礎的語言的開發,包括Spark、Hadoop生態基礎的培訓都很多,所以它培訓了超過了一百萬的數據科學家,并且贊助了AMP Lab,AMP Lab就是Spark開源社區的開發者。
第二個就是對Spark Core的貢獻,因為在IBM內部,已經建立了Spark技術中心,超過了300名的工程師在進行Spark Core的開發。并且IBM開源的機器學習庫,也成為了databricks的合作伙伴。
產品方面,在CDL就有一些Spark產品,集成到IBM本身的AOP環境里面,(注:AOP也是一個開源的軟件包),包括Big Insight里面都集成了Spark的元素,IBM總共投入了超過3500名的員工在Spark的相關工作上。
1、Spark核心組件
在Spark Build-in組件中,最基礎的就是Spark Core,它是所有應用程序架構的基礎。SparkSQL、Spark Streaming、MLLib、GraphX都是Spark Build-in組件提供的應用組件的子架構。
SparkSQL是對結構化數據的處理,Spark Streaming是對實時流數據的處理 ,MLLib就是對機器學習庫的處理,GraphX是對并行圖計算的處理。
不管是哪一個應用上的子架構,它都是基于RDD上的應用框架。實際上用戶可以基于RDD來開發出不同領域上的子框架,運用Spark Build-in組件來執行。
2、Spark應用程序的架構
在每一個Spark應用程序中,只有一個Driver Program,和若干個Executor。大家可以看到右邊的Work Node,我們可以認為Work Node就是一個物理機器,所有的應用程序都是從Driver開始的,Driver Program會先初始化一個SparkContext,作為應用程序的入口,每一個Spark應用程序只有一個SparkContext。SparkContext作為入口,再去初始化一些作業調度和任務調度,通過Cluster Manager將任務分配到各個節點上,由Worker Node上面的執行器來執行任務。一個Spark應用程序有多個Executor,一個Executor上又可以執行多個task,這就是Spark并行計算的框架。
此外,Executor除了可以處理task,還可以將數據存在Cache或者HDFS上面。
3、Spark運行模式
一般我們看到的是下圖中的前四種Spark運行模式:Local、standalone、Yarn和Mesos。Cloud就是一種外部base的Spark的運行環境。
Local就是指本地的模式,用戶可以在本地上執行Spark程序,Local[N]即指的是使用多少個線程;Standalone是Spark自己自帶的一個運行模式,需要用戶自己去部署spark到相關的節點上;Yarn和Mesos是做資源管理的,它也是Hadoop生態系統里面的,如果使用Yarn和Mesos,那么就是這兩者去做資源管理,Spark來做資源調度。
不管是那種運行模式,它都還細分為兩種,一種是client模式:一種是cluster模式,那么怎么區分這兩種模式呢?可以用到架構圖中的Driver Program。Driver Program如果在集群里面,那就是cluster模式;如果在集群外面,那就是client模式。
4、彈性分布式數據集RDD
RDD有幾個特點,一是它不可變,二是它被分區。我們在java或者C++里,所用的基本數據集、數組都可以被更改,但是RDD是不能被更改的,它只能產生新的RDD,也就是說Scala是一種函數式的編程語言。函數式的編程語言不主張就地更改現有的所有的數據,而是在已有的數據上產生一個新的數據,主要是做transform的工作,即映射的工作。
RDD不可更改,但可以分布到不同的Partition上,對用戶來說,就實現了以操作本地集合的方式來操作分布式數據集的抽象實現。RDD本身是一個抽象的概念,它不是真實存在的,那么它分配到各個節點上,對用戶來說是透明的,用戶只要按照自己操作本地數據集的方法去操作RDD就可以了,不用管它是怎么分配到各個Partition上面的。
在操作上,RDD主要有兩種方式,一種是Transform,一種是Action。Transform的操作呢,就是將一個RDD轉換成一個新的RDD,但是它有個特點,就是延遲執行;第二種操作就是Action,用戶要么寫數據,要么給應用程序返回某些信息。當你執行Action的時候,Transform才會被觸發,這也就是延遲執行的意思。
看一下右邊的代碼,這是一個Scala的代碼,在第一行,它去創建了一個Spark的Context,去讀一個文件。然后這個文件做了三個操作,第一個是map,第二個是filter,第三個是save,前面兩個動作就是一個Transform,map的意思就是映射,filter就是過濾,save就是寫。當我”寫”的這個程度執行到map和filter這一步時,它不會去執行,等我的save動作開始的時候,它才會執行去前面兩個。
5、Spark程序的執行
了解了RDD和Spark運行原理之后,我們來從整體看一下Spark程序是怎么執行的。
還是之前的三行代碼,前兩步是Transform,最后一步是Action。那么這一系列RDD就做一系列的Transform,從第一步開始轉;DAG就是一個調度器,Spark context會初始化一個任務調度器,任務調度器就會將RDD的一系列轉換切分成不同的階段,由任務調度器將不同的階段上分成不同的task set,通過Cluster Manager去調度這些task,把這些task set分布到不同的Executor上去執行。
6、Spark DataFrame
很多人會問,已經有RDD,為什么還要有DataFrame?DataFrame API是2015年發布的,Spark1.3之后就有,它是以命名列的方式去組織分布式的數據集。
Spark上面原來主要是為了big data,大數據平臺,它很多都是非結構化數據。非結構化數據需要用戶自己去組織映射,而DataFrame就提供了一些現成的,用戶可以通過操作關系表去操作大數據平臺上的數據。這樣很多的data scientists就可以使用原來使關系數據庫的只是和方式去操作大數據平臺上的數據。
DataFrame支持的數據源也很多,比如說JSON、Hive、JDBC等。
DataFrame還有存在的另外一個理由:我們可以分析上表,藍色部分代表著RDD去操縱不同語言的同樣數量集時的性能。可以看到,RDD在Python上的性能比較差,Scala的性能比較好一些。但是從綠色的部分來看,用DataFrame來編寫程序的時候,他們的性能是一樣的,也就是說RDD在操作不同的語言時,性能表現不一樣,但是用DataFrame去操作時,性能表現是一樣的,并且性能總體要高于RDD。
下面是DataFrame的一個簡單示例。
右邊同樣是用Scala寫的一段代碼,這就是sqlContext,因為它支持JSON文件,直接點JsonFile,讀進來這個json文件。下面直接對這個DataFrame
df.groupBy(“ages”).count().show(),show出來的方式就是一個表的方式。這個操作就很簡單,用戶不用再做map操作,如果是用RDD操作的話,用戶需要自己對數列里的每一塊數據作處理。
7、Spark編程語言
在編程語言上,Spark目前支持的有以下四種:
8、Spark使用方式
使用上,如果本地有Spark集群,就有兩種操作方式:一種是用Spark-shell,即交互式命令行;交互式的命令操作很簡單,就和java一樣,一行一行敲進去,它會交互式地告訴你,一行一行包括的是什么;這個地方也可以把一段代碼復制過去,邊運行邊調試。一般來講,交互式命令用Local模式就可以了。
第二種是直接用Spark-submit,一般在開發工程項目時使用較多;Spark-submit有幾個必要的參數,一個是master,就是運行模式必須有;還有幾個參數也必須有,比如class,java包的位置等。此外可以根據Spark-submit后面的help命令,來查看submit有多少參數,每個參數是什么意思。
此外可以通過Web-based NoteBook來使用Spark,在IBM的workbench上提供了Jupyter和Zepplin兩種NoteBook的方式。
詳情請咨詢!
客服熱線:023-66090381
本站文章除注明轉載外,均為本站原創或翻譯。歡迎任何形式的轉載,但請務必注明出處、不得修改原文相關鏈接,如果存在內容上的異議請郵件反饋至chenjj@fc6vip.cn