大數據學習路線

  • 2019 年 12 月 15 日
  • 筆記

大數據處理流程

上圖是一個簡化的大數據處理流程圖,大數據處理的主要流程包括數據收集、數據存儲、數據處理、數據應用等主要環節。下面我們逐一對各個環節所需要的技術棧進行講解:

1.1 數據收集

大數據處理的第一步是數據的收集。現在的中大型項目通常採用微服務架構進行分散式部署,所以數據的採集需要在多台伺服器上進行,且採集過程不能影響正常業務的開展。基於這種需求,就衍生了多種日誌收集工具,如 Flume 、Logstash、Kibana 等,它們都能通過簡單的配置完成複雜的數據收集和數據聚合。

1.2 數據存儲

收集到數據後,下一個問題就是:數據該如何進行存儲?通常大家最為熟知是 MySQL、Oracle 等傳統的關係型資料庫,它們的優點是能夠快速存儲結構化的數據,並支援隨機訪問。但大數據的數據結構通常是半結構化(如日誌數據)、甚至是非結構化的(如影片、音頻數據),為了解決海量半結構化和非結構化數據的存儲,衍生了 Hadoop HDFS 、KFS、GFS 等分散式文件系統,它們都能夠支援結構化、半結構和非結構化數據的存儲,並可以通過增加機器進行橫向擴展。

分散式文件系統完美地解決了海量數據存儲的問題,但是一個優秀的數據存儲系統需要同時考慮數據存儲和訪問兩方面的問題,比如你希望能夠對數據進行隨機訪問,這是傳統的關係型資料庫所擅長的,但卻不是分散式文件系統所擅長的,那麼有沒有一種存儲方案能夠同時兼具分散式文件系統和關係型資料庫的優點,基於這種需求,就產生了 HBase、MongoDB。

1.3 數據分析

大數據處理最重要的環節就是數據分析,數據分析通常分為兩種:批處理和流處理。

  • 批處理:對一段時間內海量的離線數據進行統一的處理,對應的處理框架有 Hadoop MapReduce、Spark、Flink 等;
  • 流處理:對運動中的數據進行處理,即在接收數據的同時就對其進行處理,對應的處理框架有 Storm、Spark Streaming、Flink Streaming 等。

批處理和流處理各有其適用的場景,時間不敏感或者硬體資源有限,可以採用批處理;時間敏感和及時性要求高就可以採用流處理。隨著伺服器硬體的價格越來越低和大家對及時性的要求越來越高,流處理越來越普遍,如股票價格預測和電商運營數據分析等。

上面的框架都是需要通過編程來進行數據分析,那麼如果你不是一個後台工程師,是不是就不能進行數據的分析了?當然不是,大數據是一個非常完善的生態圈,有需求就有解決方案。為了能夠讓熟悉 SQL 的人員也能夠進行數據的分析,查詢分析框架應運而生,常用的有 Hive 、Spark SQL 、Flink SQL、 Pig、Phoenix 等。這些框架都能夠使用標準的 SQL 或者 類 SQL 語法靈活地進行數據的查詢分析。這些 SQL 經過解析優化後轉換為對應的作業程式來運行,如 Hive 本質上就是將 SQL 轉換為 MapReduce 作業,Spark SQL 將 SQL 轉換為一系列的 RDDs 和轉換關係(transformations),Phoenix 將 SQL 查詢轉換為一個或多個 HBase Scan。

1.4 數據應用

數據分析完成後,接下來就是數據應用的範疇,這取決於你實際的業務需求。比如你可以將數據進行可視化展現,或者將數據用於優化你的推薦演算法,這種運用現在很普遍,比如短影片個性化推薦、電商商品推薦、頭條新聞推薦等。當然你也可以將數據用於訓練你的機器學習模型,這些都屬於其他領域的範疇,都有著對應的框架和技術棧進行處理,這裡就不一一贅述。

1.5 其他框架

