想玩轉工業界機器學習?先學Spark吧
正文共5145個字,16張圖,預計閱讀時間13分鐘。
為什麼機器學習者需要學習spark?
關於大數據,有這樣段話:
「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.」
作為一名學生,如何還沒聽說過Spark這套計算框架,那麼我覺得還是留在學術界的機器學習混吧,工業界現在也許還不適合你。
在學術界,數據一般都是別人處理好的公開數據集,而我們只是在上面實踐學術界的演算法,在工業界可沒人給你把業務數據都給你準備好...
眾所周知,機器學習和統計學技術是把大數據轉化為行為知識的關鍵技術,此外,機器學習者常言道:你能掌控的數據量決定了你模型最終所能達到效果上限,不斷優化的模型只是為了不斷的接近這個上限而已。
數據和演算法之間的關聯,一個是血液,一個是心臟。
信息時代,大部分頂層的互聯網公司都積累了海量的數據,能掌控的數據量是你模型最終能接近最好效果的很重要的一個要素之一,對於工業界的業機器學習演算法工程師,除了明白學術界的機器學習原理、優化理論以及實現各種單機版小demo外…..要想真正的能解決實際的業務問題,那就必須具備處理、利用海量業務數據的能力,而Spark正是賦予我們掌控大數據能力的利器。
擁有的數據量,不等於你能掌控的數據量,學習Spark,賦予你掌控大數據的能力!
數據和演算法之間的關聯,一個是血液,一個是心臟。
看看相關職位的需求…..
工業界需要Spark
我曾經接觸的兩個公司的推薦部門都是基於scala(python)+spark+hadoop平台工作的,由此可見,Spark在機器學習的工業領域是非常重要的技能之一!
總之,想將來從事機器學習相關工作的朋友們,開始學Spark吧!
什麼是spark?
Spark與大數據
Spark是繼Hadoop之後的下一代分散式內存計算引擎,於2009年誕生於加州大學伯克利分校AMPLab實驗室,現在主要由Databricks公司進行維護。是當今大數據領域最活躍、最熱門、最高效的大數據通用計算平台。
官方定義:spark是一個通用的大數據處理引擎,可以簡單的理解為一個大數據分散式處理框架。
相比於傳統的以hadoop為基礎的第一代大數據技術生態體系來說,Spark性能更好(快速)、可擴展性更高(技術棧)。
Spark的特點
前輩hadoop
2006年項目成立的一開始,「Hadoop」這個單詞只代表了兩個組件——HDFS和MapReduce。到現在的10個年頭,這個單詞代表的是「核心」(即Core Hadoop項目)以及與之相關的一個不斷成長的生態系統。這個和Linux非常類似,都是由一個核心和一個生態系統組成。
Hadoop發展歷程
現在Hadoop在一月發布了2.7.2的穩定版, 已經從傳統的Hadoop三駕馬車HDFS,MapReduce和HBase社區發展為60多個相關組件組成的龐大生態,其中包含在各大發行版中的組件就有25個以上,包括數據存儲、執行引擎、編程和數據訪問框架等。
Hadoop在2.0將資源管理從MapReduce中獨立出來變成通用框架後,就從1.0的三層結構演變為了現在的四層架構:
Hadoop的框架
底層——存儲層,文件系統HDFS
中間層——資源及數據管理層,YARN以及Sentry等
上層——MapReduce、Impala、Spark等計算引擎
頂層——基於MapReduce、Spark等計算引擎的高級封裝及工具,如Hive、Pig、Mahout等等
有了Hadoop為什麼還需要spark?
肯定Spark有比Hadoop的MR計算更好的優勢,好在如下方面:
(1)為什麼高效?
1、相對於Hadoop的MR計算,Spark支持DAG,能緩存中間數據,減少數據落盤次數;
2、使用多線程啟動task,更輕量,任務啟動快。計算速度理論上有10-100倍提升。(根據個人工作驗證,計算效率相對Hadoop至少是3倍以上)
3、高度抽象API,代碼比MR少2-5倍甚至更多,開發效率高
(2)為什麼多框架整合?
相對於過去使用Hadoop + Hive + Mahout + Storm 解決批處理、SQL查詢和實時處理和機器學習場景的大數據平台架構,其最大的問題在於不同框架語言不同,整合複雜,同時也需要更多維護成本。
而使用Spark在Spark core的批處理基礎上,建立了Spark Sql、Spark Streaming,Spark Mllib,Spark GraphX來解決實時計算,機器學習和圖計算場景,方便將不同組件功能進行整合,同時維護成本小。
Spark與Hadoop對比
因為傳統的hadoop的MapReduce具有高延遲的致命缺點,無法處理高時效性的數據。hadoop本身的計算模型就決定了,hadoop上的所有工作都需要轉換為Map、Shuffle、Reduce等核心階段,由於每次計算都需要從磁碟讀寫數據,同時整個模型都需要網路傳輸,這就導致了不可改變的延遲。而spark的出現,讓hadoop也沒有時間、也沒有必要再重構自己。當然hadoop作為一個技術體系,spark主要是替代其Map/Reduce的功能,hadoop的HDFS功能還是被與spark結合起來使用。
Spark的特點
spark的成本
Spark 和 Hadoop MapReduce 都是開源的,但是機器和人工的花費仍是不可避免的。
Spark與Hadoop的硬體差異
Spark 集群的內存至少要和需要處理的數據塊一樣大,因為只有數據塊和內存大小合適才能發揮出其最優的性能。所以如果真的需要處理非常大的數據,Hadoop 是合適之選,畢竟硬碟的費用要遠遠低於內存的費用。
考慮到 Spark 的性能標準,在執行相同的任務的時候,需要的硬體更少而運行速度卻更快,因此應該是更合算的,尤其是在雲端的時候,此時只需要即用即付。
spark之於Hadoop
更準確地說,Spark是一個計算框架,而Hadoop中包含計算框架MapReduce和分散式文件系統HDFS,Hadoop更廣泛地說還包括在其生態系統上的其他系統,如Hbase、Hive等。Spark是MapReduce的替代方案,而且兼容HDFS、Hive等分散式存儲層,可融入Hadoop的生態系統,以彌補缺失MapReduce的不足。
Spark與Hadoop在數據中間數據處理區別:
Spark架構採用了分散式計算中的Master-Slave模型。Master是對應集群中的含有Master進程的節點,Slave是集群中含有Worker進程的節點。Master作為整個集群的控制器,負責整個集群的正常運行;Worker相當於是計算節點,接收主節點命令與進行狀態彙報;Executor負責任務的執行;Client作為用戶的客戶端負責提交應用,Driver負責控制一個應用的執行。
Spark調度模塊
Spark集群部署後,需要在主節點和從節點分別啟動Master進程和Worker進程,對整個集群進行控制。在一個Spark應用的執行過程中,Driver和Worker是兩個重要角色。Driver程序是應用邏輯執行的起點,負責作業的調度,即Task任務的分發,而多個Worker用來管理計算節點和創建Executor並行處理任務。在執行階段,Driver會將Task和Task所依賴的file和jar序列化後傳遞給對應的Worker機器,同時Executor對相應數據分區的任務進行處理。
下面詳細介紹Spark的架構中的基本組件。
1、ClusterManager:在Standalone模式中即為Master(主節點),控制整個集群,監控Worker。在YARN模式中為資源管理器。
2、Worker:從節點,負責控制計算節點,啟動Executor或Driver。在YARN模式中為NodeManager,負責計算節點的控制。
3、Driver:運行Application的main()函數並創建SparkContext。
4、Executor:執行器,在worker node上執行任務的組件、用於啟動線程池運行任務。每個Application擁有獨立的一組Executors。
5、SparkContext:整個應用的上下文,控制應用的生命周期。
6、RDD:Spark的基本計算單元,一組RDD可形成執行的有向無環圖RDD Graph。
7、DAG Scheduler:根據作業(Job)構建基於Stage的DAG,並提交Stage給TaskScheduler。
8、TaskScheduler:將任務(Task)分發給Executor執行。
9、SparkEnv:線程級別的上下文,存儲運行時的重要組件的引用。SparkEnv內創建並包含如下一些重要組件的引用。
10、MapOutPutTracker:負責Shuffle元信息的存儲。
11、BroadcastManager:負責廣播變數的控制與元信息的存儲。
12、BlockManager:負責存儲管理、創建和查找塊。
13、MetricsSystem:監控運行時性能指標信息。
14、SparkConf:負責存儲配置信息。
Spark的整體流程為:Client提交應用,Master找到一個Worker啟動Driver,Driver向Master或者資源管理器申請資源,之後將應用轉化為RDD Graph,再由DAGScheduler將RDD Graph轉化為Stage的有向無環圖提交給TaskScheduler,由TaskScheduler提交任務給Executor執行。在任務執行的過程中,其他組件協同工作,確保整個應用順利執行。
Spark作業層次劃分
Application就是用戶submit提交的整體代碼,代碼中又有很多action操作,action運算元把Application劃分為多個job,job根據寬依賴劃分為不同Stage,Stage內劃分為許多(數量由分區決定,一個分區的數據由一個task計算)功能相同的task,然後這些task提交給Executor進行計算執行,把結果返回給Driver匯總或存儲。
4.1、統計數據集中詞頻的例子
下面看一下使用Spark解決一個HelloWord入門級別的Spark程序代碼,比寫Hadoop裡面的Map/Reduce代碼簡單多了....
# 統計單詞的詞頻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執行過程
上圖是一個Spark的wordcount例子,根據上述stage劃分原則,這個job劃分為2個stage,有三行,分別是數據讀取、計算和存儲過程。
僅看代碼,我們根本體會不到數據在背後是並行計算。從圖中能看出數據分布在不同分區(集群上不同機器上),數據經過flapMap、map和reduceByKey運算元在不同RDD的分區中流轉。(這些運算元就是上面所說對RDD進行計算的函數),後面有空再介紹一下自己總結的Spark常用的運算元以及Scala函數(https://www.jianshu.com/p/addc95d9ebb9)。
※機器學習——歸納偏好
※哪些蘋果用戶還會購買下一代產品?讓機器學習帶你精準定位
TAG:機器學習 |