VOOZH about

URL: https://read01.com/Dx5gK4.html

⇱ 訪談:Spark從入門到調優,是否有捷徑可走? - 壹讀


Friday, Apr 17, 2026

訪談:Spark從入門到調優,是否有捷徑可走?

2016/07/02 來源:小窗科技

文章末尾有大家期盼已久的線下活動預告!

Mohammed Guller撰寫的《Spark大數據分析》(Big Data Analytics with Spark)一書針對使用Apache Spark框架執行批處理、互操作、圖表、數據流分析,以及機器學習等不同類型的大數據分析項目提供了實用的學習指南。InfoQ採訪了本書以及各種大數據應用程式開發工具的作者Mohammed Guller。

InfoQ:您對Apache Spark框架的定義是怎樣的?該框架對大數據分析項目和倡議能提供什麼幫助?

Guller:Apache Spark是一個快速、簡單易用、通用的大數據集處理集群式計算框架,可實現極大規模和極高速度。更重要的是,藉助該框架可以輕鬆地針對大規模數據集執行各類數據處理任務。它為批處理、即席分析、機器學習、流處理以及圖表分析提供了一套集成庫。

數據正在以指數形式增長。另外目前生成的大部分數據並非結構化的,而是多結構化或非結構化的。關係型資料庫等傳統工具無法應對今天數據的數據量、生成速度和種類。因此需要Spark這樣的框架。它使得用戶能輕鬆處理不同數量、速度和種類的大數據。另外要注意的是,組織需要通過不同方式處理或分析數據以從中獲得價值。Spark為不同類型數據的處理和分析任務提供了統一平台。與專門承擔批處理或流處理任務的專用框架不同,使用Spark時無需複製代碼或數據。

Guller:一般來說,開發者可以針對Spark所能支持的程式語言使用任何可用的工具。目前Spark可支持Scala、Java、Python和R。

以Scala為例。Spark自帶一個名為Spark-Shell的交互式開發環境,這個環境就是基於Scala REPL(Read Evaluate Print Loop)工具實現的。用戶可以藉助它快速簡單地上手Spark。此外開發者還可以使用標準的Scala IDE,例如Eclipse和IntelliJ IDEA。如果不想使用IDE,還可以用慣用的文本編輯器編寫代碼並使用SBT(Simple Build Tool)編譯。

Guller:學習Spark的最好方式是大量做實驗,並使用Spark API編寫代碼。編寫執行代碼後,相關概念也會變得更清楚。學習任何新的語言或工具都是如此。

雖然Spark是大數據處理框架,但學習Spark的過程中並不需要具備大規模集群或大型數據集。你可以在自己的筆記本上使用小規模數據集運行Spark,藉此熟悉Spark提供的API和各種庫。我的書中專門有一章向初學者介紹如何輕鬆上手Spark。

InfoQ:Spark目前支持的程式語言有Scala、Java、Python和R,您覺得這些語言相比而言有什麼優劣?如果開發者新手需要選擇一種語言,您有什麼推薦?

Guller:Spark本身是使用Scala編寫的。因此以前Scala是Spark的「一等公民」,對其他語言的支持都略有滯後。然而目前發布的每個Spark新版本中,這樣的差距變得越來越小。同理,以前使用Scala編寫的Spark應用程式比Python應用程式性能更優,但Spark正在對此進行各種優化,速度的差異也會逐漸減小。

我個人很喜歡Scala,這種語言可以提高生產力,有助於寫出更簡潔,質量更高的代碼。我也正是因此重新拾回了對編程的熱愛。

話雖如此,開發者其實可以使用自己習慣的任何語言。如果你對Python比較在行就用Python。只要你熟悉的語言是Spark所能支持的,就沒必要更換或學習新的語言。

如果希望學習新語言並獲得更優化的性能,那麼我要推薦Scala。我的書中專門有一章是介紹功能編程和Scala的。

InfoQ:在本地計算機或雲端設置Spark集群的最佳方式是什麼?

Guller:Spark提供的spark-ec2腳本可用於在Amazon AWS設置Spark集群。這個腳本可啟動、管理和關閉Amazon雲中的Spark集群。同時該腳本可以安裝Spark和HDFS。這是一個非常靈活的腳本,支持多種輸入參數,還可針對具體的處理需求和預算創建自定義集群。

InfoQ:能否談談使用Spark Streaming庫執行實時流數據分析?

