前言
又是一年乍暖還寒,春天的風迎面而來,涼意中夾雜着些許溫暖。哦,你知道,是春天來了。就像那年的實習期,在揮手告別的畢業季,定格在了那年的七月。
人會懷念,懷念青澀時期的自己,懵懵懂懂卻又充滿着努力。人會想念,想念每天朝夕相處的人,有一天會在轉角揮手告別。人會改變,改變了不善言辭的自己,終游盪於人情世故之中。
畢業近三年,從業大數據已近四年,順着大數據的浪潮,在一個不大不小的城市有了立足之地。每逢佳節,親朋好友談及工作,皆以開發手機APP答之,避免出現半天解釋不清的情況。后來在很多地方也遇到詢問大數據的問題,所以趁着空閑之余記錄一下這些年的大數據時光。
概念
什么是大數據
我理解的大數據就是利用一些技術手段來處理海量數據並實現其價值。首先是海量數據,如果沒有數據支撐,大數據就只是空談。其次是技術手段,用來離線或者實時處理數據,其中的Hadoop你一定有所耳聞。目前,大數據應用比較廣泛的行業有:電商、運營商、金融、醫療等。
為什么需要大數據
這里就拿電商舉例。是否你曾經思考過,為什么每次你瀏覽過的商品,就會出現在首頁推薦或者其他APP的廣告中。其實這就是大數據的應用之一。
你在APP上瀏覽商品,后台會收集你的商品瀏覽數據,其中包括用戶賬號、商品類別等字段。此刻,如果你是技術人員,你會如何將瀏覽數據存放起來?在傳統開發思維中很多人會選擇:MySQL。
但是一天幾百、幾千億的商品瀏覽數據,主機需要多大的磁盤才能完成數據留存?MySQL能處理這么多數據嗎?如何實時高效分析出用戶的瀏覽偏好?這需要開發者思考技術選型。
而大數據的出現,就解決了這些問題。
大數據難學么
紙上得來終覺淺,絕知此事要躬行。大數據其實是不難學的,只是要求技術層面比較廣,涉及編程、網絡、主機等方面知識,需要多方面知識的沉淀。大數據的深入學習需要在理論的基礎上加以實踐。在學習技術框架的時候,最好動手在阿里雲或者虛擬機上搭建集群,一方面可以提高Linux的使用能力和了解集群的運行原理,另一方面可以在集群上進行操作練習。
其次,大數據技術在生產和測試環境中其實是不一樣的。生產環境會有實際的業務場景和各種各樣的問題,所以有機會接觸到大數據生產環境的話,學習效率會事半功倍。
主要技術
大數據中,不同的業務場景對應着不用的技術選型,大數據技術運用方向主要是離線計算和實時計算。在此之前,我們先了解一下Hadoop。
Hadoop
大部分人都知道Hadoop,Hadoop作為最基本大數據框架,占據着核心的位置。Apache Hadoop是社區開源版本,而生產中使用最多的,還是基於Apache的第三方發行版的Hadoop,例如HDP和CDH,這兩家是免費的,目前我們使用的是HDP。當然也有收費,例如華為、Intel。
那么,Hadoop發揮着什么樣的作用?
在傳統思維中,程序的運行只占用運行程序主機的計算資源,例如CPU和內存;文件只占用所在主機的磁盤存儲。而Hadoop可以利用多台機器組成集群,從而提供分布式計算和分布式存儲的能力。
HDFS(Hadoop Distributed File System)
HDFS由主節點NameNode和從節點DataNode組成。在大數據中,主從結構是最常見的架構。
NameNode負責管理整個文件系統的元數據,例如某個文件存放在哪台機器上。當NameNode故障無法工作,則HDFS就變得不可用。目前解決方法的就是HA高可用,即集群中有兩個NameNode,平時一個處於Active狀態,一個處於StandBy狀態。當處於Active的NameNode無法工作時,StandBy的NameNode會變成Active狀態並接管工作。
DataNode負責數據文件的存儲,每個文件根據預先設置的副本數被存儲在不同的機器上。假如你設置的副本數為3,那么一個文件將會額外被復制三份,生成三個副本。根據機架感知策略,存放在不同的節點上。
- 副本1放在和Client相同機架的節點上(Client不在集群內則選擇最近的節點)
- 副本2放在與第一個機架不同的機架中的任意節點上
- 副本3放在與第二個節點所在機架的不同的節點
這樣,當一個節點故障導致文件損壞,也可以通過其他節點的文件副本保證正常使用,這就是數據容災策略,通過犧牲空間、數據冗余來保證數據的可用性,類似於raid。同時,Kafka也是通過副本來保證數據可用性。
MapReduce
MapReduce是一個分布式計算模型,將任務的執行分為Map和Reduce兩個階段,每個階段都拆分成多個任務來並發執行,類似於算法中的分治思想。

