什么是Spark
官方網(wǎng)站給出的定義是:
Apache Spark? is a unified analytics engine for large-scale data processing (是一個(gè)用于大規(guī)模數(shù)據(jù)處理提供的統(tǒng)一的數(shù)據(jù)分析引擎)
Spark的歷史
1.2009年侦另,Spark誕生于美國加州大學(xué)伯克利分校 (UC Berkeley) 的AMP (Algorithms, Machines and People) 實(shí)驗(yàn)室秩命,項(xiàng)目采用Scala語言編寫
2.2010年尉共,Spark 正式對外開源
3.2013年褒傅,Spark加入Apache孵化項(xiàng)目
4.如今弃锐,成為Apache的最重要的三大分布式計(jì)算系統(tǒng)開源項(xiàng)目之一(Hadoop、Spark殿托、Storm)
5.當(dāng)前版本已經(jīng)更新到3.0.0 (截止Jun 18, 2020)
Spark的主要特點(diǎn)
運(yùn)行快速 (Speed): Spark使用先進(jìn)的DAG (Directed Acyclic Graph, 有向無環(huán)圖)執(zhí)行引擎霹菊,以支持循環(huán)數(shù)據(jù)流與內(nèi)存計(jì)算,基于內(nèi)存的執(zhí)行速度可比Hadoop MapReduce快上百倍支竹,基于磁盤的執(zhí)行速度也能快十倍旋廷;
易用性 (Ease of Use): Spark支持使用Scala、Java礼搁、Python和R語言進(jìn)行編程饶碘,簡潔的API設(shè)計(jì)有助于用戶輕松構(gòu)建并行程序,并且可以通過Spark Shell進(jìn)行交互式編程馒吴;
通用性 (Generality): Spark提供了完整而強(qiáng)大的技術(shù)棧扎运,包括SQL查詢、流式計(jì)算饮戳、機(jī)器學(xué)習(xí)和圖算法組件豪治,這些組件可以無縫整合在同一個(gè)應(yīng)用中,足以應(yīng)對復(fù)雜的計(jì)算扯罐;
運(yùn)行模式多樣(Runs Everywhere):Spark可運(yùn)行于獨(dú)立的集群模式中负拟,或者運(yùn)行于Hadoop中,也可運(yùn)行于Amazon EC2等云環(huán)境中歹河,并且可以訪問HDFS掩浙、Cassandra、HBase秸歧、Hive等多種數(shù)據(jù)源
Spark生態(tài)圈
Spark的一些基本概念
- RDD:是彈性分布式數(shù)據(jù)集(Resilient Distributed Dataset)的簡稱,是分布式內(nèi)存的一個(gè)抽象概念纱耻,提供了一種高度受限的共享內(nèi)存模型芭梯;
- DAG:是Directed Acyclic Graph(有向無環(huán)圖)的簡稱,反映RDD之間的依賴關(guān)系弄喘;
- Executor:是運(yùn)行在工作節(jié)點(diǎn)(Worker Node)上的一個(gè)進(jìn)程玖喘,負(fù)責(zé)運(yùn)行任務(wù),并為應(yīng)用程序存儲數(shù)據(jù)蘑志;
- 應(yīng)用:用戶編寫的Spark應(yīng)用程序累奈;
- 任務(wù):運(yùn)行在Executor上的工作單元贬派;
- 作業(yè):一個(gè)作業(yè)包含多個(gè)RDD及作用于相應(yīng)RDD上的各種操作;
- 階段:是作業(yè)的基本調(diào)度單位澎媒,一個(gè)作業(yè)會(huì)分為多組任務(wù)搞乏,每組任務(wù)被稱為“階段”,或者也被稱為“任務(wù)集”戒努。
架構(gòu)設(shè)計(jì)
如下圖所示请敦,Spark運(yùn)行架構(gòu)包括集群資源管理器(Cluster Manager)、運(yùn)行作業(yè)任務(wù)的工作節(jié)點(diǎn)(Worker Node)储玫、每個(gè)應(yīng)用的任務(wù)控制節(jié)點(diǎn)(Driver)和每個(gè)工作節(jié)點(diǎn)上負(fù)責(zé)具體任務(wù)的執(zhí)行進(jìn)程(Executor)擎颖。其中秧饮,集群資源管理器可以是Spark自帶的資源管理器,也可以是YARN或Mesos等資源管理框架。與Hadoop MapReduce計(jì)算框架相比索烹,Spark所采用的Executor有兩個(gè)優(yōu)點(diǎn):一是利用多線程來執(zhí)行具體的任務(wù)(Hadoop MapReduce采用的是進(jìn)程模型)邓夕,減少任務(wù)的啟動(dòng)開銷括饶;二是Executor中有一個(gè)BlockManager存儲模塊冯乘,會(huì)將內(nèi)存和磁盤共同作為存儲設(shè)備,當(dāng)需要多輪迭代計(jì)算時(shí)齐媒,可以將中間結(jié)果存儲到這個(gè)存儲模塊里蒲每,下次需要時(shí),就可以直接讀該存儲模塊里的數(shù)據(jù)喻括,而不需要讀寫到HDFS等文件系統(tǒng)里邀杏,因而有效減少了IO開銷;或者在交互式查詢場景下唬血,預(yù)先將表緩存到該存儲系統(tǒng)上望蜡,從而可以提高讀寫IO性能
Spark的安裝
1.下載和解壓Spark安裝包
從Spark官網(wǎng)(https://spark.apache.org/downloads.html)下載安裝包,選擇Pre-built for Apache Hadoop 2.7,下載對應(yīng)安裝包spark-3.0.0-bin-hadoop2.7.tgz,并解壓到指定安裝目錄:
tar -zxvf sparl-3.0.0-bin-hadoop2.7.tgz -C /usr/local
然后重命名為spark-local
cp -r spark-3.0.0-bin-hadoop2.7 spark-local
2.設(shè)置Spark的環(huán)境變量以啟動(dòng)PySpark,將以下內(nèi)容添加到~/.bashrc, 然后source .bashrc
export SPARK_HOME = /usr/local/spark-local
export PATH = $PATH:/usr/local/spark-local/bin
export PYTHONPATH = $SPARK_HOME/python:$SPARK_HOME/python/lib/py4j-0.10.9-src.zip:$PYTHONPATH
export PATH = $SPARK_HOME/python:$PATH
3.啟動(dòng)PySpark shell,就可以在shell上面進(jìn)行一些交互式的測試
./bin/pyspark
Python 3.7.0 (default, July 19 2020, 06:48:10)
[GCC 5.4.0 20200719] on linux2
Type "help", "copyright", "credits" or "license" for more information.
Welcome to
____ __
/ __/__ ___ _____/ /__
_\ \/ _ \/ _ `/ __/ '_/
/__ / .__/\_,_/_/ /_/\_\ version 3.0.0
/_/
Using Python version 3.7.0 (default, July 19 2020 06:48:10)
SparkSession available as 'spark'.
<<<
4.PySpark命令及其常用參數(shù)
./bin/pyspark --master <master-url>
Spark的運(yùn)行模式取決于傳遞給SparkContext的Master URL的值拷恨。Master URL可以是以下任一種式:
* local 使用一個(gè)Worker線程本地化運(yùn)行SPARK(完全不并行)
* local[*] 使用邏輯CPU個(gè)數(shù)數(shù)量的線程來本地化運(yùn)行Spark
* local[K] 使用K個(gè)Worker線程本地化運(yùn)行Spark(理想情況下脖律,K應(yīng)該根據(jù)運(yùn)行機(jī)器的CPU核數(shù)設(shè)定)
* spark://HOST:PORT 連接到指定的Spark standalone master。默認(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。
需要強(qiáng)調(diào)的是分预,這里我們采用“本地模式”(local)運(yùn)行Spark,系統(tǒng)默認(rèn)是“bin/pyspark-master local[*]”,也就是使用本地所有CPU
Spark獨(dú)立應(yīng)用編程
接著我們通過一個(gè)簡單的應(yīng)用程序來演示如何通過 Spark API 編寫一個(gè)獨(dú)立應(yīng)用程序兢交。使用 Python進(jìn)行spark編程比Java和Scala簡單得多。
在進(jìn)行Python編程前笼痹,請先確定是否已經(jīng).bashrc中添加PYTHONPATH環(huán)境變量配喳。
接下來即可進(jìn)行Python編程.
新建一個(gè)test.py文件,并在test.py添加代碼
from pyspark import SparkContext
sc = SparkContext( 'local', 'test')
logFile = "file:///usr/local/spark/README.md"
logData = sc.textFile(logFile, 2).cache()
numAs = logData.filter(lambda line: 'a' in line).count()
numBs = logData.filter(lambda line: 'b' in line).count()
print('Lines with a: %s, Lines with b: %s' % (numAs, numBs))
$ python3 test.py
>>> Lines with a: 61, Lines with b: 30