《循序漸進學Spark 》Spark架構與集群環境
本節書摘來自華章出版社《循序漸進學Spark 》一書中的第1章,第1節,作者 小象學院 楊 磊,更多章節內容可以訪問雲棲社區“華章計算機”公眾號查看。
Spark架構與集群環境
本章首先介紹Spark大數據處理框架的基本概念,然後介紹Spark生態係統的主要組成部分,包括Spark SQL、Spark Streaming、MLlib和GraphX,接著簡要描述了Spark的架構,便於讀者認識和把握,最後描述了Spark集群環境搭建及Spark開發環境的構建方法。
1.1 Spark概述與架構
隨著互聯網規模的爆發式增長,不斷增加的數據量要求應用程序能夠延伸到更大的集群中去計算。與單台機器計算不同,集群計算引發了幾個關鍵問題,如集群計算資源的共享、單點宕機、節點執行緩慢及程序的並行化。針對這幾個集群環境的問題,許多大數據處理框架應運而生。比如Google的MapReduce,它提出了簡單、通用並具有自動容錯功能的批處理計算模型。但是MapReduce對於某些類型的計算並不適合,比如交互式和流式計算。基於這種類型需求的不一致性,大量不同於MapReduce的專門數據處理模型誕生了,如GraphLab、Impala、Storm等。大量數據模型的產生,引發的後果是對於大數據處理而言,針對不同類型的計算,通常需要一係列不同的處理框架才能完成。這些不同的處理框架由於天生的差異又帶來了一係列問題:重複計算、使用範圍的局限性、資源分配、統一管理,等等。
1.1.1 Spark概述
為了解決上述MapReduce及各種處理框架所帶來的問題,加州大學伯克利分校推出了Spark統一大數據處理框架。Spark是一種與Hadoop MapReduce類似的開源集群大數據計算分析框架。Spark基於內存計算,整合了內存計算的單元,所以相對於hadoop的集群處理方法,Spark在性能方麵更具優勢。Spark啟用了彈性內存分布式數據集,除了能夠提供交互式查詢外,還可以優化迭代工作負載。
從另一角度來看,Spark可以看作MapReduce的一種擴展。MapReduce之所以不擅長迭代式、交互式和流式的計算工作,主要因為它缺乏在計算的各個階段進行有效的資源共享,針對這一點, Spark創造性地引入了RDD(彈性分布式數據集)來解決這個問題。RDD的重要特性之一就是資源共享。
Spark基於內存計算,提高了大數據處理的實時性,同時兼具高容錯性和可伸縮性,更重要的是,Spark可以部署在大量廉價的硬件之上,形成集群。
提到Spark的優勢就不得不提到大家熟知的Hadoop。事實上,Hadoop主要解決了兩件事情:
1)數據的可靠存儲。
2)數據的分析處理。
相應地,Hadoop也主要包括兩個核心部分:
1)分布式文件係統(Hadoop Distributed File System,HDFS):在集群上提供高可靠的文件存儲,通過將文件塊保存多個副本的辦法解決服務器或硬盤故障的問題。
2)計算框架MapReduce:通過簡單的Mapper和Reducer的抽象提供一個編程模型,可以在一個由幾十台,甚至上百台機器組成的不可靠集群上並發地、分布式地處理大量的數據集,而把並發、分布式(如機器間通信)和故障恢複等計算細節隱藏起來。
Spark是MapReduce的一種更優的替代方案,可以兼容HDFS等分布式存儲層,也可以兼容現有的Hadoop生態係統,同時彌補MapReduce的不足。
與Hadoop MapReduce相比,Spark的優勢如下:
中間結果:基於MapReduce的計算引擎通常將中間結果輸出到磁盤上,以達到存儲和容錯的目的。由於任務管道承接的緣故,一切查詢操作都會產生很多串聯的Stage,這些Stage輸出的中間結果存儲於HDFS。而Spark將執行操作抽象為通用的有向無環圖(DAG),可以將多個Stage的任務串聯或者並行執行,而無須將Stage中間結果輸出到HDFS中。
執行策略:MapReduce在數據Shuffle之前,需要花費大量時間來排序,而Spark不需要對所有情景都進行排序。由於采用了DAG的執行計劃,每一次輸出的中間結果都可以緩存在內存中。
任務調度的開銷:MapReduce係統是為了處理長達數小時的批量作業而設計的,在某些極端情況下,提交任務的延遲非常高。而Spark采用了事件驅動的類庫AKKA來啟動任務,通過線程池複用線程來避免線程啟動及切換產生的開銷。
更好的容錯性:RDD之間維護了血緣關係(lineage),一旦某個RDD失敗了,就能通過父RDD自動重建,保證了容錯性。
高速:基於內存的Spark計算速度大約是基於磁盤的Hadoop MapReduce的100倍。
易用:相同的應用程序代碼量一般比Hadoop MapReduce少50%~80%。
提供了豐富的API:與此同時,Spark支持多語言編程,如Scala、Python及Java,便於開發者在自己熟悉的環境下工作。Spark自帶了80多個算子,同時允許在Spark Shell環境下進行交互式計算,開發者可以像書寫單機程序一樣開發分布式程序,輕鬆利用Spark搭建大數據內存計算平台,並利用內存計算特性,實時處理海量數據。
1.1.2 Spark生態
Spark大數據計算平台包含許多子模塊,構成了整個Spark的生態係統,其中Spark為核心。
伯克利將整個Spark的生態係統稱為伯克利數據分析棧(BDAS),其結構如圖1-1所示。
以下簡要介紹BDAS的各個組成部分。
1. Spark Core
Spark Core是整個BDAS的核心組件,是一種大數據分布式處理框架,不僅實現了MapReduce的算子map函數和reduce函數及計算模型,還提供如filter、join、groupByKey等更豐富的算子。Spark將分布式數據抽象為彈性分布式數據集(RDD),實現了應用任務調度、RPC、序列化和壓縮,並為運行在其上的上層組件提供API。其底層采用Scala函數式語言書寫而成,並且深度借鑒Scala函數式的編程思想,提供與Scala類似的編程接口。
圖1-1 伯克利數據分析棧的結構
2. Mesos
Mesos是Apache下的開源分布式資源管理框架,被稱為分布式係統的內核,提供了類似YARN的功能,實現了高效的資源任務調度。
3. Spark Streaming
Spark Streaming是一種構建在Spark上的實時計算框架,它擴展了Spark處理大規模流式數據的能力。其吞吐量能夠超越現有主流流處理框架Storm,並提供豐富的API用於流數據計算。
4. MLlib
MLlib 是Spark對常用的機器學習算法的實現庫,同時包括相關的測試和數據生成器。MLlib 目前支持4種常見的機器學習問題:二元分類、回歸、聚類以及協同過濾,還包括一個底層的梯度下降優化基礎算法。
5. GraphX
GraphX是 Spark中用於圖和圖並行計算的API,可以認為是GraphLab和Pregel在Spark (Scala)上的重寫及優化,與其他分布式圖計算框架相比,GraphX最大的貢獻是,在Spark上提供一棧式數據解決方案,可以方便、高效地完成圖計算的一整套流水作業。
6. Spark SQL
Shark是構建在Spark和Hive基礎之上的數據倉庫。它提供了能夠查詢Hive中所存儲數據的一套SQL接口,兼容現有的Hive QL語法。熟悉Hive QL或者SQL的用戶可以基於Shark進行快速的Ad-Hoc、Reporting等類型的SQL查詢。由於其底層計算采用了Spark,性能比Mapreduce的Hive普遍快2倍以上,當數據全部存儲在內存時,要快10倍以上。2014年7月1日,Spark社區推出了Spark SQL,重新實現了SQL解析等原來Hive完成的工作,Spark SQL在功能上全覆蓋了原有的Shark,且具備更優秀的性能。
7. Alluxio
Alluxio(原名Tachyon)是一個分布式內存文件係統,可以理解為內存中的HDFS。為了提供更高的性能,將數據存儲剝離Java Heap。用戶可以基於Alluxio實現RDD或者文件的跨應用共享,並提供高容錯機製,保證數據的可靠性。
8. BlinkDB
BlinkDB是一個用於在海量數據上進行交互式SQL的近似查詢引擎。它允許用戶在查詢準確性和查詢響應時間之間做出權衡,執行相似查詢。
1.1.3 Spark架構
傳統的單機係統,雖然可以多核共享內存、磁盤等資源,但是當計算與存儲能力無法滿足大規模數據處理的需要時,麵對自身CPU與存儲無法擴展的先天限製,單機係統就力不從心了。
1. 分布式係統的架構
所謂的分布式係統,即為在網絡互連的多個計算單元執行任務的軟硬件係統,一般包括分布式操作係統、分布式數據庫係統、分布式應用程序等。本書介紹的Spark分布式計算框架,可以看作分布式軟件係統的組成部分,基於Spark,開發者可以編寫分布式計算程序。
直觀來看,大規模分布式係統由許多計算單元構成,每個計算單元之間鬆耦合。同時,每個計算單元都包含自己的CPU、內存、總線及硬盤等私有計算資源。這種分布式結構的最大特點在於不共享資源,與此同時,計算節點可以無限製擴展,計算能力和存儲能力也因而得到巨大增長。但是由於分布式架構在資源共享方麵的先天缺陷,開發者在書寫和優化程序時應引起注意。分布式係統架構如圖1-2所示。
為了減少網絡I/O開銷,分布式計算的一個核心原則是數據應該盡量做到本地計算。在計算過程中,每個計算單元之間需要傳輸信息,因此在信息傳輸較少時,分布式係統可以利用資源無限擴展的優勢達到高效率,這也是分布式係統的優勢。目前分布式係統在數據挖掘和決策支持等方麵有著廣泛的應用。
Spark正是基於這種分布式並行架構而產生,也可以利用分布式架構的優勢,根據需要,對計算能力和存儲能力進行擴展,以應對處理海量數據帶來的挑戰。同時,Spark的快速及容錯等特性,讓數據處理分析顯得遊刃有餘。
2. Spark架構
Spark架構采用了分布式計算中的Master-Slave模型。集群中運行Master進程的節點稱為Master,同樣,集群中含有Worker進程的節點為Slave。Master負責控製整個集群的運行;Worker節點相當於分布式係統中的計算節點,它接收Master節點指令並返回計算進程到Master;Executor負責任務的執行;Client是用戶提交應用的客戶端;Driver負責協調提交後的分布式應用。具體架構如圖1-3所示。
圖1-3 Spark架構
在Spark應用的執行過程中,Driver和Worker是相互對應的。Driver是應用邏輯執行的起點,負責Task任務的分發和調度;Worker負責管理計算節點並創建Executor來並行處理Task任務。Task執行過程中所需的文件和包由Driver序列化後傳輸給對應的Worker節點,Executor對相應分區的任務進行處理。
下麵介紹Spark架構中的組件。
1)Client: 提交應用的客戶端。
2)Driver: 執行Application中的main函數並創建SparkContext。
3) ClusterManager: 在YARN模式中為資源管理器。在Standalone模式中為Master(主節點),控製整個集群。
4) Worker: 從節點,負責控製計算節點。啟動Executor或Driver,在YARN模式中為NodeManager。
5) Executor: 在計算節點上執行任務的組件。
6) SparkContext: 應用的上下文,控製應用的生命周期。
7) RDD: 彈性分布式數據集,Spark的基本計算單元,一組RDD可形成有向無環圖。
8) DAG Scheduler: 根據應用構建基於Stage的DAG,並將Stage提交給Task Scheduler。
9) Task Scheduler: 將Task分發給Executor執行。
10) SparkEnv: 線程級別的上下文,存儲運行時重要組件的應用,具體如下:
①SparkConf: 存儲配置信息。
②BroadcastManager: 負責廣播變量的控製及元信息的存儲。
③BlockManager: 負責Block的管理、創建和查找。
④MetricsSystem: 監控運行時的性能指標。
⑤MapOutputTracker: 負責shuffle元信息的存儲。
Spark架構揭示了Spark的具體流程如下:
1) 用戶在Client提交了應用。
2) Master找到Worker,並啟動Driver。
3) Driver向資源管理器(YARN模式)或者Master(Standalone模式)申請資源,並將應用轉化為RDD Graph。
4) DAG Scheduler將RDD Graph轉化為Stage的有向無環圖提交給Task Scheduler。
5) Task Scheduler提交任務給Executor執行。
3. Spark運行邏輯
下麵舉例說明Spark的運行邏輯,如圖1-4所示,在Action算子被觸發之後,所有累積的算子會形成一個有向無環圖DAG。Spark會根據RDD之間不同的依賴關係形成Stage,每個Stage都包含一係列函數執行流水線。圖1-4中A、B、C、D、E、F為不同的RDD,RDD內的方框為RDD的分區。
圖1-4 Spark執行RDD Graph
圖1-4中的運行邏輯如下:
1)數據從HDFS輸入Spark。
2)RDD A、RDD C 經過flatMap與Map操作後,分別轉換為RDD B 和 RDD D。
3)RDD D經過reduceByKey操作轉換為RDD E。
4)RDD B 與 RDD E 進行join操作轉換為RDD F。
5)RDD F 通過函數saveAsSequenceFile輸出保存到HDFS中。
1.2 在Linux集群上部署Spark
Spark安裝部署比較簡單,用戶可以登錄其官方網站(https://spark.apache.org/downloads.html)下載Spark最新版本或曆史版本,也可以查閱Spark相關文檔作為參考。本書開始寫作時,Spark剛剛發布1.5.0版,因此本章所述的環境搭建均以Spark 1.5.0版為例。
Spark使用了Hadoop的HDFS作為持久化存儲層,因此安裝Spark時,應先安裝與Spark版本相兼容的Hadoop。
本節以阿裏雲Linux主機為例,描述集群環境及Spark開發環境的搭建過程。
Spark計算框架以Scala語言開發,因此部署Spark首先需要安裝Scala及JDK(Spark1.5.0需要JDK1.7.0或更高版本)。另外,Spark計算框架基於持久化層,如Hadoop HDFS,因此本章也會簡述Hadoop的安裝配置。
1.2.1 安裝OpenJDK
Spark1.5.0要求OpenJDK1.7.0或更高版本。 以本機Linux X86機器為例,OpenJDK的安裝步驟如下所示:
1)查詢服務器上可用的JDK版本。在終端輸入如下命令:
yum list "*JDK*"
yum 會列出服務器上的JDK版本。
2)安裝JDK。在終端輸入如下命令:
yum install java-1.7.0-openjdk-devel.x86
cd /usr/lib/jvm
ln -s java-1.7.0-openjdk.x86 java-1.7
3) JDK環境配置。
① 用編輯器打開/etc/profile文件,加入如下內容:
export JAVA_HOME=/usr/lib/jvm/java-1.7
export PATH=$PATH:$JAVA_HOME/bin:$JAVA_HOME/jre/bin
關閉並保存profile文件。
② 輸入命令 source /etc/profile 讓配置生效。
1.2.2 安裝Scala
登錄Scala官網(https://www.scala-lang.org/download/)下載最新版本: scala-2.11.7.tgz
1)安裝。
tar zxvf scala-2.11.7.tgz -C /usr/local
cd /usr/local
ln -s scala-2.11.7 scala
2) 配置:打開/etc/profile, 加入如下語句:
export SCALA_HOME=/usr/local/scala
export PATH=$PATH:$SCALA_HOME/bin
1.2.3 配置SSH免密碼登錄
在分布式係統中,如Hadoop與Spark,通常使用SSH(安全協議,Secure Shell)服務來啟動Slave節點上的程序,當節點數量比較大時,頻繁地輸入密碼進行身份認證是一項非常艱難的體驗。為了簡化這個問題,可以使用”公私鑰”認證的方式來達到SSH免密碼登錄。
首先在Master節點上創建一對公私鑰(公鑰文件:~/.ssh/id_rsa.pub; 私鑰文件:~/.ssh/id_rsa),然後把公鑰拷貝到Worker節點上(~/.ssh/authorized_keys)。二者交互步驟如下:
1) Master通過SSH連接Worker時,Worker生成一個隨機數然後用公鑰加密後,發回給Master。
2) Master收到加密數後,用私鑰解密,並將解密數回傳給Worker。
3) Worker確認解密數正確之後,允許Master連接。
如果配置好SSH免密碼登錄之後,在以上交互中就無須用戶輸入密碼了。下麵介紹安裝與配置過程。
1)安裝SSH: yum install ssh
2)生成公私鑰對: ssh-keygen -t rsa
一直按回車鍵,不需要輸入。執行完成後會在~/.ssh目錄下看到已生成id_rsa.pub與id_rsa兩個密鑰文件。其中id_rsa.pub為公鑰。
3)拷貝公鑰到Worker機器: scp ~/.ssh/id_rsa.pub <用戶名>@<worker機器ip>:~/.ssh
4)在Worker節點上,將公鑰文件重命名為authorized_keys: mv id_rsa.pub auth-orized_keys。類似地,在所有Worker節點上都可以配置SSH免密碼登錄。
1.2.4 Hadoop的安裝配置
登錄Hadoop官網(https://hadoop.apache.org/releases.html)下載Hadoop 2.6.0安裝包 hadoop-2.6.0.tar.gz。然後解壓至本地指定目錄。
tar zxvf hadoop-2.6.0.tar.gz -C /usr/local
ln -s hadoop-2.6.0 hadoop
下麵講解Hadoop的配置。
1)打開/etc/profile,末尾加入:
export HADOOP_INSTALL=/usr/local/hadoop
export PATH=$PATH:$HADOOP_INSTALL/bin
export PATH=$PATH:$HADOOP_INSTALL/sbin
export HADOOP_MAPRED_HOME=$HADOOP_INSTALL
export HADOOP_COMMON_HOME=$HADOOP_INSTALL
export HADOOP_HDFS_HOME=$HADOOP_INSTALL
export YARN_HOME=$HADOOP_INSTALL
執行 __source /etc/profile__使其生效,然後進入Hadoop配置目錄:/usr/local/hadoop/etc/hadoop,配置Hadoop。
2)配置hadoop_env.sh。
export JAVA_HOME=/usr/lib/jvm/java-1.7
3)配置core-site.xml。
<property>
<name>fs.defaultFS</name>
<value>hdfs://Master:9000</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>file:/root/bigdata/tmp</value>
</property>
<property>
<name>io.file.buffer.size</name>
<value>131702</value>
</property>
4)配置yarn-site.xml。
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.nodemanager.auxservices.mapreduce.shuffle.class</name>
<value>org.apache.hadoop.mapred.ShuffleHandler</value>
</property>
<property>
<name>yarn.resourcemanager.address</name>
<value>Master:8032</value>
</property>
<property>
<name>yarn.resourcemanager.scheduler.address</name>
<value>Master:8030</value>
</property>
<property>
<name>yarn.resourcemanager.resource-tracker.address</name>
<value>Master:8031</value>
</property>
<property>
<name>yarn.resourcemanager.admin.address</name>
<value>Master:8033</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.address</name>
<value>Master:8088</value>
</property>
5) 配置mapred-site.xml。
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<property>
<name>mapreduce.jobhistory.address</name>
<value>Master:10020</value>
</property>
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>Master:19888</value>
</property>
6) 創建namenode和datanode目錄,並配置路徑。
① 創建目錄。
mkdir -p /hdfs/namenode
mkdir -p /hdfs/datanode
② 在hdfs-site.xml中配置路徑。
<property>
<name>dfs.namenode.name.dir</name>
<value>file:/hdfs/namenode</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>file:/hdfs/datanode</value>
</property>
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>Master:9001</value>
</property>
<property>
<name>dfs.webhdfs.enabled</name>
<value>true</value>
</property>
7) 配置slaves文件,在其中加入所有從節點主機名,例如:
x.x.x.x worker1
x.x.x.x worker2
……
8) 格式化namenode:
/usr/local/hadoop/bin/hadoop namenode -format
至此,Hadoop配置過程基本完成。
1.2.5 Spark的安裝部署
登錄Spark官網下載頁麵(https://spark.apache.org/downloads.html)下載Spark。這裏選擇最新的Spark 1.5.0版spark-1.5.0-bin-hadoop2.6.tgz(Pre-built for Hadoop2.6 and later)。
然後解壓spark安裝包至本地指定目錄:
tar zxvf spark-1.5.0-bin-hadoop2.6.tgz -C /usr/local/
ln -s spark-1.5.0-bin-hadoop2.6 spark
下麵讓我們開始Spark的配置之旅吧。
1) 打開/etc/profile,末尾加入:
export SPARK_HOME=/usr/local/spark
PATH=$PATH:${SPARK_HOME}/bin
關閉並保存profile,然後命令行執行 source /etc/profile 使配置生效。
2) 打開/etc/hosts,加入集群中Master及各個Worker節點的ip與hostname配對。
x.x.x.x Master-name
x.x.x.x worker1
x.x.x.x worker2
x.x.x.x worker3
……
3) 進入/usr/local/spark/conf,在命令行執行:
cp spark-env.sh.template spark-env.sh
vi spark-env.sh
末尾加入:
export JAVA_HOME=/usr/lib/jvm/java-1.7
export SCALA_HOME=/usr/local/scala
export SPARK_MASTER_IP=112.74.197.158<以本機為例>
export SPARK_WORKER_MEMORY=1g
保存並退出,執行命令:
cp slaves.template slaves
vi slaves
在其中加入各個Worker節點的hostname。這裏以四台機器(master、worker1、worker2、worker3)為例,那麼slaves文件內容如下:
worker1
worker2
worker3
1.2.6 Hadoop與Spark的集群複製
前麵完成了Master主機上Hadoop與Spark的搭建,現在我們將該環境及部分配置文件從Master分發到各個Worker節點上(以筆者環境為例)。在集群環境中,由一台主機向多台主機間的文件傳輸一般使用pssh工具來完成。為此,在Master上建立一個文件workerlist.txt,其中保存了所有Worker節點的IP,每次文件的分發隻需要一行命令即可完成。
1) 複製JDK環境:
pssh -h workerlist -r /usr/lib/jvm/java-1.7 /
2) 複製scala環境:
pssh -h workerlist -r /usr/local/scala /
3) 複製Hadoop:
pssh -h workerlist -r /usr/local/hadoop /
4) 複製Spark環境:
pssh -h workerlist -r /usr/local/spark /
5) 複製係統配置文件:
pssh -h workerlist /etc/hosts /
pssh -h workerlist /etc/profile /
至此,Spark Linux集群環境搭建完畢。
1.3 Spark 集群試運行
下麵試運行Spark。
1)在Master主機上,分別啟動Hadoop與Spark。
cd /usr/local/hadoop/sbin/
./start-all.sh
cd /usr/local/spark/sbin
./start-all.sh
2) 檢查Master與Worker進程是否在各自節點上啟動。在Master主機上,執行命令 jps,如圖1-5所示。
圖1-5 在Master主機上執行jps命令
在Worker節點上,以Worker1為例,執行命令jps,如圖1-6所示。
從圖1-6中可以清晰地看到,Master進程與Worker及相關進程在各自節點上成功運行,Hadoop與Spark運行正常。
圖1-6 在Worker節點上執行jps命令
3) 通過Spark Web UI查看集群狀態。在瀏覽器中輸入Master的IP與端口,打開Spark Web UI,如圖1-7所示。
從圖1-7中可以看到,當集群內僅有一個Worker節點時,Spark Web UI顯示該節點處於Alive狀態,CPU Cores為1,內存為1GB。 此頁麵會列出集群中所有啟動後的Worker節點及應用的信息。
圖1-7 Spark Web UI界麵
4) 運行樣例。Spark自帶了一些樣例程序可供試運行。在Spark根目錄下,example/src/main文件夾中存放著Scala、Java、Python及用R語言編寫的樣例,用戶可以運行其中的某個樣例程序。先拷貝到Spark根目錄下,然後執行bin/run-example [class] [params]即可。例如可以在Master主機命令行執行:
./run-example SparkPi 10
然後可以看到該應用的輸出,在Spark Web UI上也可以查看應用的狀態及其他信息。
1.4 Intellij IDEA的安裝與配置
Intellij IDE是目前最流行的Spark開發環境。本節主要介紹Intellij開發工具的安裝與配置。Intellij不但可以開發Spark應用,還可以作為Spark源代碼的閱讀器。
1.4.1 Intellij的安裝
Intellij開發環境依賴JDK、Scala。
1. JDK的安裝
Intellij IDE需要安裝JDK 1.7或更高版本。Open JDK1.7的安裝與配置前文中已講過,這裏不再贅述。
2. Scala的安裝
Scala的安裝與配置前文已講過,此處不再贅述。
3. Intellij的安裝
登錄Intellij官方網站(https://www.jetbrains.com/idea/)下載最新版Intellij linux安裝包ideaIC-14.1.5.tar.gz,然後執行如下步驟:
1)解壓: tar zxvf ideaIC-14.1.5.tar.gz -C /usr/
2)運行: 到解壓後的目錄執行 ./idea.sh
3)安裝Scala插件:打開“File”→“Settings”→“Plugins”→“Install JetBrain plugin”運行後彈出如圖1-8所示的對話框。
單擊右側Install plugin開始安裝Scala插件。
1.4.2 Intellij的配置
1)在Intellij IDEA中新建Scala項目,命名為“HelloScala”,如圖1-9所示。
2)選擇菜單“File”→“Project Structure”→“Libraries”,單擊“+”號,選擇
“java”,定位至前麵Spark根目錄下的lib目錄,選中spark-assembly-1.5.0-hadoop2.6.0.jar,單擊OK按鈕。
3)與上一步相同,單擊“+”號,選擇“scala”,然後定位至前麵已安裝的scala目錄,scala相關庫會被自動引用。
圖1-8 Scala插件彈出窗口
圖1-9 在Intellij IDEA中新建Scala項目
4) 選擇菜單“File”→“Project Structure”→“Platform Settings”→“SDKs”,單擊“+”號,選擇JDK,定位至JDK安裝目錄,單擊OK按鈕。
至此,Intellij IDEA開發環境配置完畢,用戶可以用它開發自己的Spark程序了。
1.5 Eclipse IDE的安裝與配置
現在介紹如何安裝Eclipse。與Intellij IDEA類似,Eclipse環境依賴於JDK與Scala的安裝。JDK與Scala的安裝前文已經詳細講述過了,在此不再贅述。
對最初需要為Ecplise選擇版本號完全對應的Scala插件才可以新建Scala項目。不過自從有了Scala IDE工具,問題大大簡化了。因為Scala IDE中集成的Eclipse已經替我們完成了前麵的工作,用戶可以直接登錄官網(https://scala-ide.org/download/sdk.html)下載安裝。
安裝後,進入Scala IDE根目錄下的bin目錄, 執行 ./eclipse 啟動IDE。
然後選擇 “File”→“New”→“Scala Project” 打開項目配置頁。
輸入項目名稱,如HelloScala, 然後選擇已經安裝好的JDK版本,單擊Finish按鈕。接下來就可以進行開發工作了,如圖1-10所示。
圖1-10 已經創建好的HelloScala項目
1.6 使用Spark Shell開發運行Spark程序
Spark Shell是一種學習API的簡單途徑,也是分析數據集交互的有力工具。
雖然本章還沒涉及Spark的具體技術細節,但從總體上說,Spark彈性數據集RDD有兩種創建方式:
從文件係統輸入(如HDFS)。
從已存在的RDD轉換得到新的RDD。
現在我們從RDD入手,利用Spark Shell簡單演示如何書寫並運行Spark程序。下麵以word count這個經典例子來說明。
1)啟動spark shell: cd 進SPARK_HOME/bin, 執行命令。
./spark-shell
2)進入scala命令行,執行如下命令:
scala> val file = sc.textFile("hdfs://localhost:50040/hellosparkshell")
scala> val count = file.flatMap(line => line.split(" ")).map(word => (word, 1)).reduceByKey(_+_)
scala> count.collect()
首先從本機上讀取文件hellosparkshell,然後解析該文件,最後統計單詞及其數量並輸出如下:
15/09/29 16:11:46 INFO spark.SparkContext: Job finished: collect at <console>:17, took 1.624248037 s
res5: Array[(String, Int)] = Array((hello,12), (spark,12), (shell,12), (this,1), (is,1), (chapter,1), (three,1)
1.7 本章小結
本章著重描述了Spark的生態及架構,使讀者對Spark的平台體係有初步的了解。進而描述了如何在Linux平台上構建Spark集群,幫助讀者構建自己的Spark平台。最後又著重描述了如何搭建Spark開發環境,有助於讀者對Spark開發工具進行一定了解,並獨立搭建開發環境。
最後更新:2017-05-19 15:02:58