Guller:Spark Streaming庫擴展了Spark的流處理能力,能夠為用戶提供近乎實時的流數據分析能力。它使用了一種微批(Micro-batching)體系結構。這種技術在本質上會將一條數據流拆分為多個微批,並可由開發者指定批區間(Batch interval)。每個微批可由一個RDD(Resilient Distributed Dataset)代表,RDD同時也是Spark最主要的數據抽象。

微批體系結構有優勢也有劣勢。優勢方面,可以提供極高的吞吐量,因此Spark Streaming非常適合針對流數據執行分析。然而如果應用程式需要以極低延遲(毫秒級別)分別處理流中的每個事件,可能並不適合使用Spark Streaming。

Guller:這是個很大的話題。Spark提供了很多性能調優機制,我會介紹一些最需要引起注意的重要事項。

首先,對於大部分數據處理應用程式,磁碟I/O都是影響應用程式執行速度的決定性因素。Spark可以讓用戶在內存中創建數據,請儘量利用這一特性。將數據緩存在內存中可以讓應用程式提速100倍以上。當然這也意味著最好使用具有大量內存的計算機搭建Spark集群。

其次,請避免需要進行數據重排(Data shuffling)的操作。跨越網絡進行數據重排是一種開銷很高的操作,在編寫數據處理邏輯時一定要注意這一點。有時候相同的邏輯也可以通過更高效的操作實現,例如不要使用groupByKey操作,而是可以使用reduceByKey操作。

第三,優化數據中的分區數量。如果數據尚未分區,就無法充分利用Spark在並行數據處理方面的優勢。例如,假設有一個100內核的Spark集群,但如果數據只有2個分區,此時將無法充分運用所有計算能力。

第四,通過共置的數據節點和計算節點可以獲得更好的性能。舉例來說,如果數據在HDFS中,請在同一個HDFS集群中安裝Spark。Spark會在距離數據儘可能近的位置處理這些數據。例如,它首先會嘗試在數據所在計算機上執行任務。如果該計算機無法執行任務,隨後會嘗試使用同一機機櫃的其他計算機。如果依然不可行,最後才會選擇使用任意一台計算機。請儘量將磁碟和網絡I/O降至最低。

這就是一些值得大家注意的,有關性能的常見注意事項。

InfoQ:目前Spark程序在安全保護方面有哪些措施?如何只讓獲得許可的用戶或應用執行這些程序?

Guller:Spark支持兩種身份驗證方法:共享密鑰(Shared secret)和Kerberos。共享密鑰身份驗證機制可以配合所有集群管理器使用:YARN、Mesos,以及獨立使用。此外YARN還可將Kerberos與Spark配合使用。

Spark還支持使用SSL與SASL進行加密。SSL主要用於安全通信協議,SASL主要用於保護塊傳輸服務。

InfoQ:如何使用Spark Web Console和其他工具監控Spark程序?通常在監控Spark程序時您會使用哪些度量指標?

Guller:Spark提供了完善的監控能力。我的書中有一章專門介紹了這個話題。Spark不僅可以暴露各種度量指標,而且針對Spark集群和其中運行的應用程式提供了基於Web的監控界面。此外還能支持第三方監控工具,例如Graphite、Ganglia以及基於JMX的監控應用。

我會在性能優化和調試過程中進行監控。具體選擇的度量指標取決於打算要解決的問題。例如,可以使用監控界面檢查集群狀態以及應用程式的資源分配情況。

同理,也可以使用監控界面查看應用程式所提交的作業中的並行數量。另外還可以查看不同任務處理的數據量和所用時間。這些信息可以幫你找出卡滯的任務,當然這些只是幾個簡單的例子。

InfoQ:您期待在以後發布的Spark版本中見到什麼新功能?

Guller:Spark開發者社區在每個新版本中都在盡全力改善Spark。因此我的期待並不重要。但我希望看到更多與機器學習有關的新功能。

另外我覺得Spark還缺少一樣東西:針對Scala開發者提供的圖表或數據繪圖(Plotting)庫。探索式可視化是數據分析的重要一環,R開發者可以使用ggplot2,Python有matplotlib,Scala開發者要是也有類似的技術就太好了。

另外我還希望看到Spark的統計和機器學習庫能夠趕上R提供的類似技術。最後,我還希望能夠通過更好的支持讓用戶使用PMML和PFA等標準導出和導入機器學習模型。

InfoQ:Spark Machine Learning目前提供了多種不同算法。你是否看到有其他ML庫能夠為組織的機器學習和數據科學需求提更多價值?

