0阳准、為什么機(jī)器學(xué)習(xí)者需要學(xué)習(xí)spark芳悲?
關(guān)于大數(shù)據(jù)立肘,有這樣段話:
“Big data is like teenage sex,everyone talks about it,nobody really knows how to do it,everyone thinks everyone else is doing it,so everyone claims they are doing it.”
作為一名學(xué)生边坤,如何還沒聽說過Spark這套計算框架名扛,那么我覺得還是留在學(xué)術(shù)界的機(jī)器學(xué)習(xí)混吧,工業(yè)界現(xiàn)在也許還不適合你茧痒。
在學(xué)術(shù)界肮韧,數(shù)據(jù)一般都是別人處理好的公開數(shù)據(jù)集,而我們只是在上面實(shí)踐學(xué)術(shù)界的算法,在工業(yè)界可沒人給你把業(yè)務(wù)數(shù)據(jù)都給你準(zhǔn)備好...
眾所周知弄企,機(jī)器學(xué)習(xí)和統(tǒng)計學(xué)技術(shù)是把大數(shù)據(jù)轉(zhuǎn)化為行為知識的關(guān)鍵技術(shù)超燃,此外,機(jī)器學(xué)習(xí)者常言道:你能掌控的數(shù)據(jù)量決定了你模型最終所能達(dá)到效果上限拘领,不斷優(yōu)化的模型只是為了不斷的接近這個上限而已意乓。
信息時代,大部分頂層的互聯(lián)網(wǎng)公司都積累了海量的數(shù)據(jù)圣猎,能掌控的數(shù)據(jù)量是你模型最終能接近最好效果的很重要的一個要素之一士葫,對于工業(yè)界的業(yè)機(jī)器學(xué)習(xí)算法工程師,除了明白學(xué)術(shù)界的機(jī)器學(xué)習(xí)原理送悔、優(yōu)化理論以及實(shí)現(xiàn)各種單機(jī)版小demo外…..要想真正的能解決實(shí)際的業(yè)務(wù)問題慢显,那就必須具備處理、利用海量業(yè)務(wù)數(shù)據(jù)的能力欠啤,而Spark正是賦予我們掌控大數(shù)據(jù)能力的利器荚藻。
擁有的數(shù)據(jù)量,不等于你能掌控的數(shù)據(jù)量洁段,學(xué)習(xí)Spark鞋喇,賦予你掌控大數(shù)據(jù)的能力!
數(shù)據(jù)和算法之間的關(guān)聯(lián)眉撵,一個是血液侦香,一個是心臟。
看看相關(guān)職位的需求…..
我曾經(jīng)接觸的兩個公司的推薦部門都是基于scala(python)+spark+hadoop平臺工作的纽疟,由此可見罐韩,Spark在機(jī)器學(xué)習(xí)的工業(yè)領(lǐng)域是非常重要的技能之一!
總之污朽,想將來從事機(jī)器學(xué)習(xí)相關(guān)工作的朋友們散吵,開始學(xué)Spark吧!
1蟆肆、什么是Spark矾睦?
Spark是繼Hadoop之后的下一代分布式內(nèi)存計算引擎,于2009年誕生于加州大學(xué)伯克利分校AMPLab實(shí)驗(yàn)室炎功,現(xiàn)在主要由Databricks公司進(jìn)行維護(hù)枚冗。是當(dāng)今大數(shù)據(jù)領(lǐng)域最活躍、最熱門蛇损、最高效的大數(shù)據(jù)通用計算平臺赁温。
官方定義:spark是一個通用的大數(shù)據(jù)處理引擎坛怪,可以簡單的理解為一個大數(shù)據(jù)分布式處理框架。
相比于傳統(tǒng)的以hadoop為基礎(chǔ)的第一代大數(shù)據(jù)技術(shù)生態(tài)體系來說股囊,Spark性能更好(快速)袜匿、可擴(kuò)展性更高(技術(shù)棧)。
2稚疹、前輩hadoop:
2006年項(xiàng)目成立的一開始居灯,“Hadoop”這個單詞只代表了兩個組件——HDFS和MapReduce。到現(xiàn)在的10個年頭内狗,這個單詞代表的是“核心”(即Core Hadoop項(xiàng)目)以及與之相關(guān)的一個不斷成長的生態(tài)系統(tǒng)穆壕。這個和Linux非常類似,都是由一個核心和一個生態(tài)系統(tǒng)組成其屏。
現(xiàn)在Hadoop在一月發(fā)布了2.7.2的穩(wěn)定版喇勋, 已經(jīng)從傳統(tǒng)的Hadoop三駕馬車HDFS,MapReduce和HBase社區(qū)發(fā)展為60多個相關(guān)組件組成的龐大生態(tài)偎行,其中包含在各大發(fā)行版中的組件就有25個以上川背,包括數(shù)據(jù)存儲、執(zhí)行引擎蛤袒、編程和數(shù)據(jù)訪問框架等熄云。
Hadoop在2.0將資源管理從MapReduce中獨(dú)立出來變成通用框架后,就從1.0的三層結(jié)構(gòu)演變?yōu)榱爽F(xiàn)在的四層架構(gòu):
- 底層——存儲層妙真,文件系統(tǒng)HDFS
- 中間層——資源及數(shù)據(jù)管理層缴允,YARN以及Sentry等
- 上層——MapReduce、Impala珍德、Spark等計算引擎
- 頂層——基于MapReduce练般、Spark等計算引擎的高級封裝及工具,如Hive锈候、Pig薄料、Mahout等等
3、有了hadoop為什么還需要spark泵琳?
肯定Spark有比Hadoop的MR計算更好的優(yōu)勢摄职,好在如下方面:
(1)為什么高效?
- 相對于Hadoop的MR計算获列,Spark支持DAG谷市,能緩存中間數(shù)據(jù),減少數(shù)據(jù)落盤次數(shù)击孩;
- 使用多線程啟動task迫悠,更輕量,任務(wù)啟動快溯壶。計算速度理論上有10-100倍提升及皂。(根據(jù)個人工作驗(yàn)證,計算效率相對Hadoop至少是3倍以上)
3.高度抽象API且改,代碼比MR少2-5倍甚至更多验烧,開發(fā)效率高
(2)為什么多框架整合?
- 相對于過去使用Hadoop + Hive + Mahout + Storm 解決批處理又跛、SQL查詢和實(shí)時處理和機(jī)器學(xué)習(xí)場景的大數(shù)據(jù)平臺架構(gòu)碍拆,其最大的問題在于不同框架語言不同,整合復(fù)雜慨蓝,同時也需要更多維護(hù)成本感混。
而使用Spark在Spark core的批處理基礎(chǔ)上,建立了Spark Sql礼烈、Spark Streaming弧满,Spark Mllib,Spark GraphX來解決實(shí)時計算此熬,機(jī)器學(xué)習(xí)和圖計算場景庭呜,方便將不同組件功能進(jìn)行整合,同時維護(hù)成本小犀忱。
因?yàn)閭鹘y(tǒng)的hadoop的MapReduce具有高延遲的致命缺點(diǎn)募谎,無法處理高時效性的數(shù)據(jù)。hadoop本身的計算模型就決定了阴汇,hadoop上的所有工作都需要轉(zhuǎn)換為Map数冬、Shuffle、Reduce等核心階段搀庶,由于每次計算都需要從磁盤讀寫數(shù)據(jù)拐纱,同時整個模型都需要網(wǎng)絡(luò)傳輸,這就導(dǎo)致了不可改變的延遲哥倔。而spark的出現(xiàn)戳玫,讓hadoop也沒有時間、也沒有必要再重構(gòu)自己未斑。當(dāng)然hadoop作為一個技術(shù)體系咕宿,spark主要是替代其Map/Reduce的功能,hadoop的HDFS功能還是被與spark結(jié)合起來使用蜡秽。
spark的成本
Spark 和 Hadoop MapReduce 都是開源的府阀,但是機(jī)器和人工的花費(fèi)仍是不可避免的。
Spark 集群的內(nèi)存至少要和需要處理的數(shù)據(jù)塊一樣大芽突,因?yàn)橹挥袛?shù)據(jù)塊和內(nèi)存大小合適才能發(fā)揮出其最優(yōu)的性能试浙。所以如果真的需要處理非常大的數(shù)據(jù),Hadoop 是合適之選寞蚌,畢竟硬盤的費(fèi)用要遠(yuǎn)遠(yuǎn)低于內(nèi)存的費(fèi)用田巴。
考慮到 Spark 的性能標(biāo)準(zhǔn)钠糊,在執(zhí)行相同的任務(wù)的時候,需要的硬件更少而運(yùn)行速度卻更快壹哺,因此應(yīng)該是更合算的抄伍,尤其是在云端的時候,此時只需要即用即付管宵。
4. Spark之于Hadoop
更準(zhǔn)確地說截珍,Spark是一個計算框架,而Hadoop中包含計算框架MapReduce和分布式文件系統(tǒng)HDFS箩朴,Hadoop更廣泛地說還包括在其生態(tài)系統(tǒng)上的其他系統(tǒng)岗喉,如Hbase、Hive等炸庞。Spark是MapReduce的替代方案钱床,而且兼容HDFS疲牵、Hive等分布式存儲層懈万,可融入Hadoop的生態(tài)系統(tǒng),以彌補(bǔ)缺失MapReduce的不足迹栓。
Spark與Hadoop在數(shù)據(jù)中間數(shù)據(jù)處理區(qū)別:
Spark架構(gòu)采用了分布式計算中的Master-Slave模型拐格。Master是對應(yīng)集群中的含有Master進(jìn)程的節(jié)點(diǎn)僧免,Slave是集群中含有Worker進(jìn)程的節(jié)點(diǎn)。Master作為整個集群的控制器捏浊,負(fù)責(zé)整個集群的正常運(yùn)行懂衩;Worker相當(dāng)于是計算節(jié)點(diǎn),接收主節(jié)點(diǎn)命令與進(jìn)行狀態(tài)匯報金踪;Executor負(fù)責(zé)任務(wù)的執(zhí)行浊洞;Client作為用戶的客戶端負(fù)責(zé)提交應(yīng)用,Driver負(fù)責(zé)控制一個應(yīng)用的執(zhí)行胡岔。
Spark集群部署后法希,需要在主節(jié)點(diǎn)和從節(jié)點(diǎn)分別啟動Master進(jìn)程和Worker進(jìn)程,對整個集群進(jìn)行控制靶瘸。在一個Spark應(yīng)用的執(zhí)行過程中苫亦,Driver和Worker是兩個重要角色。Driver程序是應(yīng)用邏輯執(zhí)行的起點(diǎn)怨咪,負(fù)責(zé)作業(yè)的調(diào)度屋剑,即Task任務(wù)的分發(fā),而多個Worker用來管理計算節(jié)點(diǎn)和創(chuàng)建Executor并行處理任務(wù)诗眨。在執(zhí)行階段唉匾,Driver會將Task和Task所依賴的file和jar序列化后傳遞給對應(yīng)的Worker機(jī)器,同時Executor對相應(yīng)數(shù)據(jù)分區(qū)的任務(wù)進(jìn)行處理匠楚。
下面詳細(xì)介紹Spark的架構(gòu)中的基本組件巍膘。
- ClusterManager:在Standalone模式中即為Master(主節(jié)點(diǎn))厂财,控制整個集群,監(jiān)控Worker峡懈。在YARN模式中為資源管理器璃饱。
- Worker:從節(jié)點(diǎn),負(fù)責(zé)控制計算節(jié)點(diǎn)逮诲,啟動Executor或Driver帜平。在YARN模式中為NodeManager幽告,負(fù)責(zé)計算節(jié)點(diǎn)的控制梅鹦。
- Driver:運(yùn)行Application的main()函數(shù)并創(chuàng)建SparkContext。
- Executor:執(zhí)行器冗锁,在worker node上執(zhí)行任務(wù)的組件齐唆、用于啟動線程池運(yùn)行任務(wù)。每個Application擁有獨(dú)立的一組Executors冻河。
- SparkContext:整個應(yīng)用的上下文箍邮,控制應(yīng)用的生命周期。
- RDD:Spark的基本計算單元叨叙,一組RDD可形成執(zhí)行的有向無環(huán)圖RDD Graph锭弊。
- DAG Scheduler:根據(jù)作業(yè)(Job)構(gòu)建基于Stage的DAG,并提交Stage給TaskScheduler擂错。
- TaskScheduler:將任務(wù)(Task)分發(fā)給Executor執(zhí)行味滞。
- SparkEnv:線程級別的上下文,存儲運(yùn)行時的重要組件的引用钮呀。SparkEnv內(nèi)創(chuàng)建并包含如下一些重要組件的引用剑鞍。
- MapOutPutTracker:負(fù)責(zé)Shuffle元信息的存儲。
- BroadcastManager:負(fù)責(zé)廣播變量的控制與元信息的存儲爽醋。
- BlockManager:負(fù)責(zé)存儲管理蚁署、創(chuàng)建和查找塊。
- MetricsSystem:監(jiān)控運(yùn)行時性能指標(biāo)信息蚂四。
- SparkConf:負(fù)責(zé)存儲配置信息光戈。
Spark的整體流程為:Client提交應(yīng)用,Master找到一個Worker啟動Driver遂赠,Driver向Master或者資源管理器申請資源田度,之后將應(yīng)用轉(zhuǎn)化為RDD Graph,再由DAGScheduler將RDD Graph轉(zhuǎn)化為Stage的有向無環(huán)圖提交給TaskScheduler解愤,由TaskScheduler提交任務(wù)給Executor執(zhí)行镇饺。在任務(wù)執(zhí)行的過程中,其他組件協(xié)同工作送讲,確保整個應(yīng)用順利執(zhí)行奸笤。
Application就是用戶submit提交的整體代碼惋啃,代碼中又有很多action操作,action算子把Application劃分為多個job监右,job根據(jù)寬依賴劃分為不同Stage边灭,Stage內(nèi)劃分為許多(數(shù)量由分區(qū)決定,一個分區(qū)的數(shù)據(jù)由一個task計算)功能相同的task健盒,然后這些task提交給Executor進(jìn)行計算執(zhí)行绒瘦,把結(jié)果返回給Driver匯總或存儲。
4.1 統(tǒng)計數(shù)據(jù)集中詞頻的例子
下面看一下使用Spark解決一個HelloWord入門級別的Spark程序代碼扣癣,比寫Hadoop里面的Map/Reduce代碼簡單多了....
# 統(tǒng)計單詞的詞頻
val rdd = sc.textFile("/home/scipio/README.md")
val wordcount = rdd.flatMap(_.split(' ')).map((_,1)).reduceByKey(_+_)
val wcsort = wordcount.map(x => (x._2,x._1)).sortByKey(false).map(x => (x._2,x._1))
wcsort.saveAsTextFile("/home/scipio/sort.txt")
上圖是一個Spark的wordcount例子惰帽,根據(jù)上述stage劃分原則,這個job劃分為2個stage父虑,有三行该酗,分別是數(shù)據(jù)讀取、計算和存儲過程士嚎。
僅看代碼呜魄,我們根本體會不到數(shù)據(jù)在背后是并行計算。從圖中能看出數(shù)據(jù)分布在不同分區(qū)(集群上不同機(jī)器上)莱衩,數(shù)據(jù)經(jīng)過flapMap爵嗅、map和reduceByKey算子在不同RDD的分區(qū)中流轉(zhuǎn)。(這些算子就是上面所說對RDD進(jìn)行計算的函數(shù))笨蚁,后面有空再介紹一下自己總結(jié)的Spark常用的算子以及Scala函數(shù)睹晒。
推薦Spark官網(wǎng)中文翻譯版入門學(xué)習(xí)資料:http://spark.apachecn.org/docs/cn/2.2.0/sql-programming-guide.html