1 Spark基本概念
1.1Spark是什么
Spark使用Scala語言進行實現,它是一種面向對象、函數式編程語言,能夠像操作本地集合對象一樣輕松地操作分布式數據集(Scala 提供一個稱為 Actor 的並行模型,其中Actor通過它的收件箱來發送和接收非同步信息而不是共享數據,該方式被稱為:Shared Nothing 模型)。在Spark官網上介紹,它具有運行速度快、易用性好、通用性強和隨處運行等特點。
Apache Spark 是專為大規模數據處理而設計的快速通用的計算引擎。Spark是UC Berkeley AMP lab (加州大學伯克利分校的AMP實驗室)所開源的類Hadoop MapReduce的通用並行計算框架,Spark,擁有Hadoop MapReduce所具有的優點;但不同於MapReduce的是Job中間輸出結果可以保存在內存中,從而不再需要讀寫HDFS,因此Spark能更好地適用於數據挖掘與機器學習等需要迭代的MapReduce的算法。
Spark是Scala編寫,方便快速編程。
1.2 Spark產生的技術背景
(1)為什么會有Spark?因為傳統的並行計算模型無法有效的解決迭代計算(iterative)和交互式計算(interactive);而Spark的使命便是解決這兩個問題,這也是他存在的價值和理由。
(2)Spark如何解決迭代計算?其主要實現思想就是RDD,把所有計算的數據保存在分布式的內存中。迭代計算通常情況下都是對同一個數據集做反復的迭代計算,數據在內存中將大大提升IO操作。這也是Spark涉及的核心:內存計算。
(3)Spark如何實現交互式計算?因為Spark是用scala語言實現的,Spark和scala能夠緊密的集成,所以Spark可以完美的運用scala的解釋器,使得其中的scala可以向操作本地集合對象一樣輕松操作分布式數據集。
(4)Spark和RDD的關系?可以理解為:RDD是一種具有容錯性基於內存的集群計算抽象方法,Spark則是這個抽象方法的實現。
粗粒度:表示類別級,即僅考慮對象的類別(the type of object),不考慮對象的某個特 定實例。比如,用戶管理中,創建、刪除,對所有的用戶都一視同仁,並不區分操作的具體對象實例。
細粒度:表示實例級,即需要考慮具體對象的實例(the instance of object),當然,細粒度是在考慮粗粒度的對象類別之后才再考慮特定實例。比如,合同管理中,列表、刪除,需要區分該合同實例是否為當前用戶所創建。
1.3 Spark的優缺點及與其他技術的對比
1)運行速度快
Spark擁有DAG執行引擎,支持在內存中對數據進行迭代計算。官方提供的數據表明,如果數據由磁盤讀取,速度是Hadoop MapReduce的10倍以上,如果數據從內存中讀取,速度可以高達100多倍。
2)易用性好
Spark不僅支持Scala編寫應用程序,而且支持Java和Python等語言進行編寫,特別是Scala是一種高效、可拓展的語言,能夠用簡潔的代碼處理較為復雜的處理工作。
3)通用性強
Spark生態圈即BDAS(伯克利數據分析棧)包含了Spark Core、Spark SQL、Spark Streaming、MLLib和GraphX等組件,這些組件分別處理Spark Core提供內存計算框架、SparkStreaming的實時處理應用、Spark SQL的即席查詢、MLlib或MLbase的機器學習和GraphX的圖處理,它們都是由AMP實驗室提供,能夠無縫的集成並提供一站式解決平台。
4)隨處運行
Spark具有很強的適應性,能夠讀取HDFS、Cassandra、HBase、S3和Techyon為持久層讀寫原生數據,能夠以Mesos、YARN和自身攜帶的Standalone作為資源管理器調度job,來完成Spark應用程序的計算。
Spark與MapReduce的區別
都是分布式計算框架,Spark基於內存,MR基於內存。Spark處理數據的能力一般是MR的十倍以上,Spark中除了基於內存計算外,還有DAG有向無環圖來切分任務的執行先后順序。
1.4 Spark的應用場景
目前大數據處理場景有以下幾個類型:
- 復雜的批量處理(Batch Data Processing),偏重點在於處理海量數據的能力,至於處理速度可忍受,通常的時間可能是在數十分鍾到數小時;
- 基於歷史數據的交互式查詢(Interactive Query),通常的時間在數十秒到數十分鍾之間
- 基於實時數據流的數據處理(Streaming Data Processing),通常在數百毫秒到數秒之間
目前對以上三種場景需求都有比較成熟的處理框架,第一種情況可以用Hadoop的MapReduce來進行批量海量數據處理,第二種情況可以Impala進行交互式查詢,對於第三中情況可以用Storm分布式處理框架處理實時流式數據。以上三者都是比較獨立,各自一套維護成本比較高,而Spark的出現能夠一站式平台滿意以上需求。
通過以上分析,總結Spark場景有以下幾個:
lSpark是基於內存的迭代計算框架,適用於需要多次操作特定數據集的應用場合。需要反復操作的次數越多,所需讀取的數據量越大,受益越大,數據量小但是計算密集度較大的場合,受益就相對較小
l由於RDD的特性,Spark不適用那種異步細粒度更新狀態的應用,例如web服務的存儲或者是增量的web爬蟲和索引。就是對於那種增量修改的應用模型不適合
l數據量不是特別大,但是要求實時統計分析需求
1.5 Spark生態系統
Spark生態圈也稱為BDAS(伯克利數據分析棧),是伯克利APMLab實驗室打造的,力圖在算法(Algorithms)、機器(Machines)、人(People)之間通過大規模集成來展現大數據應用的一個平台。伯克利AMPLab運用大數據、雲計算、通信等各種資源以及各種靈活的技術方案,對海量不透明的數據進行甄別並轉化為有用的信息,以供人們更好的理解世界。該生態圈已經涉及到機器學習、數據挖掘、數據庫、信息檢索、自然語言處理和語音識別等多個領域。
Spark生態圈以Spark Core為核心,從HDFS、Amazon S3和HBase等持久層讀取數據,以MESS、YARN和自身攜帶的Standalone為資源管理器調度Job完成Spark應用程序的計算。 這些應用程序可以來自於不同的組件,如Spark Shell/Spark Submit的批處理、Spark Streaming的實時處理應用、Spark SQL的即席查詢、BlinkDB的權衡查詢、MLlib/MLbase的機器學習、GraphX的圖處理和SparkR的數學計算等等。
1.6 Spark運行模式
Local
多用於本地測試,如在eclipse,idea中寫程序測試等。
Standalone
Standalone是Spark自帶的一個資源調度框架,它支持完全分布式。
Yarn
Hadoop生態圈里面的一個資源調度框架,Spark也是可以基於Yarn來計算的。
Mesos
資源調度框架。
要基於Yarn來進行資源調度,必須實現AppalicationMaster接口,Spark實現了這個接口,所以可以基於Yarn。
2 Spark環境搭建
standalone模式搭建
1、檢查基礎環境是否滿足,如jdk版本等
本文所述,均是建立在VMware搭建的虛擬機環境中,其實生產環境也是一致的。搭建虛擬機安裝hadoop等過程,請參見本博客相關博文(還呆在草稿箱中,尚未發布。。。)
2、下載安裝包,解壓 以1.6.0為例
此處改了個名,改不改無所謂,隨意。
3、修改conf目錄下的slaves.template文件,添加從節點
4、修改spark-env.sh,並同步到其他節點
SPARK_MASTER_IP:master的ip
SPARK_MASTER_PORT:提交任務的端口,默認是7077
SPARK_WORKER_CORES:每個worker從節點能夠支配的core的個數
SPARK_WORKER_MEMORY:每個worker從節點能夠支配的內存數
5、啟動集群
進入sbin目錄下,執行當前目錄下的./start-all.sh
6、搭建客戶端
將spark安裝包原封不動的拷貝到一個新的節點上,然后,在新的節點上提交任務即可。
注意:
8080是Spark WEBUI界面的端口,7077是Spark任務提交的端口。
修改master的WEBUI端口:
修改start-master.sh即可。(隨意)
也可以在Master節點上導入臨時環境變量,只是作用於之后的程序,重啟就無效了。
刪除臨時環境變量:
yarn模式搭建
1、2、3、4、5、6步同standalone,
接下來在客戶端中配置
CDH安裝
真爽,直接點和選就可以了。可一套直接將全套大數據框架全部安裝完畢。此處因為沒有環境就不提供了,可參加官方文檔。
測試是否成功
計算圓周率π
standalone模式提交
./spark-submit \
--master spark://node1:7077 \
--class org.apache.spark.examples.SparkPi ../lib/spark-examples-1.6.0-hadoop2.6.0.jar 10000
yarn提交
./spark-submit \
--master yarn \
--class org.apache.spark.examples.SparkPi ../lib/spark-examples-1.6.0-hadoop2.6.0.jar 10000