上面是一個標準的大數據處理流程所用到的技術框架。但是實際的大數據處理流程比上面複雜很多,針對大數據處理中的各種複雜問題分別衍生了各類框架:

  • 單機的處理能力都是存在瓶頸的,所以大數據框架都是採用集群模式進行部署,為了更方便的進行集群的部署、監控和管理,衍生了 Ambari、Cloudera Manager 等集群管理工具;
  • 想要保證集群高可用,需要用到 ZooKeeper ,ZooKeeper 是最常用的分散式協調服務,它能夠解決大多數集群問題,包括首領選舉、失敗恢復、元數據存儲及其一致性保證。同時針對集群資源管理的需求,又衍生了 Hadoop YARN ;
  • 複雜大數據處理的另外一個顯著的問題是,如何調度多個複雜的並且彼此之間存在依賴關係的作業?基於這種需求,產生了 Azkaban 和 Oozie 等工作流調度框架;
  • 大數據流處理中使用的比較多的另外一個框架是 Kafka,它可以用於消峰,避免在秒殺等場景下並發數據對流處理程式造成衝擊;
  • 另一個常用的框架是 Sqoop ,主要是解決了數據遷移的問題,它能夠通過簡單的命令將關係型資料庫中的數據導入到 HDFS 、Hive 或 HBase 中,或者從 HDFS 、Hive 導出到關係型資料庫上。

學習路線

介紹完大數據框架,接著就可以介紹其對應的學習路線了,主要分為以下幾個方面:

2.1 語言基礎

1. Java

大數據框架大多採用 Java 語言進行開發,並且幾乎全部的框架都會提供 Java API 。Java 是目前比較主流的後台開發語言,所以網上免費的學習資源也比較多。如果你習慣通過書本進行學習,這裡推薦以下入門書籍:

  • 《Java 編程的邏輯》:這裡一本國人編寫的系統入門 Java 的書籍,深入淺出,內容全面;
  • 《Java 核心技術》:目前最新的是第 10 版,有卷一 和卷二 兩冊,卷二可以選擇性閱讀,因為其中很多章節的內容在實際開發中很少用到。

目前大多數框架要求 Java 版本至少是 1.8,這是由於 Java 1.8 提供了函數式編程,使得可以用更精簡的程式碼來實現之前同樣的功能,比如你調用 Spark API,使用 1.8 可能比 1.7 少數倍的程式碼,所以這裡額外推薦閱讀 《Java 8 實戰》 這本書籍。

2. Scala

Scala 是一門綜合了面向對象和函數式編程概念的靜態類型的程式語言,它運行在 Java 虛擬機上,可以與所有的 Java 類庫無縫協作,著名的 Kafka 就是採用 Scala 語言進行開發的。

為什麼需要學習 Scala 語言 ?這是因為當前最火的計算框架 Flink 和 Spark 都提供了 Scala 語言的介面,使用它進行開發,比使用 Java 8 所需要的程式碼更少,且 Spark 就是使用 Scala 語言進行編寫的,學習 Scala 可以幫助你更深入的理解 Spark。同樣的,對於習慣書本學習的小夥伴,這裡推薦兩本入門書籍:

  • 《快學 Scala(第 2 版)》
  • 《Scala 編程 (第 3 版)》

這裡說明一下,如果你的時間有限,不一定要學完 Scala 才去學習大數據框架。Scala 確實足夠的精簡和靈活,但其在語言複雜度上略大於 Java,例如隱式轉換和隱式參數等概念在初次涉及時會比較難以理解,所以你可以在了解 Spark 後再去學習 Scala,因為類似隱式轉換等概念在 Spark 源碼中有大量的運用。

2.2 Linux 基礎

通常大數據框架都部署在 Linux 伺服器上,所以需要具備一定的 Linux 知識。Linux 書籍當中比較著名的是 《鳥哥私房菜》系列,這個系列很全面也很經典。但如果你希望能夠快速地入門,這裡推薦《Linux 就該這麼學》,其網站上有免費的電子書版本。

2.3 構建工具

這裡需要掌握的自動化構建工具主要是 Maven。Maven 在大數據場景中使用比較普遍,主要在以下三個方面:

  • 管理項目 JAR 包,幫助你快速構建大數據應用程式;
  • 不論你的項目是使用 Java 語言還是 Scala 語言進行開發,提交到集群環境運行時,都需要使用 Maven 進行編譯打包;
  • 大部分大數據框架使用 Maven 進行源碼管理,當你需要從其源碼編譯出安裝包時,就需要使用到 Maven。

2.4 框架學習

1. 框架分類

上面我們介紹了很多大數據框架,這裡進行一下分類總結:

日誌收集框架:Flume 、Logstash、Kibana

分散式文件存儲系統:Hadoop HDFS

資料庫系統:Mongodb、HBase

分散式計算框架

  • 批處理框架:Hadoop MapReduce
  • 流處理框架:Storm
  • 混合處理框架:Spark、Flink