如圖,分治思想是將任務拆分成多個子任務同時計算,以此得出最終結果。MapReduce也是將任務拆分,分發到Hadoop的各個節點上進行計算,這樣就可以利用多個主機的計算資源。至於MapReduce底層的實現細節,有興趣的話可以研究一下。
離線計算
離線數據通常是指已經持久化到磁盤的數據,例如存儲於文件、數據庫。我把離線計算理解成有邊界計算,因為文件、數據庫中的數據是已知的、通常不會改變。狹義上也可以理解為數據庫SQL計算,利用大數據技術在海量離線數據中進行分析,用於營銷決策或者報表展示等。
技術架構
離線計算一般使用的是Hive。Hive作為數據倉庫工具,其數據文件存放於HDFS之上,通過HiveSQL對數據文件進行增刪改查操作。雖然Hive提供着數據庫的操作方式,但HiveSQL會被Hive的執行引擎解析成MapReduce任務,分發在Hadoop節點上執行,所以Hive本身並不是一個數據庫,底層計算還是依賴於MapReduce。
經常使用的技術還有SparkSQL、Kylin、Hbase、Druid等。
應用舉例
電商舉例,分析出一個月內成交量最多的商品Top100,制作可視化報表。
實時計算
與離線計算對應的就是實時計算,可以理解為無邊界流式計算。數據就像河水一樣,源源不斷的進入程序中。而程序也會一直運行,直到出現異常或者被人工停止。
技術架構
目前企業使用最多的實時計算框架的就是Flink和SparkStreaming,並配合Kafka作為消息隊列來構建實時計算。這里簡單模擬一下流處理:

