1. 程式人生 > >你的大資料學習路線

你的大資料學習路線

  • 引言

本文的目的是希望給所有大資料初學者規劃一條比較清晰的學習路線,幫助他們開啟大資料學習之旅。鑑於大資料領域內的技術絢麗繁複,每位大資料初學者都應該根據自己的實際情況制定專屬的學習路徑。

大資料,即Big Data,關於它的定義很多,最權威的莫屬IBM的定義,讀者可以自行查閱,筆者在這裡不再贅述。既然本文關注的是如何學習大資料,那麼我們首先就要定義大資料領域內的不同角色,這樣各位讀者才能根據自身實際情況找準自己的定位,從而開啟學習過程。

  • 角色

以筆者的愚見,當下大資料行業有如下兩類角色。

  1. 大資料工程

  2. 大資料分析

這兩類角色相互依存但又獨立運作,需要更多大資料學習視訊資料加我扣扣群:606859705歡迎大家加入.何意?沒有大資料工程,大資料分析便無從談起;但若沒有大資料分析,大資料工程也沒有存在的理由。這就類似於結婚和談戀愛——談戀愛的目的是為了結婚,且不以結婚為目的的談戀愛都是耍流氓。 

具體來說,大資料工程需要解決資料的定義、收集、計算與儲存的工作,因此大資料工程師們在設計和部署這樣的系統時首要考慮的是資料高可用的問題,即大資料工程系統需要實時地為下游業務系統或分析系統提供資料服務;而大資料分析角色定位於如何利用資料——即從大資料工程系統中接收到資料之後,如何為企業或組織提供有產出的資料分析,並且確實能夠幫助公司進行業務改善或提升服務水平,所以對於大資料分析師來說,他們首要解決的問題是發現並利用資料的價值,具體可能包括:趨勢分析、模型建立以及預測分析等。

簡單總結一下,大資料工程角色需要考慮資料的收集、計算(或是處理)和儲存;大資料分析角色則是執行資料的高階計算。

  • 我們屬於哪種角色

既然我們瞭解了大資料領域內的角色分類,下面自然就需要“對號入座”確定自己的定位,這樣才能有的放矢地開始學習大資料。在考慮這個問題時,我們需要參考如下兩方面的因素。

  1. 專業知識背景

  2. 行業經驗

這裡的專業知識背景不是指學歷、院校這種背景,而是你對某些IT技術的瞭解程度。即使你不是計算機專業出身,只要你對C語言有一腔熱血,哪怕是C之父Dennis Ritchie也不敢小瞧你。因此,這裡的專業知識其實就只有如下兩個。

  1. 計算機專業知識,比如作業系統、程式語言、計算機執行原理等。

  2. 數學知識,這裡指代的是高等數學,比如微積分、概率統計、線性代數和離散數學等,並不是x×x+y×y= 1畫出來是什麼圖形這樣的數學。

而行業經驗指的是你在相關領域內的工作經驗,具體可以分為如下3檔。

  1. 菜鳥。

  2. 有一定經驗的工程師。

  3. 資深專家——現在在大資料領域內有一個更酷的名字,即資料科學家,比如前百度首席資料科學家吳恩達博士。

好了,現在我們就可以根據上面的分類來定義自己的角色。比如拿筆者來說,對自己的定位是:“我是一名計算機專業畢業的工程師,有一定的數學基礎(特別是在微積分和線性代數方面),但數理統計和概率論部分不是我的強項。”另外最好別打腫臉充胖子,如果之前沒什麼經驗,承認自己是菜鳥也沒事,關鍵是找準自己的定位。

確定自己的定位後,我們需要對應到特定的大資料角色,以下是一些基本法則。

  1. 如果您具有良好的程式設計基礎且深入瞭解計算機的互動方式以及網際網路底層技術原理,但數學和統計學掌握得不深,那麼大資料工程可能是您今後學習的方向。

  2. 如果您有一定的程式設計基礎(掌握一些高階語言,如Python等),同時又有很強的數學功底,那麼大資料分析可能是您努力的方向。

  • 學習路線

