前言
要從事計算機行業的工作,不管是什么工作,開發、測試、還是算法等,都是要有一門自己比較熟練的編程語言,編程語言可以是C語言、Java、C++等,只要是和你后續工作所相關的就可以(后續用到其他語言的話,你有一門語言基礎了,學起來就快了)。一般初學者入門語言大多都會選擇Java、C語言、C++或者Python,而且現在網上有很多好的視頻,可以供初學者學習使用。關于學習視頻或者資料的選擇,知乎或者百度等都有很多講解了,也可以跟師兄師姐咨詢,這樣可以少走很多彎路,當然,有人說,走一些彎路總是有好處的,但是我這里說的彎路不是說不犯錯誤,不調bug,而是指學習資料以及一些知識點的偏重點,這樣可以盡量節約一部分時間,剛開始時,總會有點迷,而且當你真正投入進去學習時,會發現時間總是不夠用。
我前面是做的Java后端,后續才轉的大數據,所以一些Java開發所需要的東西自己也有學習過,也都是按照正常的路線走的,JavaSE階段,然后數據庫,SSM框架,接著做了一些網上找的項目,之后發現對大數據比較感興趣,就開始找大數據相關的資料學習,看視頻,看博客,敲代碼,前期大概花了3-4個月吧(公眾號的這些資料就是我當時看過的),也是一步步艱難走過來的,剛剛開始接觸大數據相關的東西時,一度懷疑這么多東西自己能否學得完,是不是能用得到,學完又忘了,忘了又回頭看,不過還好,堅持過來了,還好沒有放棄,工作也還ok,找的大數據開發崗,待遇也還不錯吧。
下面就說一下我自己從Java開發到大數據開發的曲折學習之路(狗頭保命.jpg)。因為我現在是做大數據相關的工作了,所以Java后端涉及到的一些SSM框架等知識點我就不介紹了,畢竟后續一段時間也沒有做了。自己看過的大數據學習相關的視頻+資料大概是200G-300G吧,從Linux->Hadoop->。。。->Spark->項目,還有就是一些面試文檔,面經等。一些視頻看了兩遍或者更多,跟著學,跟著敲代碼,做項目,準備面試。涉及到需要學習的東西包括:JavaSE,數據結構與算法(計算機行業必備),MySQL,Redis,ES(數據庫這些可以看項目,也可以自己熟練一兩個),Linux,Shell(這個可以后期補),Hadoop,Zookeeper,Hive,Flume,Kafka,HBase,Scala(Spark是Scala寫的,會Scala做相關的項目會更容易入手),Spark,Flink(這個是找工作時有面試官問過幾次liao不liao解,所以找完工作才開始接觸學習),相關項目。
編程語言階段學習? 如果是零基礎的話,建議還是從視頻開始入門比較好,畢竟一上來就看教材,這樣有些代碼的來龍去脈可能不是很了解。如果是有一些編程語言基礎的話,從視頻開始也會更簡單,一些for、while循環你都知道了,學起來也會快很多。? JavaSE我是選擇的某馬劉意的為主,因為剛剛開始學Java看過一本從《Java從入門到精通》,沒什么感覺,后續又在看了某課網的Java初級視頻,還是沒感覺出來啥(當時就有點懷疑自己了。。。),可能有點沒進入狀態。? 還好后續找了某馬劉意老師的JavaSE視頻(我是看的2015年版本,那時候19版還沒出),覺得他講的真的是很好很詳細,每個知識點都會有例子,也都會帶你敲代碼,做測試,可能前面有C語言基礎,然后也看過Java的一些語法,所以學起來還是比較順利,后面的IO流、多線程等知識點時,也有看書看博客,或者看看其他老師的課程,講解的可能自己比較容易接受就可以,反正都是多嘗試(下面會給出視頻鏈接),盡量懂一些,后續可以回頭來復習。JavaSE相關的視頻,先看一遍,后續有時間建議再看一遍,而且這些經典的視頻,看兩遍真的是享受。? 如果有一定基礎了的,JavaSE前面七八天的視頻可以加速看,但是不懂的一定要停下開仔細想想,零基礎的還是盡量不要加速吧,慢慢來穩些。后面的視頻建議還是跟著視頻來,盡量不要加速,代碼盡量都敲一敲,第一遍基本上一個月到一個半月可以結束。? JavaSE可以說是很基礎也很重要的東西,主要重點包括面向對象、集合(List、Map等),IO流,String/StringBuilder/StringBuffer、反射、多線程,這些最好是都要熟悉一些,面試也是重點。? JavaSE之后,如果你是要走前端或后端開發路線的話,可以跟著一些網上的視頻繼續學習,這里我就不多做介紹了。
===========分割線,Scala可以后續Spark階段再接觸學習=============
? Scala的學習,Scala是一門多范式 (multi-paradigm) 的編程語言,Scala支持面向對象和函數式編程,最主要的是后續Spark的內容需要用到Scala,所以前面學習了JavaSE,到Spark學習之前,再把Scala學習一波,美滋滋,而且Scala可以和Java進行無縫對接,混合使用,更是爽歪歪。后續Spark學習時基本都是用的Scala,也可能是和Java結合使用,所以Spark之前建議還是先學一波Scala,而且Scala用起來真是很舒服(wordcount一行代碼搞定),適合迭代式計算,對數據處理有很大幫助,不過Scala看代碼很容易看懂,但是學起來還是挺難的,比如樣例類(case class)用起來真是nice,但是隱式轉換學起來就相對比較難。學習Scala的建議:1. 學習scala 特有的語法,2. 搞清楚scala和java區別,3. 了解如何規范的使用scala。Scala對學習Spark是很重要的(后面Flink也是要用),雖然現在很多公司還是用Java開發比較多,而且Spark是Scala寫的,如果要讀源碼,會Scala還是很重要的(至少要看得懂代碼)。? Scala主要重點包括:隱式轉換和隱式參數、模式匹配、函數式編程。這里我看的是某硅谷韓老師的Scala視頻,韓老師講的真的很不錯,五星推薦,哈哈。? 也許有人會覺得Python也是需要的,但是學習階段,可能用Java還是比較多,面試也基本都是問Java相關的內容,所以Python后續工作會用到的話,再看看Python的內容吧。
大數據框架階段學習? 大數據這方面的知識點自己可以說真的是從零開始的,剛剛開始學那會Linux基本都沒用過,心里那個虛啊,而且時間也緊迫,想起來都是一把辛酸淚。? 剛剛開始學的時候,看了廈門大學林子雨的《 大數據技術原理與應用》課程,可能這個課程是面對上課的,所以看了一些,感覺對自己幫助不是很大(并不是說課程不好,可能不太適合自己,如果是要了解理論知識,很透徹,但是俺時間緊迫啊),所以就繼續在網上找視頻,然后發現某硅谷的培訓視頻很多人去參加,而且知識點也很齊全,大數據相關組件都有講課,還有一些項目比較好,所以就找了它相關的視頻,當時看的是2018年的,所以視頻不算舊。? 來一張推薦系統架構的圖,先看看
? 一般來說,Flume+Kafka對數據進行采集聚合傳輸,一方面Spark對實時數據進行處理,傳輸給相應的數據處理模塊(比如實時數據處理的算法模塊,Spark也有提供常見的機器學習算法的程序庫),另一方面采集的數據也可以放入數據庫(HBase、MongoDB等)中,后續MapReduce對離線數據進行離線處理,數據處理完畢用于后續的使用,數據采集處理的流程大概就是這樣。如果是推薦系統,實時推薦會給用戶產生實時的推薦結果,讓用戶進行查閱選擇,比如你在界面瀏覽了或者看了新的物品,然后刷新下界面,可能給你展示的東西就有一些變成跟你剛剛瀏覽的相關了。離線推薦的話主要是對離線數據進行處理,為物品或種類做出相似的推薦,如果后續用戶搜索相應的物品時,給用戶展示相應的產品。
? 大數據學習路線:Linux -> Hadoop -> Zookeeper -> Hive -> Flume -> Kafka -> HBase -> Scala -> Spark -> 項目 - > Flink( 如果需要學習Storm,在Spark前面學習)
一、Linux(基本操作)? 一般我們使用的都是虛擬機來進行操作,所以要安裝VM( Virtual Machine),我使用的是CentOS,所以VM和CentOS都要跟著安裝好,跟著視頻操作,一定要動手實踐,將一些Linux基本命令熟練掌握,一些VIM編輯器的命令也要會用,做相應的一些配置,使用SecureCRT來做遠程登錄操作(也可以使用其他的,自己順手就行)。再強調一遍,基本操作命令盡量熟練一點,如果一下記不住,打印一些常用的,自己看看,多用多實踐,慢慢就會用了。還有一些軟件包的下載安裝卸載等,跟著操作一遍,熟悉下,后續都會使用,Shell編程可以后續補。
二、Hadoop(重點中的重點)? Hadoop是一個分布式系統基礎框架,用于主要解決海量數據的存儲和海量數據的分析計算問題,也可以說Hadoop是后續整個集群環境的基礎,很多框架的使用都是會依賴于Hadoop。主要是由HDFS、MapReduce、YARN組成。這個部分安裝Hadoop,Hadoop的三個主要組成部分是重點,對他們的概念要理解出來,知道他們是做什么的,搭建集群環境,偽分布式模式和完全分布式模式的搭建,重要的是完全分布式的搭建,這些部分一定要自己動手實踐,自己搭建集群,仔細仔細再仔細,Hadoop的NameNode,DataNode,YARN的啟動關閉命令一定要知道,以及他們的啟動關閉順序要記住,不要搞混。后續視頻會有一些案例操作,跟著寫代碼,做測試,把基本環境都配置好,后續這個集群(完全分布式需要三臺虛擬機)要一直使用。
三、Zookeeper? Zookeeper是一個開源的分布式的,為分布式應用提供協調服務的Apache項目。分布式安裝ZK,對ZK有一定的了解就可以了,了解它的應用場景,以及內部原理,跟著做一些操作,基本上有一些了解即可。
四、Hive(重點)? Hive是基于Hadoop的數據倉庫工具,可以將結構化的數據文件映射為一張表,并提供類SQL查詢功能。Hive的安裝,它的數據類型,以及它的數據定義、數據操作有較好的了解,怎么操作表(創建表、刪除表,創建什么類型的表,他們有什么不同),怎么操作數據(加載數據,下載數據,對不同的表進行數據操作),對數據的查詢一定要進行實踐操作,以及對壓縮方式和存儲格式要有一些了解,用到時不懂也可以去查,最好是能理解清楚。這部分有什么面試可能會問,所以視頻后續的面試講解可以看看,理解清楚。
五、Flume? Flume是一個高可用的,高可靠的,分布式的海量日志采集、聚合和傳輸的系統。對于Flume,對它的組成架構,以及對Flume Agent的內部原理要理解清楚,Source、Channel、Sink一定要知道它們的各種類型以及作用,有哪些拓撲結構是常見常用的,例如一對一,單Source、多Channel、多Sink等,它們有什么作用,要理解清楚。還有一個重點,就是對Flume的配置文件一定要了解清楚,不懂的可以上官網查看案例,對于不同的情況,它的配置文件要做相應的修改,才能對數據進行采集處理,視頻中的實踐案例一定要跟著做。
六、Kafka(重點)? Kafka是一個分布式消息隊列,用來緩存數據的。比如說實時計算中可以通過Flume+Kafka對數據進行采集處理之后,Spark Streaming再使用Kafka相應的Topic中的數據,用于后續的計算使用。對于Kafka,要理解Kafka的架構,什么是Kafka,為什么需要Kafka,應用場景。基本的命令行操作要掌握,比如怎么創建刪除Topic,怎么通過生產者生成數據,消費者怎么消費數據等基本操作,官網也是有一些案例可以查閱的。
七、HBase(重點)? HBase是一個分布式的、基于列存儲的開源數據庫。HBase適合存儲PB級別的海量數據,也可以說HBase是很適合大數據的存儲的,它是基于列式存儲數據的,列族下面可以有非常多的列,列族在創建表的時候就必須指定。所以對HBase的數據結構要有一定的理解,特別是RowKey的設計部分(因為面試被問到過,咳咳,所以點一下),對于它的原理要了解,一些基本操作也要都會,比如創建表,對表的操作,基本的API使用等。
八、Spark(重點中的重點)? Spark是快速、易用、通用的大數據分析引擎。一說到Spark,就有一種哪哪都是重點感覺,哈哈。? Spark的組成可以看下圖
? Spark是基于內存計算的,對于數據的處理速度要比MapReduce快很多很多,而且數據挖掘這些都是要對數據做迭代式計算,MapReduce對數據的處理方式也不適合,而Spark是可以進行迭代式計算,很適合數據挖掘等場景。Spark的Spark SQL能夠對結構化數據進行處理,Spark SQL的DataFrame或DataSet可以作為分布式SQL查詢引擎的作用,可以直接使用Hive上的表,對數據進行處理。Spark Streaming主要用于對應用場景中的實時流數據進行處理,支持多種數據源,DStream是Spark Streaming的基礎抽象,由一系列RDD組成,每個RDD中存放著一定時間段的數據,再對數據進行處理,而且是基于內存計算,速度快,所以很適合實時數據的處理。Spark MLlib提供常見的機器學習(ML)功能的程序庫。包括分類、回歸、聚類、協同過濾等,還提供了模型評估、數據 導入等額外的支持功能。對Spark的核心組件、部署模式(主要是Standalone模式和YARN模式)、通訊架構、任務調度要有一定了解(面試問到了可以說一波),Spark Shuffle要好好理解,還有內存管理要知道,對Spark的內核原理一定要好好理解,不僅面試可能要用,以后工作也是有幫助的。
九、Flink(重點中的重點)? Flink是一個框架和分布式處理引擎,用于對無界(有開始無結束)和有界(有開始有結束)數據流進行有狀態計算。現在主要是阿里系公司使用的比較多,很多公司使用的還是Spark居多,而且Flink基本上都是和Spark很多功能大體上一樣的,但是以后Flink和Spark孰強孰弱還有待時間的考驗,不過Flink近幾年越來越火了這是事實,所以如果有時間有精力的話,可以學一學Flink相關的內容也是很不錯的。Spark和Flink主要都是在數據處理方面應用,在數據處理方面的話,離線數據處理:Flink暫時比不上Spark,Spark SQL優點在于可以和Hive進行無縫連接,Spark SQL可以直接使用Hive中的表;Flink暫時做不到這一步,因為官方不支持這一操作,Flink只能將數據讀取成自己的表,不能直接使用Hive中的表。對于實時數據的處理:Flink和Spark可以說是平分秋色吧,而且Flink是以事件為驅動對數據進行處理,而Spark是以時間為驅動對數據進行處理,在一些應用場景中,也許Flink的效果比Spark的效果還要好些,因為Flink對數據更加的敏感。比如一秒鐘如果觸發了成千上萬個事件,那么時間驅動型就很難對數據做細致的計算,而事件驅動型可以以事件為單位,一個個事件進行處理,相比而言延遲更低,處理效果更好。現在使用Flink的公司越來越多,有時間學習下,也算是有個準備。
項目階段? 其實某硅谷的視頻里面有很多大數據相關的項目,而且都是文檔配代碼的,B站上也有視頻,學習期間可以跟著視頻做兩到三個項目,自己理清思路,把項目理解透徹,還是可以學到很多東西的。? 根據自己情況,選擇兩到三個項目重點跟著做,理解透徹一點
大數據項目實戰? 某硅谷的視頻里面有很多大數據相關的項目,而且都是文檔配代碼的,學習期間可以跟著視頻做兩到三個項目,自己理清思路,把項目理解透徹,還是可以學到很多東西的。根據自己情況,選擇兩到三個項目重點跟著做,理解透徹一點。相關項目文檔資料我已經放到網盤,GongZhongHao回復相應關鍵字獲取領取方式。 ? 相關項目、涉及技術框架及其B站鏈接(B站鏈接主要是為了有些小伙伴網盤速度限制,這樣就下載文檔資料即可)
書籍? 書籍部分直接云盤鏈接保存即可,這里我放兩張Java開發和大數據開發我自己的書單(很多,路漫漫,吾將上下而求索~)? Java后端書架:
? 大數據書架:
? 大概就這些,看完就需要很久了,大部分我也是需要的時候看相應的部分,所以有時間可以好好看下,不然就需要哪一部分看哪一部分,有助于學習即可。
最后? 大數據開發也是需要編程基礎的,并不是學會使用這些框架怎么樣就可以了,所以對于編程語言,數據結構與算法,計算機網絡這些基礎也是要的,這些基礎知識也有助于自己以后的發展,如果是應屆生校招的話,面試基本上都是JavaSE和數據結構與算法等的知識點,還有大數據組件相關的知識點,以及對項目的理解,這些都是要自己面試前準備好的,多看面經,多找面試題看,面幾次,心里有譜了,后續面試就好了。? 不管是從事什么樣的計算機相關的崗位,編程都是很重要的,數據結構與算法特別重要,還有就是leetcode等編程網站刷題,提升自己的編程思維,后續筆試面試都要要的。? 要將一行行代碼看做一疊疊rmb,但是一行行代碼能不能轉換成一疊疊rmb,自己就一定要:堅持,多敲代碼;多敲代碼,堅持;堅持。?