今年秋招
以前,我曾覺得我之後會是一名Java開發
,可是在真正的秋招過程當中,我出軌了大數據
(呵呵,男人!),既然將它做爲第一份職業,那就要好好來了解下它,要對現有的大數據的生態有個直觀的理解,因此在此基礎上列出本身的學習計劃和本身的職業規劃。在這裏,要特別感謝韓順平老師B站2020大數據公開課,受益不淺,視頻連接在參考文獻中,感興趣的小夥伴能夠看看。程序員
這篇文章是我在查閱了大量的資料後進行的總結,以自身小白的角度講述,若有不正確的地方,還望讀者不吝提出。web
做爲一名Java Developer,
曾經我覺得,BS架構就是我在瀏覽器中向服務器提交一個資源申請,而後服務器返回相應的資源就行了,那這個結構就好簡單,就是下面這樣的。算法
慢慢的,當服務器壓力過大,咱們就會考慮到擴容,設置主從服務等操做,這時的架構就變這樣了數據庫
哎,我關心的層面永遠是實現某個業務的邏輯
,至於數據,我理解的也僅僅是業務數據
,只要保證它們可以正常入庫,正常獲取便可,也就是咱們常說的增刪改查
;固然,除正常的業務數據外,還會有不少的日誌數據,能夠利用他們定位錯誤。apache
若是僅從這個層面上看待,我也許永遠不會理解馬爸爸口中所說的數據就是財富
,爲了擁抱財富,我窺探了下業務數據以外的數據,而後,沒忍住,我好像變心了~。瀏覽器
那麼,什麼是大數據呢?服務器
隨着科技的發展,咱們在網上留下的數據愈來愈多,大到網上購物、商品交易,小到瀏覽網頁、微信聊天、手機自動記錄平常行程等,能夠說,在現在的生活裏,只要你還在,你就會每時每刻產生數據,可是這些數據能稱爲大數據麼?不,這些還不能稱爲大數據,那麼大數據數據究竟是什麼呢?微信
個人我的理解是這樣的,大數據
能夠認爲是數據的集合
,咱們能夠從這些數據中推理出一個近似客觀的規律
,利用這個規律能夠預測產生數據的本體下一次要發生的機率
。如一個用戶常常在某電影網站上觀當作龍的電影,那麼當該用戶下一次訪問電影網站時,將有關成龍的電影放在推薦列表中比較靠前的位置,由於咱們經過用戶的瀏覽的數據發現他很喜歡成龍的電影,而且相信相信該用戶的興趣短時內不會發生變化。這時咱們就會有疑問,用戶的行爲數據存到哪裏了?怎樣使用這些數據判斷(計算)產生數據數據的本體下一次發生的機率。這就引出了大數據的最核心的兩個概念:存儲和計算markdown
咱們接着上面分析,想知道這些數據能夠具體作什麼,那麼咱們就從數據自己出發。試想一下,要想使用數據
,是否是要先採集數據
,採集的數據傳輸過程當中若是數據流量太大,還要考慮下對數據緩衝
,若是採集的數據不是那麼特別着急的須要(變現),咱們能夠考慮以離線的形式先存儲起來,若是數據放起來就沒有價值了啊,因此咱們仍是是要分析
、計算
、挖掘
數據裏面的價值,可是數據的最終價值是要變現啊,money! money! money! ,怎麼變現?固然是提供給業務方
嘍,那麼誰是業務代碼的編寫者,好像是曾經的我,Java Developer。網絡
MMP
,搞了半天,這是閉環啊,又回到了老本行,有點懵?別慌,來張圖
這張圖簡要分析了數據的實時/離線
處理過程,乍一看這個流程,這有啥難的,不就是五個流程麼,
數據源能夠是多種多樣的,按照結構劃分能夠分爲三類:
- 非結構化數據:圖片視頻
- 半結構化數據:日誌數據
- 結構化數據:關係數據
數據採集經常使用的是Flume
,可是考慮數據流量過大,咱們一般使用Kafka作緩衝。
數據採集確定是一端進數據
,一端出數據
,找了官方的一張圖,結構以下:
Source端
是數據的入口,Sink端
是數據的出口。中間的Channel是進行數據的清理的管道。
上面分析中咱們提到過,當數據量過大的時候,咱們一般會對數據進行緩衝,保證數據的進出適配
。咱們可使用Kafka這個組件,Kafka是一個很是優秀的數據隊列與緩衝組件。
既然是大數據,那確定不是一臺服務器可以解決的,確定是分佈式存儲HDFS,在大數據剛出來,就有人不少人認爲大數據=hadoop,可見當時的hadoop的火熱程度,實時上,這是由於hadoop同時具有了數據的存儲與計算
。Hadoop的框架最核心的設計就是:HDFS
和MapReduce
。HDFS爲海量的數據提供了存儲,而MapReduce則爲海量的數據提供了計算。
除了Hadoop自身的計算組件,有一款專門進行數據內存計算的組件--Spark,它能夠同時提供離線計算
和在線計算
。
數據的應用就比較普遍了,咱們能夠把處理好的數據放入MySQL,使用Java EE
那套技術根據業務的須要具體操做便可;舉一個簡單的例子,咱們能夠把處理好的數據可視化(Echarts、D3),這也算是發揮它的價值。
上面僅僅是粗略的介紹,並無詳細的介紹每一個步驟所對應的技術,要想學好大數據,本身必需要規劃一個清晰的學習路線
,堅持下去。下面,咱們就聊一聊如何學習大數據,這個路線適合任何階段的學習者。
大數據的技術路線仍是很是龐大的,在這裏,我要特別感謝尚硅谷韓順平老師提供的技術路線,基本上包含了:入門
-->進階
-->精通
-->成神
。
話很少說,先看下整體學習路線:
上面這張思惟導圖包含了咱們學習大數據路線所須要的所有知識,可能除了計算機基礎
、JAVA基礎
,對其它技術體系可能有一點點感到迷茫,不要慌下面咱們一一分析:
按照正常狀況下,若是你想當個普通的程序員,這部份內容其實不學也行,由於技術的天花板很低,當達到必定水平後,就會原地踏步,停滯不前。可是若是你想在這個領域有所建樹,發光發熱,就得好好學習這些基礎知識,這是爲啥呢?你想一想看,在這個文科可使用Python來進行數據分析的時代,不搞點技能怎麼傍身。固然,這是次要的,最主要的緣由是當咱們把某個領域學的必定階段的時候,這時你接觸的就會越接近於底層
,舉個例子:當你學習Java中的內存管理、線程、進程和鎖的知識點時,若是你不瞭解操做系統的知識,理解起來仍是挺難的。
下面,咱們介紹下具體學習那些基礎,這裏只列出書籍,每一個人根據本身的學習狀況具體學習便可
- 計算機網絡
- 操做系統
- 數據結構與算法
- 計算機組成原理
- 離散數學及其應用
- 編譯原理
學習大數據是必需要學JAVA的,爲何這麼說呢?學習大數據,咱們或多或少都據說過Hadoop
,不少同窗甚至將Hadoop和大數據畫了等號,可見Hadoop是必需要學的,並且咱們知道Hadoop和其餘大數據處理技術不少的部分都是由Java語言來實現的,因此在學習Hadoop的一個前提條件,就是掌握Java語言
。
那麼,咱們應該學習Java的那些內容呢,別單擔憂,貼心的Simon郎
爲你畫了張思惟導圖。
做爲一個大數據工程師,理論上講,JAVA EE的技術不是必須的
,爲何說呢,你想啊,JAVA EE開發是Java語言中的一個應用領域
,好比開發WEB程序;大數據開發也是Java語言中的一個應用領域,好比開發海量數據處理程序。二者就比如是學習了中文,一個用於寫段子,一個英語寫詩,二者沒太大關係啊,都要依賴語言(Java)。
可是問題來了,既然二者都是Java語言的應用,那麼爲何大數據路線中還要學習JAVA EE呢,個人理由很簡單,大數據處理的數據是供給具體的業務使用的,若是你一點都不懂,說的過去麼?再說了,JAVA EE中有不少框架的思想都是挺值得借鑑的,因此,我以爲,學習大數據路線上適當的學習JAVA EE,會有着不錯的效果,至於具體學習到什麼程度,本身能夠把握。
學習大數據確定繞不開Hadoop
,可見Hadoop的地位是多麼重要,可是對於接觸大數據時間較短或者還沒有接觸過大數據的同窗來講,若是問他們咱們應該學習Hadoop的那些內容,分佈式存儲
和計算
必定會說出來,可是僅僅這兩個概念仍是太籠統了,那麼咱們應該怎樣把控Hadoop的學習呢,莫慌,且聽Simon郎
慢慢道來。
話很少說,先看一張Hadoop生態體系
的腦圖。
媽耶,咋那麼多內容啊,快把我幹懵逼了。千萬別懵,雖然看起來不少,可是能夠用一句總結:Hadoop是一個分佈式計算開源框架
,提供了一個分佈式系統
子項目(HDFS)和支持MapReduce分佈式計算軟件架構
。既然腦圖的內容有點多,我們就介紹幾個在Hadoop家組中佔有地位較高的幾個組件,若是小夥伴對其它組件感興趣,能夠自行查閱。
Hive是基於Hadoop的一個數據倉庫工具,能夠將結構化的數據文件映射爲一張數據庫表,經過類SQL語句快速實現簡單的MapReduce統計,沒必要開發專門的MapReduce應用,十分適合數據倉庫的統計分析。
Hbase是一個高可靠性、高性能、面向列、可伸縮的分佈式存儲系統,利用Hbase技術可在廉價PC Server上搭建起大規模結構化存儲集羣。
Sqoop是一個用來將Hadoop和關係型數據庫中的數據相互轉移的工具,能夠將一個關係型數據庫(MySQL ,Oracle ,Postgres等)中的數據導進到Hadoop的HDFS中,也能夠將HDFS的數據導進到關係型數據庫中
Zookeeper 是一個爲分佈式應用所設計的分佈的、開源的協調服務,它主要是用來解決分佈式應用中常常遇到的一些數據管理問題,簡化分佈式應用協調及其管理的難度,提供高性能的分佈式服務。
Ambari是一種基於Web的工具,支持Hadoop集羣的供應、管理和監控。
Oozie是一個工做流引擎服務器, 用於管理和協調運行在Hadoop平臺上(HDFS、Pig和MapReduce)的任務。
Hue是一個基於WEB的監控和管理系統,實現對HDFS,MapReduce/YARN, HBase, Hive, Pig的web化操做和管理。
.........
Hadoop生態體系先介紹這麼多,對其它內容感興趣的同窗自行補充
學習完Hadoop後,稍做調整後,就能夠學習Spark了,這時,可能就有同窗會問,Spark和Hadoop有啥區別呢?咱們爲何還要學Spark呢?要學習Spark那些內容呢?
別慌,咱麼一一解決
1. Spark和Hadoop有什麼區別?
簡單理解,Spark是在Hadoop基礎上的改進
,是UC Berkeley AMP lab所開源的類Hadoop MapReduce的通用的並行計算框架
,Spark基於map reduce算法實現的分佈式計算,擁有Hadoop MapReduce所具備的優勢;但不一樣於MapReduce的是中間輸出和結果能夠保存在內存中
,從而再也不須要讀寫HDFS,所以Spark能更好地適用於數據挖掘與機器學習等須要迭代的map reduce的算法。
2.爲何要學Spark
基於MapReduce的計算引擎一般會將中間結果輸出到磁盤上,進行存儲和容錯。出於任務管道承接的考慮,當一些查詢翻譯到MapReduce任務時,每每會產生多個Stage,而這些串聯的Stage又依賴於底層文件系統(如HDFS)來存儲每個Stage的輸出結果。
Spark是MapReduce的替代方案,並且兼容HDFS、Hive,可融入Hadoop的生態系統,以彌補MapReduce的不足。
要學習Spark的那些內容呢?
首先要學的就是Scala
,由於Spark就是Scala寫的,因此要好好學,這對於咱們分析源碼很是有幫助。這時你又有疑問,不是已經學了Java了麼,怎麼還學Scala,你個騙子!
別罵我,可是Scala是基於Java寫的,難道學習Java還忽悠你了不成!
其次要學的就是Spark的基礎知識,先把地基打牢,才能更上一層樓麼。學完Spark後,就能夠着手學習較有挑戰性的SparkCore
、SparkSQL
、SparkStreaming
、MLib
SparkCore將分佈式數據抽象爲彈性分佈式數據集(RDD),實現了應用任務調度、RPC、序列化和壓縮,併爲運行在其上的上層組件提供API。
SparkSQL 是Spark來操做結構化數據的程序包,可讓我使用SQL語句的方式來查詢數據,Spark支持 多種數據源,包含Hive表,parquest以及JSON等內容。
SparkStreaming是Spark提供的實時數據進行流式計算的組件。
MLlib提供經常使用機器學習算法的實現庫。
立刻2021年了,若是學習大數據還不知道flink就有點過度了,如今各個大廠都在嘗試着使用flink,那麼flink到底是什麼
呢?
先看看官方的定義
:flink是一個框架和分佈式的處理引擎
,用於對無界和有界數據流進行有狀態的計算
。
定義明確了flink的做用是計算
,想想,咱們在上面已經介紹了Hadoop中的MapReduce和Spark均可以用於計算,怎麼還要學,它的優點是什麼呢?
其實蠻難的理解的,我查了不少的資料,我發現雲棲社區的蔣曉偉老師的說的就挺明白,問題和回答的原話以下:
蔣曉偉:首先咱們但願有個流計算和批處理的一體化處理方案。Spark和Flink都具備流和批處理能力,可是他們的作法是相反的。**Spark Streaming是把流轉化成一個個小的批來處理,這種方案的一個問題是咱們須要的延遲越低,額外開銷佔的比例就會越大,這致使了Spark Streaming很難作到秒級甚至亞秒級的延遲。Flink是把批看成一種有限的流,這種作法的一個特色是在流和批共享大部分代碼的同時還可以保留批處理特有的一系列的優化。**由於這個緣由,若是要用一套引擎來解決流和批處理,那就必須以流處理爲基礎,因此咱們決定先選擇一個優秀的流處理引擎。從功能上流處理能夠分爲無狀態的和有狀態兩種。在流處理的框架裏引入狀態管理大大提高了系統的表達能力,讓用戶可以很方便地實現複雜的處理邏輯,是流處理在功能上的一個飛躍。流處理引擎對一致性的支持能夠分爲:best effort,at least once 和 exactly once。Exactly once的語義才能真正保證徹底的一致性,Flink採用的架構比較優雅地實現了exactly once的有狀態流處理。另外在保證了一致性的前提下Flink在性能上也是至關優秀的。總結一下,咱們以爲在流處理方面Flink在功能,延遲,一致性和性能上綜合來看是目前社區最優秀的。因此咱們決定採用它來實現流和批的一體化方案。最後,還有一個很重要的緣由是Flink有一個比較活躍的社區。
蔣曉偉:大數據是從批處理開始的,因此不少系統都是從批處理作起,包括Spark。在批處理上Spark有着較深的積累,是一個比較優秀的系統。隨着技術的發展,不少原來只有批處理的業務都有了實時的需求,流處理將會變得愈來愈重要,甚至成爲大數據處理的主要場景。**Flink把批看成流來處理有個很重要的優勢是若是咱們在流中引入一個blocking的算子,咱們還能接着作批處理特有的優化,這個是以流處理爲基礎的計算引擎的一大優點。**因此我認爲在架構上這種設計在批處理上是能夠作到最優的,並且比傳統的作法還有一些特別的優點,固然工程上的實現也很重要。
看了上面兩個問答,你們應該對爲何使用flink有個比較宏觀的瞭解,那咱們具體學習什麼呢,我以爲啊,學它的不一樣點就好啊
技術的學習是創建在職業規劃上的,那麼做爲還未入門的大數據從業者,應該怎麼規劃本身呢?
據我瞭解,目前市面存在的大數據的崗位有如下幾種:
由於市面上的崗位需求以大數據工程師
居多,在這裏,我會着重介紹大數據工程師的職業規劃,對其餘崗位剛興趣的能夠自行查閱相關資料。
大數據工程師具體的工做內容取決於你在工做數據流中的那個環節,數據流的工做內容大體能夠分爲:數據採集
--->數據清洗
--->數據存儲
--->數據分析和統計
--->數據但是化
正常狀況下,大數據工程師按照不一樣的工具是要分類,如Hadoop工程師
,Spark工程師
,Flink工程師
,具體的使用工具取決於所在的部門,可是若是想要成爲一名優秀的大數據工程師,這些工具都是須要掌握的。
人們常說,程序員到了35歲,就要轉行送外賣
、開滴滴
了,雖然這是一句調侃,可是人到中年,危機意識仍是要有的,搞很差部門下次優化的就是你。
就像文中開頭所說,解決焦慮的最好辦法就是面對焦慮
,既然知道有35歲危機,那麼應該早早準備好本身的職業規劃,並堅決不移的堅持下去。從大數據工程師的角度看,若是你一直從事大數據這個行業,有兩大方向供你選擇
大數據工程師--->大數據算法工程師--->大數據項目經理--->大數據架構師--->資深架構師--->大數據科學家
大數據工程師--->大數據產品經理--->資深大數據產品經理--->合夥人
相信你們看完了上述內容後必定會對大數據有個宏觀的認識,細心的同窗也可能發現了大數據路線
中還缺乏兩個模塊,項目
和源碼
,怎麼說呢,我也有點發愁,因此我準備發完文章後好好去整理一下,既然整理了,那就所有搞完吧。
我會盡可能在下次發文的時候整理好學習大數據所需的資料,包括文檔
、視頻
、書籍
等。
好了,今天的文章就到這裏了,我是Simon郎
,一個Java開發,卻在秋招出軌大數據的應屆生,若是不嫌棄我,歡迎關注
、在看
和點贊
。
參考文獻