不管您屬於以上哪種角色,有一些大資料理論知識是您必須要掌握的,它們包括但不限於以下這些。

  • 資料分片與路由:挑一個典型的分割槽演算法去學習,比如一致性雜湊演算法(https://en.wikipedia.org/wiki/Consistent_hashing)。

  • 備份機制與一致性。

√ 學習國內被奉為“聖經”但在國外也就一般的CAP理論(https://en.wikipedia.org/wiki/CAP_theorem)。

√ 冪等性(Idempotent),很多分散式系統狀態管理的基石(https://mortoray.com/2014/09/05/what-is-an-idempotent-function/)。

√ 各種一致性模型:強一致性、弱一致性、最終一致性。

√ 備份機制:主從的叫法已經不怎麼流行了,當前更酷的叫法是Leader-Follower模式。

√ 共識協議:國內通常翻譯成一致性協議(consensus protocol)。學習常見的Paxos和Raft協議。

  • 演算法和資料結構。

√ LSM:學習其與B+樹的區別以及優勢是什麼。

√ 壓縮演算法:瞭解一個主流的壓縮演算法,比如Snappy、LZ4。另外Facebook最近開源了新一代的壓縮演算法Zstandard,據說可以完爆一切主流壓縮演算法。

√ Bloom Filter過濾器:大資料下O(1)的過濾器。

無論是學習大資料工程還是大資料分析,這些理論知識都是必要的,因為它們是設計很多分散式系統必備的技能。下面我們就針對不同的角色設計不同的學習路線。

  • 大資料工程師

對於大資料工程師而言,您至少要掌握以下技能。

  • 一門JVM系語言:當前大資料生態JVM系語言類的比重極大,在某種程度上說是壟斷也不為過。這裡筆者推薦大家學習Java或Scala,至於Clojure這樣的語言上手不易,其實並不推薦大家使用。另外,如今是“母以子貴”的年代,某個大資料框架會帶火它的程式語言,比如Docker之於Go、Kafka之於Scala。因此筆者這裡建議您至少要精通一門JVM系的語言。值得一提的,一定要弄懂這門語言的多執行緒模型和記憶體模型,很多大資料框架的處理模式其實在語言層面與多執行緒處理模式是類似的,只是大資料框架把它們引申到了多機分散式這個層面。

筆者建議:學習Java或Scala。

  • 計算處理框架:嚴格來說,分為離線批處理和流式處理。流式處理是未來的趨勢,建議大家一定要學習;而離線批處理其實已經快過時了,它的分批處理思想無法處理無窮資料集,因此適用範圍日益縮小。事實上,Google已經在公司內部正式廢棄了以MapReduce為代表的離線處理。因此如果要學習大資料工程,掌握一門實時流式處理框架是必需。當下主流的框架包括Apache Samza、Apache Storm、Apache Spark Streaming以及最近一年風頭正勁的Apache Flink。當然Apache Kafka也推出了它自己的流式處理框架Kafka Streams。

筆者建議:學習Flink、Spark Streaming或Kafka Streams中的一種。另外,請熟讀Google大神的這篇文章《The world beyond batch: Streaming 101》,地址是https://www.oreilly.com/ideas/the-world-beyond-batch-streaming-101。

  • 分散式儲存框架:雖說MapReduce有些過時了,但Hadoop的另一個基石HDFS依然堅挺,並且是開源社群最受歡迎的分散式儲存框架,絕對值得您花時間去學習。如果想深入研究的話,Google的GFS論文也是一定要讀的(https:// static.googleusercontent.com/media/research.google.com/en//archive/gfs-sosp2003.pdf)。當然開源世界中還有很多的分散式儲存框架,國內阿里巴巴的OceanBase是其中很優秀的一款。

筆者建議:學習HDFS。

  • 資源排程框架:Docker可是整整火了最近一兩年。各個公司都在發力基於Docker的容器解決方案,最有名的開源容器排程框架就是Kubernetes了,但同樣著名的還有Hadoop的YARN和Apache Mesos。後兩者不僅可以排程容器叢集,還可以排程非容器叢集,非常值得我們學習。

筆者建議:學習YARN。

  • 分散式協調框架:有一些通用的功能在所有主流大資料分散式框架中都需要實現,比如服務發現、領導者選舉、分散式鎖、KV儲存等。這些功能促進了分散式協調框架的發展。最古老也是最有名的當屬Apache Zookeeper了,新一些的包括Consul、Etcd等。學習大資料工程,分散式協調框架是不能不瞭解的,從某種程度上說還應該深入瞭解。

筆者建議:學習ZooKeeper——太多大資料框架都需要它,比如Kafka、Storm、HBase等。

  • KV資料庫:典型的就是Memcache和Redis了,特別是Redis簡直髮展神速。Redis簡單的API設計和高效能的TPS日益得到廣大使用者的青睞。即使不學習大資料,學學Redis都是大有裨益的。

筆者建議:學習Redis,如果C語言功底好,最好熟讀原始碼,其原始碼也不是很多。

  • 列式儲存資料庫:筆者曾經花了很長的時間學習Oracle,但不得不承認當下關係型資料庫已經慢慢地淡出了人們的視野,有太多的方案可以替代RDBMS了。人們針對行式儲存不適用於大資料Ad-Hoc查詢這種弊端開發出列式儲存,典型的列式儲存資料庫就是開源社群的HBase。實際上列式儲存的概念也是出自Google的一篇論文《Google BigTable》,大家有興趣的話最好讀一下(https://static.googleusercontent.com/media/research.google.com/en//archive/bigtable-osdi06.pdf)。

筆者建議:學習HBase,這是目前應用最廣泛的開源列式儲存。

  • 訊息佇列:大資料工程處理中訊息佇列作為“削峰填谷”的主力系統是必不可少的,當前該領域內的解決方案有很多,包括ActiveMQ、Kafka等。國內阿里也開源了RocketMQ。這其中的翹楚當屬Apache Kafka了。Kafka的很多設計思想都特別契合分佈流式資料處理的設計理念。這也難怪,Kafka的原作者Jay Kreps可是當今實時流式處理方面的頂級大神。

筆者建議:學習Kafka,不僅好找工作(幾乎所有大資料招聘簡歷都要求會Kafka:-)),還能觸類旁通地進一步理解基於備份日誌方式的資料處理範型。

  • 大資料分析師或資料科學家

要想成為一名資料科學家,您至少要掌握以下技能。

  • 數學功底:微積分是必須要掌握的。不一定要掌握多元微積分,但一元微積分是必須要熟練掌握並使用的。另外線性代數一定要精通,特別是矩陣的運算、向量空間、秩等概念。當前機器學習框架中很多計算都需要用到矩陣的乘法、轉置或是求逆。雖然很多框架都直接提供了這樣的工具,但我們至少要了解內部的原型原理,比如如何高效判斷一個矩陣是否存在逆矩陣並如何計算等。

筆者建議:重溫同濟版《高等數學》,有條件的可以去Coursea學習賓夕法尼亞大學的微積分課程。推薦學習Strang的線性代數《Introduction to Linear Algebra》——這是最經典的教材,沒有之一!

  • 數理統計:概率論和各種統計學方法要做到基本掌握,比如貝葉斯概率如何計算?概率分佈是怎麼回事?雖不要求精通,但對相關背景和術語一定要了解。

筆者建議:找一本《概率論》重新學習下。

  • 互動式資料分析框架:這裡並不是指SQL或資料庫查詢,而是像Apache Hive或Apache Kylin這樣的分析互動框架。開源社群中有很多類似的框架,可以使用傳統的資料分析方式對大資料進行資料分析或資料探勘。筆者有過使用經驗的是Hive和Kylin。不過Hive特別是Hive1是基於MapReduce的,效能並非特別出色,而Kylin採用資料立方體的概念結合星形模型,可以做到極低延時的分析速度,況且Kylin是第一個研發團隊主力是中國人的Apache孵化專案,因此日益受到廣泛的關注。

筆者建議:首先學習Hive,有時間的話瞭解一下Kylin以及背後的資料探勘思想。

  • 機器學習框架:機器學習當前真是火爆宇宙了,人人都提機器學習和AI,但筆者一直認為機器學習恰似幾年前的雲端計算,目前雖然火爆,但沒有實際的落地專案,可能還需要幾年的時間才能逐漸成熟。不過現在就開始儲備機器學習的知識總是沒有壞處的。說到機器學習的框架,大家耳熟能詳的有很多種,信手拈來的就有TensorFlow、Caffe8、Keras9、CNTK10、Torch711等,其中又以TensorFlow領銜。

筆者建議:可以選取一個機器學習框架進行學習,但這些框架大多封裝了各種機器學習演算法提供給使用者使用,因此還是從機器學習演算法的原理來學習比較好,比如:Udacity的課程是非常入門級的機器學習課程(https:// classroom.udacity.com/courses/ud120);目前機器學習領域最牛的入門課程,即吳恩達博士的Machine Learning;學習Python的scikit-learn庫(http://scikit-learn.org/stable/);找一本書籍來看,國內有周志華的《機器學習》,還可以期待吳恩達的新書《Machine Learning Yearning》;最後如果覺得掌握得差不多了,可以嘗試挑戰Kaggle(https://www.kaggle. com/)。

  • 總結

以上就是我對大資料學習路線的一些思考和建議,希望對讀者朋友們有所幫助。需要更多大資料學習視訊資料加我扣扣群:606859705歡迎大家加入