Guller:你說的沒錯,Spark的機器學習庫提供了豐富的算法,並且每個新版都增加了新的算法。

Spark可以配合外部機器學習庫使用,因此無論Spark缺乏哪種能力,都可以通過其他庫彌補。例如,Stanford CoreNLP庫配合Spark使用可以執行NLP-heavy機器學習任務,類似的SparkNet、CaffeOnSpark、DeepLearning4J或TensorFlow也可以與Spark配合使用實現更深入的學習。

Guller還談到了Spark框架為用戶提供的價值。

Guller:Spark是一個很棒的大數據分析和處理框架,非常易於使用,針對不同任務提供了豐富的庫。此外它還針對非常大規模數據集的處理提供了擴展能力和極高的速度。任何需要處理大數據或進入大數據領域的用戶都有必要掌握。

他同時還提到有很多人向他詢問Hadoop和Spark之間的關係,並回答了兩個最長聽到的問題。

InfoQ:Spark會取代Hadoop嗎?

Guller:簡單來說,不會。今天的Hadoop代表了多個產品組成的生態系統,Spark也是這個生態系統的成員。就算最核心的Hadoop也包含三個組件:一個集群管理器,一個分布式計算框架,以及一個分布式文件系統。其中集群管理器是YARN,計算框架是MapReduce,分布式文件系統是HDFS。Spark是Hadoop MapReduce組件的繼任者。

很多人在使用Spark作業取代原有的MapReduce作業,或在Spark中編寫新的作業。因此可以說Spark會取代MapReduce,但無法取代Hadoop。

另外有個重要的事情需要注意,Spark可以配合Hadoop使用,但也可以在不具備Hadoop的情況下使用。例如,可以使用Mesos或獨立集群管理器替代YARN,同理也可以使用S3或其他數據源代替HDFS。因此使用Spark並非必須要同時使用Hadoop。

InfoQ:為什麼有人使用Spark代替MapReduce?

Guller:相比MapReduce,Spark可以提供更多優勢。

首先,Spark比MapReduce速度快很多。取決於具體應用,可能會比MapReduce快100倍。Spark如此之快的一個原因在於其先進的作業執行引擎。Spark作業可以劃分為任意數量的階段(Stage),而MapReduce作業只能分為兩個階段。另外Spark可以讓應用程式將數據緩存在內存中。緩存機制可極大改進應用程式性能。磁碟I/O會大幅影響數據處理應用程式的執行速度,Spark則能將磁碟I/O降至最低。

其次,Spark很易用。Spark提供了豐富的API和超過80種操作,MapReduce只能提供兩種操作:Map和Reduce。Spark API可以通過Scala、Python、Java和R四種語言使用。相比在MapReduce中編寫的作業,相同數據處理作業使用Scala/Spark編寫時代碼量可以減少5-10倍。因此Spark也能大幅提高開發者的生產力。

第三,Spark針對不同類型的數據處理任務提供了統一的工具。該產品內置了用於批處理、交互式分析、機器學習、流處理,以及圖表分析的集成庫,用戶不再需要學習多種工具。也不需要將代碼和數據複製到多個位置。另外從運營的角度來說,一個集群的管理,無疑要比針對不同類型作業創建多個專用集群管理起來更簡單。

關於這本圖書的作者

Mohammed Guller是Glassbeam的首席架構師,主要負責高級分析和預測分析產品的開發。過去20多年來,Mohammed成功地領導了諸多創新式技術產品從概念到發布的全過程。在加入Glassbeam之前,他是TrustRecs.com的創始人,這是他在IBM工作五年後成立的。加入IBM之前,他曾就職於多個高科技初創公司,負責新產品的開發工作。Mohammed具備美國加州大學伯克利分校工商管理碩士學位,以及印度古吉拉特邦大學Rollwala計算機中心的計算機應用碩士學位。

線下活動預告!

7月9日北京中關村創業大街車庫咖啡舉行免費Spark大數據訓練營,一線工程師實踐演講,還有專家輔導動手課堂,歡迎參加!點擊「閱讀原文」報名!

大數據雜談Spark報名群

長按二維碼識別關注

您可能感興趣
免責聲明:本文內容來源于小窗科技,文章觀點不代表壹讀立場,如若侵犯到您的權益,或涉不實謠言,敬請向我們提出檢舉
最新文章 / 服務條款 / 私隱保護 / DMCA / 聯絡我們

壹讀/READ01.COM