如圖,采集程序作為生產者,實時生成數據寫入Kafka;Flink程序作為消費者,實時讀取Kafka中的數據源來進行計算處理,最終將計算結果寫入Kafka或者HDFS中。
日常中比較常用的流處理技術還有Storm、RabbitMQ等,而Redis通常作為緩存為流式計算提供服務。
應用舉例
電商舉例,找出目前正在瀏覽某書籍的用戶,推送書籍優惠券。
崗位划分
很多人想從事大數據行業,問的最多的就是大數據有哪些崗位?大數據的崗位主要分為三種:大數據分析、大數據開發、大數據運維。當然往細了說,還有平台架構師,主要負責集群搭建等工作,這暫且不談。
我在實習的時候,做過一個月的大數據分析和半年的大數據運維工作,畢業之后就開始負責大數據開發的工作。一圈體驗下來,對每個崗位也有了一些自己的心得體會。
大數據分析
大數據分析主要面向於離線計算。負責數據分析、報表統計等工作,重於數據價值的體現;數據的ETL調度,即E抽取、T轉換、L加載,着重於離線數據的流轉。雖然工作形式比較單一,但日常需求比較多,尤其是節假日的數據分析工作對時間要求也是極為緊迫。
在知乎上有人問,為什么大數據行業,大部分崗位都是做離線數倉的工作,寫HiveSQL的?
我在大數據實習的第一份工作就是大數據分析,目前很多實習生來了也都是安排數據分析工作。因為這一塊工作偏向於業務,對技術水平要求不是很嚴格,入手比較簡單。大部分的工作都是數據庫SQL開發,經過指導很快就能開始工作。
其次,離線數據量大,數據的清洗、分層匯聚、准確性驗證都是很需要人力和時間的。同時,業務需求量多,離線數據需要通過統計、同比、環比等分析手段,高效地支撐客戶的營銷決策以及對外變現,能快速為公司創造效益。所以,公司的業務結構和運營體系決定了需要大量的大數據分析崗位。
技術棧
-
編程語言:會則錦上添花,不會也可工作,但是建議學一點Python、Java。
-
大數據技術:Hadoop、HDFS、Hive、Hbase、ETL調度等。
-
其他:Shell、Linux操作、SQL。
大數據開發
大數據開發主要面向於實時計算。主要使用Java、Scala完成Flink、Spark的應用開發。相對於大數據分析來說,工作范圍比較廣,技術要求比較高,同時工作形式也比較靈活,可以通過不同的技術選型來制定多種解決方案,而且工作也沒有那么繁雜。
一般公司大數據開發崗位比較少,大數據處理引擎和大數據平台產品開發除外。在我們十幾個人大數據團隊中,大部分都是大數據分析崗位,大數據開發就我自己形單影只。
目前,我的主要工作內容:
-
數據的接入:將數據量1萬億/天的二進制數據根據規范解析成明文,放於Kafka。主要是對Java多線程、JVM、NIO的應用。
-
流處理開發:Flink、Spark、IBMStreams應用開發。開發語言:Scala、SPL。
-
數據留存:將1萬億/天、300T大小的數據存放於HDFS,並加載到Hive。技術選型:Flume。
-
爬蟲開發:結合營銷場景采集數據,百萬級數據量/天。技術選型:Scrapy。
所以,大數據開發主要是編程開發。和傳統的Java開發的區別就是,Java開發面向於項目工程,模塊結構比較龐大復雜,需要多人協同完成;大數據開發面向於單個應用場景的解決方案,通常就是幾百行代碼,通常一人即可完成。
技術棧
-
編程語言:主要語言是Java、Scala,需要有很強的編程能力。
-
大數據技術:主要是Flink、Spark、Kafka、Redis、Hadoop、HDFS、Yarn。
-
其他:Shell、Linux。
大數據運維
大數據運維主要是監控大數據平台、應用程序的健康狀態,需要對緊急情況及時做出反應。大數據運維的工作比較辛苦,經常需要熬夜值班。要求運維工作者需要對集群、主機有一定的了解,同時也具有日志分析、問題跟蹤解決的能力。
我負責大數據運維工作的時候,基本上電腦不離身,不是坐在電腦前就是背着電腦走在路上,除此之外,還要時常接受告警短信的轟炸。
技術棧
大數據平台使用、Linux操作、主機、網絡、調度等。
以上就是我個人對大數據各個崗位的實踐理解,同時也是對從事大數據需要不需要學習Java這個問題做出了回答。
我和大數據
17年的那個夏天,經歷一番波折之后,開始了大數據的實習生活。剛開始主要做一些HiveSQL的數據校驗工作,也會被安排一些寫文檔的工作。那時候心中依舊懷揣Java開發的理想,每天下班在出租屋里和大學舍友一起學着沒學完的Java課程,在公司里跟着大數據視頻搭建集群,在公交車上每天看大數據的文章。
那時候的臉皮是真的薄,上班的時候習慣把頭趴到在電腦屏幕之下,遇到問題也不好意思去問,都是攢一起,等到同事過來詢問進度的時候一股腦兒的全問完。工作的重復以及與Java開發理想的漸行漸遠,讓我經常在夜深人靜會想:這是我想要的工作嗎?
兩個月后,運維小哥離職,我搖身一變,成為了一名大數據運維,從此過上了人機合一的生活。因為需要監控一些應用,我寫下了人生中的第一個Shell腳本。后來因為會Java,也以運維的身份參與了一些開發工作,同時也自學Spark、Kafka等大數據開發技術。在后來幾個月的加班中,趁機深入了解了平台架構,也理清了數據在整個大數據平台的流轉過程,從此豁然開朗。
那時候真的辛苦,但也是真的快樂充實,那段時光讓我離大數據開發的崗位越來越近。那時候的我有着用不完的精力、對知識充滿着渴望,對工作充滿着熱情。長時間的相處下來,內心的懵懂與緊張也隨之淡去,在某天的不經意間融入到了大數據這個集體中。
后來,經歷了轉正,經歷了分別,經歷了一個人的成長,再后來成為了一名大數據開發。
機會伴隨着努力,讓我在每個崗位,都有着一段記憶深刻的經歷。如果沒有機會一次次出現,能力可能無處施展;如果沒有技術能力的支持,機會來了也抓不住。選擇了一條路,就要努力走下去。
三年匆匆,亦未能洗盡鉛華。但是三年前,當那個少年第一次緊張低聲地說出:“我可以,我能做好運維工作”的時候,可能未料到今天他可以自信的說出:"我可以,我能做好開發工作"。
人要忠於自己年輕時的夢想。
結語
希望看完這篇文章,能讓你大數據有一些深入的了解。希望有一天別人談及大數據的時候,你也能胸有成竹、侃侃而談。亦或能讓你有一些感悟,哦,原來大數據是這樣。我心足矣。
時間更迭、技術換代,大數據的熱潮已然退去,人工智能、機器學習已占盡流量話題。但大數據依然還是大數據,我也依舊,還是那個懷揣夢想努力着的少年。
往期系列文章
我的程序員之路02:大數據實習篇
我的程序員之路01:自學Java篇
寫的都是日常工作中的親身實踐,處於自己的角度從0寫到1,保證能夠真正讓大家看懂。
文章會在公眾號 [入門到放棄之路] 首發,期待你的關注。

