Preface前言這是一本關于機器學習的書,它以Scala為重點,介紹了函數式編程方法以及如何在Spark上處理大數據。九個月前,當我受邀寫作本書時,我的第一反應是:Scala、大數據、機器學習,每一個主題我都曾徹底調研過,也參加了很多的討論,結合任何兩個話題來寫都具有挑戰性,更不用說在一本書中結合這三個主題。這個挑戰激發了我的興趣,于是就有了這本書。并不是每一章的內容都像我所希望的那樣圓滿,但技術每天都在快速發展。我有一份具體的工作,寫作只是表達我想法的一種方式。
下面先介紹機器學習。機器學習經歷了翻天覆地的變換;它是由人工智能和統計學發展起來的,于20世紀90年代興起。后來在2010年或稍晚些時候誕生了數據科學。數據科學家有許多定義,但JoshWills的定義可能最通俗,我有幸在Cloudera工作時和他共事過。這個定義在圖1中有具體的描述。雖然細節內容可能會有爭議,但數據科學確實是幾個學科的交叉,數據科學家不一定是任何一個領域的專家。據JeffHammerbacher(Cloudera的創始人,Facebook的早期員工)介紹,第一位數據科學家工作于Facebook。Facebook需要跨學科的技能,以便從當時大量的社交數據中提取有價值的信息。雖然我自稱是一個大數據科學家,但我已經關注這個交叉領域很久了,以至于有太多知識出現混淆。寫這本書就是想使用機器學習的術語來保持對這些領域的關注度。
圖1數據科學家的一種可能定義最近,在機器學習領域出現了另一個被廣泛討論的話題,即數據量擊敗模型的復雜度。在本書中可以看到一些SparkMLlib實現的例子,特別是NLP的word2vec。機器學習模型可以更快地遷移到新環境,也經常擊敗需要數小時才能構建的更復雜的模型。因此,機器學習和大數據能夠很好地結合在一起。
最后也很重要的一點是微服務的出現。作者在本書中花了大量的篇幅介紹機器和應用程序通信,所以會很自然地提及Scala與Akkaactor模型。
對于大多數程序員而言,函數式編程更多是關于編程風格的變化,而不是編程語言本身。雖然Java8開始有來自函數式編程的lambda表達式和流,但是人們仍然可以在沒有這些機制的情況下編寫函數式代碼,甚至可以用Scala編寫Java風格的代碼。使得Scala在大數據世界中名聲鵲起的兩個重要思想是惰性求值和不可變性,其中惰性求值可大大簡化多線程或分布式領域中的數據處理。Scala有一個可變集合庫和一個不可變集合庫。雖然從用戶的角度來看它們的區別很小,但從編譯器的角度來看,不變性大大增加了靈活性,并且惰性求值能更好地與大數據相結合,因為REPL將大多數信息推遲到管道的后期處理,從而增加了交互性。
大數據一直備受關注,其主要原因是機器產生的數據量大大超越了人類在沒有使用計算機以前的數量。Facebook、Google、Twitter等社交網絡公司已經證明專門用于處理大數據的工具(如Hadoop、MapReduce和Spark)可以從這些數據塊中提取豐富的信息。
本書后面將介紹關于Hadoop的內容。最初它能在廉價硬件上處理大量的信息,因為當時傳統的關系數據庫不能處理這樣的信息(或能處理,但是代價過高)。大數據這個話題太大了,而Spark才是本書的重點,它是HadoopMapReduce的另一個實現,Spark提高了磁盤上持久化保存數據的效率。通常認為使用Spark有點貴,因為它消耗更多的內存,要求硬件必須更可靠,但它也更具交互性。此外,Spark使用Scala工作(也可以使用Java和Python等),但Scala是主要的API語言。因此Spark用Scala在數據管道的表達方面有一定的協同性。
本書主要內容第1章介紹數據分析師如何開始數據分析。除了允許用戶使用新工具查看更大的數據集以外,該章并沒有什么新東西。這些數據集可能分布在多臺計算機上,但查看它們就像在本地機器上一樣簡單。當然,不會阻止用戶在單個機器上順序執行程序。但即使如此,作者寫作的這個筆記本電腦也有四個核,可同時運行1377個線程。Spark和Scala(并行集合)允許用戶透明地使用整個設備,有時并沒有顯式指定需要并行運行。現代服務器可對OS服務使用多達128個超線程。該章將展示如何使用新工具來進行數據分析,并用它來研究以前的數據集。
第2章介紹在Scala/Spark之前一直存在的數據驅動過程,也會介紹完全數據驅動的企業,這類企業通過多臺數據生成機器的反饋來優化業務。大數據需要新的技術和架構來適應新的決策過程。該章借鑒了一些學術資料來闡述數據驅動型業務的通用架構。在這種架構下,大多數工人的任務是監控和調整數據管道。
第3章重點介紹Spark的體系結構,它是前面提及的HadoopMapReduce的替代者(或補充)。該章還將特別介紹MLlib所支持的幾個算法。雖然這是一個嶄新的話題,但許多算法都對應著各種實現。該章將給出一些例子,比如怎樣運行org.apache.spark.mllib包中標準的機器學習算法。最后介紹Spark的運行模式及性能調整。
第4章介紹機器學習的原理,雖然SparkMLlib的內容可能會不斷變化,但這些原理是不會變的。監督學習和無監
TheTranslator'sWords譯者序大數據是當前熱門的話題,其特點為數據量巨大,增長速度快,擁有各種類型。分布式機器學習是一種高效處理大數據的方法,其目的是從大數據中找到有價值的信息。目前各大互聯網公司都投入巨資研究分布式機器學習。
在實現分布式機器學習算法時,函數式編程有天生的優勢。這是因為函數式編程不會共享狀態,也不會造成資源競爭。Scala是一種優秀的函數式編程語言,同時它也是基于Java虛擬機的面向對象的編程語言。使用Scala編程非常方便快捷。
Spark是2009年出現的一種基于內存的分布式計算框架,它的處理速度比經典的分布式計算框架Hadoop快得多。Spark的核心部分是由Scala實現的。Spark對于處理迭代運算非常有效,而分布式機器學習算法經常需要迭代運算,因此Spark能很好地與機器學習結合在一起。
本書共10章,介紹了如何使用Scala在Spark平臺上實現機器學習算法,其中Scala的版本為2.11.7,Spark采用基于Hadoop2.6的版本,這些都是比較新的版本。本書從數據分析師怎么開始數據分析入手,介紹了數據驅動過程和Spark的體系結構;通過操作SparkMLlib庫,介紹了機器學習的基本原理及MLlib所支持的幾個算法;接著介紹了Scala如何表示和使用非結構化數據,以及與圖相關的話題;再接著介紹了Scala與R和Python的集成;最后介紹了一些特別適合Scala編程的NLP常用算法及現有的Scala監控解決方案。總之,本書非常適合從事分布式機器學習的數據工作者,使用書中提供的大量針對性編程例子,可提高工程實戰能力。
本書的第1~3章和第7章由重慶工商大學計算機科學與信息工程學院劉波博士翻譯;第4~6章和第8~10章由重慶工商大學計算機科學與信息工程學院羅棻翻譯。同時,劉波博士負責全書的技術審校工作。
翻譯本書的過程也是譯者不斷學習的過程。為了保證專業詞匯翻譯的準確性,我們在翻譯過程中查閱了大量相關資料。但由于時間和能力有限,書中內容難免出現差錯。若有問題,讀者可通過電子郵件(liubo7971@163.com;luofcn@163.com)與我們聯系,歡迎一起探討,共同進步。并且,我們也會將最終的勘誤信息公布在http://www.cnblogs.com/mlcv/上。
本書的順利出版還要特別感謝機械工業出版社華章公司的編輯在翻譯過程中給予的幫助!
本書的翻譯也得到如下項目資助:(1)國家自然科學基金一般項目,非同步脈沖神經膜系統研究,項目號:61502063;(2)重慶市檢測控制集成系統工程實驗室新技術新產品開放課題,基于圖像內容的目標檢測算法及應用研究,項目號:KFJJ2016042。