查詢分析框架:Hive 、Spark SQL 、Flink SQL、 Pig、Phoenix

集群資源管理器:Hadoop YARN

分散式協調服務:Zookeeper

數據遷移工具:Sqoop

任務調度框架:Azkaban、Oozie

集群部署和監控:Ambari、Cloudera Manager

上面列出的都是比較主流的大數據框架,社區都很活躍,學習資源也比較豐富。建議從 Hadoop 開始入門學習,因為它是整個大數據生態圈的基石,其它框架都直接或者間接依賴於 Hadoop 。接著就可以學習計算框架,Spark 和 Flink 都是比較主流的混合處理框架,Spark 出現得較早,所以其應用也比較廣泛。Flink 是當下最火熱的新一代的混合處理框架,其憑藉眾多優異的特性得到了眾多公司的青睞。兩者可以按照你個人喜好或者實際工作需要進行學習。

圖片引用自https://www.edureka.co/blog/hadoop-ecosystem

至於其它框架,在學習上並沒有特定的先後順序,如果你的學習時間有限,建議初次學習時候,同一類型的框架掌握一種即可,比如日誌收集框架就有很多種,初次學習時候只需要掌握一種,能夠完成日誌收集的任務即可,之後工作上有需要可以再進行針對性地學習。

2. 學習資料

大數據最權威和最全面的學習資料就是官方文檔。熱門的大數據框架社區都比較活躍、版本更新迭代也比較快,所以其出版物都明顯滯後於其實際版本,基於這個原因採用書本學習不是一個最好的方案。比較慶幸的是,大數據框架的官方文檔都寫的比較好,內容完善,重點突出,同時都採用了大量配圖進行輔助講解。當然也有一些優秀的書籍歷經時間的檢驗,至今依然很經典,這裡列出部分個人閱讀過的經典書籍:

  • 《hadoop 權威指南 (第四版)》 2017 年
  • 《Kafka 權威指南》 2017 年
  • 《從 Paxos 到 Zookeeper 分散式一致性原理與實踐》 2015 年
  • 《Spark 技術內幕 深入解析 Spark 內核架構設計與實現原理》 2015 年
  • 《Spark.The.Definitive.Guide》 2018 年
  • 《HBase 權威指南》 2012 年
  • 《Hive 編程指南》 2013 年

3. 影片學習資料

上面我推薦的都是書籍學習資料,很少推薦影片學習資料,這裡說明一下原因:因為書籍歷經時間的考驗,能夠再版的或者豆瓣等平台評價高的證明都是被大眾所認可的,從概率的角度上來說,其必然更加優秀,不容易浪費大家的學習時間和精力,所以我個人更傾向於官方文檔或者書本的學習方式,而不是影片。因為影片學習資料,缺少一個公共的評價平台和完善的評價機制,所以其品質良莠不齊。但是影片任然有其不可替代的好處,學習起來更直觀、印象也更深刻,所以對於習慣影片學習的小夥伴,這裡我各推薦一個免費的和付費的影片學習資源,大家按需選擇:

  • 免費學習資源:尚矽谷大數據學習路線 —— 下載鏈接 在線觀看鏈接
  • 付費學習資源:慕課網 Michael PK 的系列課程

開發工具

這裡推薦一些大數據常用的開發工具:

Java IDE:IDEA 和 Eclipse 都可以。從個人使用習慣而言,更傾向於 IDEA ;

VirtualBox:在學習過程中,你可能經常要在虛擬機上搭建服務和集群。VirtualBox 是一款開源、免費的虛擬機管理軟體,雖然是輕量級軟體,但功能很豐富,基本能夠滿足日常的使用需求;

MobaXterm:大數據的框架通常都部署在伺服器上,這裡推薦使用 MobaXterm 進行連接。同樣是免費開源的,支援多種連接協議,支援拖拽上傳文件,支援使用插件擴展;

Translate Man:一款瀏覽器上免費的翻譯插件 (Google和火狐均支援)。它採用Google的翻譯介面,準確性非常高,支援劃詞翻譯,可以輔助進行官方文檔的閱讀。

結語

以上就是個人關於大數據的學習心得和路線推薦。本片文章對大數據技術棧做了比較狹義的限定,隨著學習的深入,大家也可以把 Python 語言、推薦系統、機器學習等逐步加入到自己的大數據技術棧中。