Spark簡介
相較于國內(nèi)外較多的大數(shù)據(jù)處理框架亲配,Spark以基低延時的出色表現(xiàn)蔓涧,正在成為繼Hadoop的MapReduce之后构灸,新的上渴,最具有影響的大數(shù)據(jù)框架之一岸梨。以Spark為核心的生態(tài)圈,最底層為分布式存儲系統(tǒng)HDFS,S3,Hypertable或者其它格式的存儲系統(tǒng)如Hbase稠氮。資源管理采用Mesos,YARN等集群資源管理模式曹阔,或者spark自帶的獨(dú)立運(yùn)行模式 。Spark sql提供SQL查詢服務(wù)隔披,性能比Hive快3-50倍赃份。MLIB提供機(jī)器學(xué)習(xí)服務(wù);GraphX提供圖計算服務(wù)奢米;Spark Streaming將流式計算分解成一系列短小的批處理(Micro Bath)計算抓韩。
好處:資源利用率高。多種框架共享資源鬓长,使用均衡谒拴。實(shí)現(xiàn)數(shù)據(jù)共享。多種框架共享數(shù)據(jù)和硬件資源涉波,減少數(shù)據(jù)分散帶來的成本英上。有效降低運(yùn)維和管理成本:共享模式只需要少量的維護(hù)人員.
Spark已經(jīng)成為整合以大數(shù)據(jù)應(yīng)用的標(biāo)準(zhǔn)平臺:交互式查詢,包括SQL;實(shí)時流處理;復(fù)雜的分析啤覆,包括機(jī)器學(xué)習(xí)苍日,圖計算;批處理窗声。
Spark特點(diǎn):
快速:Spark有先進(jìn)的DAG執(zhí)行引擎易遣,支持循環(huán)數(shù)據(jù)流和內(nèi)存計算;Spark程序在內(nèi)存中的運(yùn)行速度 是Hadoop MapReduce運(yùn)行速度的100倍嫌佑,在磁盤上的運(yùn)行速度是Hadoop MapReduce運(yùn)行速度的10倍豆茫。
易用:Spark支持Java,Scala,Python語言。
通用:Spark可以與SQL,Streaming以及復(fù)雜的分析良好結(jié)合屋摇。
有效集成Hadoop:Spark可以指定Hadoop,Yarn的版本來編譯出合適的發(fā)行版本揩魂,Spark也能很容易地運(yùn)行在EC2,Mesos上,或以Standalong模式運(yùn)行炮温,并從HDFS,HBase,Cassandra 和其他Hadoop數(shù)據(jù)源讀取數(shù)據(jù)火脉。
Spark應(yīng)用場景:
1.快速查詢系統(tǒng),基于日志數(shù)據(jù)的快速查詢系統(tǒng)業(yè)務(wù)構(gòu)建于Spark之上柒啤,利用其快速查詢以及內(nèi)存表等優(yōu)勢倦挂,能夠承擔(dān)大部分日志數(shù)據(jù)的即時查詢工作;在性能方面担巩,普遍比Hive快2-10倍方援,如果使用內(nèi)存表的功能,性能將會比hive快百倍涛癌。
2.實(shí)時日志采集處理犯戏,通過Spark Streaming實(shí)時進(jìn)行業(yè)務(wù)日志采集送火,快速迭代處理,并進(jìn)行綜合分析先匪,能夠滿足線上系統(tǒng)分析要求种吸。
3.業(yè)務(wù)推薦系統(tǒng),使用spark將業(yè)務(wù)推薦系統(tǒng)的小時和天級別的模型訓(xùn)練轉(zhuǎn)變?yōu)榉昼娂墑e的模型訓(xùn)練呀非,有效優(yōu)化相關(guān)排名坚俗,個性化推薦以及熱點(diǎn)點(diǎn)擊分析等 。
4.定制廣告系統(tǒng)岸裙,在定制廣告業(yè)務(wù)方面需要大數(shù)據(jù)做應(yīng)用分析猖败,效果分析,定向優(yōu)化等哥桥,借助spark快速迭代的優(yōu)勢辙浑,實(shí)現(xiàn)了在“數(shù)據(jù)實(shí)時采集,算法實(shí)時訓(xùn)練拟糕,系統(tǒng)實(shí)時預(yù)測”的全流程實(shí)時并行高維算法判呕,支持上億的請求量處理;模擬廣告投放計算效率高送滞,延時小侠草,同MapReduce相比延時至少降低一個數(shù)量級。
5.用戶圖計算犁嗅,利用Graphx解決了許多生產(chǎn)問題边涕,包括以下計算場景;基于度分布的中樞節(jié)點(diǎn)發(fā)現(xiàn)褂微,基于最大連通圖的社區(qū)發(fā)現(xiàn)功蜓,基于三角形計數(shù)的關(guān)系衡量,基于隨機(jī)游走的用戶屬性傳播等宠蚂。
Spark SQL是spark的一個處理結(jié)構(gòu)化數(shù)據(jù)的模塊式撼,提供一個DataFrame編程抽象。它可以看作是一個分布式SQL查詢引擎求厕,主要由Catalyst優(yōu)化著隆,Spark SQL內(nèi)核,Hive支持三部分組成呀癣。
從1.3開始在原有SchemaRDD的基礎(chǔ)上提供了與R風(fēng)格類似的DataFrame API.
DataFrame是以指定列(named columns)組織的分布式數(shù)據(jù)集合,在Spark SQL中相當(dāng)于關(guān)系數(shù)據(jù)庫的一個表美浦,或R/Python的一個數(shù)據(jù)框架,但后臺更加優(yōu)化。 DataFrame 支持多種數(shù)據(jù)源構(gòu)建项栏,包括:結(jié)構(gòu)化數(shù)據(jù)文件(Parquet,JSON)加載浦辨,HIVE表讀取,外部數(shù)據(jù)庫讀取忘嫉,現(xiàn)有RDD轉(zhuǎn)化荤牍,以及SQLContext運(yùn)行sql查詢結(jié)果創(chuàng)建DataFrame.
Spark Streaming:
Spark Streaming屬于核心Spark Api的擴(kuò)展案腺,它支持高吞吐量和容錯的實(shí)時流數(shù)據(jù)處理庆冕,它可以接受來自kafka,flume,twitter,zeroMQ或Tcp Socket的數(shù)據(jù)源康吵,使用復(fù)雜的算法表達(dá)和高級功能來進(jìn)行處理,如Map,Reduce,Join, window等访递,處理的結(jié)果數(shù)據(jù)能夠存入文件系統(tǒng)晦嵌,數(shù)據(jù)庫。
Saprk部署和運(yùn)行
本地部署模式拷姿,獨(dú)立模式部署惭载,YARN模式部署,以及基于各種模式的應(yīng)用程序運(yùn)行响巢。
Spark下載路徑:http://spark.apache.org/downloads.html
安裝JAVA:
下載并安裝好java后描滔,進(jìn)行配置:在/etc/profile文件中增加變量
sudo vim /etc/profile
export JAVA_HOME=$YOUR_JAVA_HOME# //實(shí)際安裝路徑
export PATH=$PATH:$JAVA_HOME/bin:$JAVA_HOME/jre/bin
export CLASSPATH=$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib
如果想立即生效,可以通過運(yùn)行# source /etc/profile,否則只能在下次用戶重新登錄加載環(huán)境變量時生效踪古。運(yùn)行 java -version測試含长。
關(guān)于JDK環(huán)境變量配置一般包括4種方式:
1.在用戶環(huán)境變量文件 /etc/profile文件中添加變量,需要具有root權(quán)限才能進(jìn)行配置伏穆,對linux下所有用戶長期有效拘泞。
2.在用戶目錄下的.profile文件中增加變量,對當(dāng)前用戶長期生效 枕扫。
3.直接運(yùn)行export命令定義變量陪腌,只對當(dāng)前shell臨時有效。在shell的命令行下直接使用[export 變量名=變量值]定義變量烟瞧,該變量只在當(dāng)前的shell或其子shell下是有效的诗鸭,若shell關(guān)閉,變量則生效参滴,再打開新shell時就沒有這個變量强岸,若需要使用,則還需要重新定義 卵洗。
4.在系統(tǒng)環(huán)境變量 /etc/environment中進(jìn)行配置请唱。
Spark部署主要包括Local模式部署,Standalone模式部署过蹂,YARN模式部署十绑,Mesos模式部署。
Standalone- Spark獨(dú)立部署意味著Spark占據(jù)HDFS(Hadoop分布式文件系統(tǒng))頂部的位置酷勺,Spark 框架自身也自帶了完整的資源調(diào)度管理服務(wù)本橙,可以獨(dú)立部署到一個集群中。
Spark on YARN - Spark 可以運(yùn)行于YARN之上脆诉,和Hadoop 進(jìn)行統(tǒng)一部署甚亭。資源管理和調(diào)度依賴YARN贷币,分布式存儲依賴HDFS。
Spark on Mesos - Mesos 是一種資源調(diào)度管理框架亏狰,可以為運(yùn)行在它上面的Spark 提供資源調(diào)度服務(wù)役纹。
ssh免密:
ssh-keygen -t rsa // /root/.ssh/id_rsa
cd /root/.ssh
cp id_rsa.pub authorized_keys
cd /usr/local
ssh-copy-id -i node002 //發(fā)送到node002
ssh node002
Spark standalone集群:
/usr/spark/spark3/conf
#mv spark-env.sh.template spark-env.sh
export SPARK_MASTER_IP=node001
export SPARK_MASTER_PORT=7077
export SPARK_EXECUTOR_INSTANCES=1
export SPARK_WORKER_INSTANCES=1
export SPARK_WORKER_CORES=1
export SPARK_WORKER_MEMORY=256M
export SPARK_MASTER_WEBUI_PORT=8080
export SPARK_CONF_DIR=/usr/spark/spark3/conf
export JAVA_HOME=/usr/java/jdk1.8.0_171-amd64
export JRE_HOME=${JAVA_HOME}/jre
mv slaves.template slaves
vi slaves //打開slaves去掉localhost,增加如下內(nèi)容
node002 #slave1,node001為master
將spark文件夾同步到其他從機(jī)
scp -r /usr/spark/spark3 root@node002:/usr/spark/
啟動spark
/usr/spark/spark3/sbin/start-all.sh
打開控制臺:
在Standalone模式運(yùn)行Spark應(yīng)用程序
1.spark-shell運(yùn)行應(yīng)用程序
在Spark集群上運(yùn)行應(yīng)用程序,需要將Master的spark://ip:port傳遞給sparkcontext構(gòu)造函數(shù)暇唾。
在集群上運(yùn)行交互式的spark命令spark-shell促脉,該命令將會用spark-env.sh中的SPARK_MASTER_IPD和SPARK_MASTER_PORT自動設(shè)置Master.
./bin/spark-shell --master spark://ip:port
2.spark-submit啟動應(yīng)用程序
spark-submit向集群提交spark應(yīng)用程序比較直接,對于獨(dú)立部署模式的集群策州,spark支持Client部署模式瘸味,即在提交應(yīng)用的客戶端進(jìn)程中部署Driver.
應(yīng)用程序通過spark-submit啟動,應(yīng)用程序的jar包將會自動地分配給所有的Worker節(jié)點(diǎn)够挂;對于任何其他運(yùn)行應(yīng)用程序時需要依賴的Jar包旁仿,可以通過-jar聲明,jar包名之間用逗號隔開孽糖。
./bin/spark-submit --class xxx.XX --master spark://node001:7077 --executor-memory 2G? --total-executor-cores 2 xxxx.xxxx.jar
應(yīng)用程序提交過程
Spark應(yīng)用程序在集群上以獨(dú)立進(jìn)程集合的形式運(yùn)行枯冈,接受用戶Driver程序中main函數(shù)sparkcontext對象的協(xié)調(diào)。當(dāng)任務(wù)提交到集群上梭姓,SparkContext對象可以與多種集群管理(Standalone部署霜幼,Mesos,YARN模式)連接,這些集群管理器負(fù)責(zé)為所有應(yīng)用分配資源誉尖。一旦連接建立罪既,Spark可以在集群的節(jié)點(diǎn)上獲得Executor,這些Executor進(jìn)程負(fù)責(zé)執(zhí)行計算和為應(yīng)用程序存儲數(shù)據(jù)铡恕。
(1)sparkContext向資源管理器注冊并申請資源
(2)資源管理器根據(jù)預(yù)先設(shè)定的算法琢感,在資源池里分配合適的Executor運(yùn)行資源
(3)應(yīng)用(Main函數(shù)里的算子)構(gòu)建有向無環(huán)圖
(4)DAGScheduler將圖轉(zhuǎn)換成TaskSet
(5)TaskScheduler負(fù)責(zé)TaskSet的任務(wù)分發(fā)。
Executor之間可以相互通信探熔。
SparkShell是交互控制臺驹针,使用scala程序;./bin/spark-shell --master local[*] //--master用來設(shè)置context將要連接并使用的資源主節(jié)點(diǎn)诀艰,master的值是standalone模式的spark集群地址柬甥,Mesos,Yarn集群的url.或者是一個local地址;使用--jars可以添加jar包的路徑其垄,逗號隔開多個苛蒲。spark-shell本質(zhì)是在后臺調(diào)用了spark-submit腳本來啟動應(yīng)用程序。
scala> val textFile = sc.textFile("file:///usr/spark/spark3/README.md")
textFile: org.apache.spark.rdd.RDD[String] = file:///usr/spark/spark3/README.md MapPartitionsRDD[1] at textFile at <console>:24
加載HDFS文件和本地文件都是使用textFile绿满,區(qū)別是添加前綴(hdfs:// 和 file://)進(jìn)行標(biāo)識臂外,從本地文件讀取文件直接返回MapPartitionsRDD,而從HDFS讀取的文件先轉(zhuǎn)成HadoopRDD,然后隱式轉(zhuǎn)換成MapPartitionsRDD.它們都是Spark的彈性分布式數(shù)據(jù)集(RDD)。