1. 程式人生 > >我的程式設計師之路03:我和大資料

我的程式設計師之路03:我和大資料

## 前言 又是一年乍暖還寒,春天的風迎面而來,涼意中夾雜著些許溫暖。哦,你知道,是春天來了。就像那年的實習期,在揮手告別的畢業季,定格在了那年的七月。 人會懷念,懷念青澀時期的自己,懵懵懂懂卻又充滿著努力。人會想念,想念每天朝夕相處的人,有一天會在轉角揮手告別。人會改變,改變了不善言辭的自己,終遊蕩於人情世故之中。 畢業近三年,從業大資料已近四年,順著大資料的浪潮,在一個不大不小的城市有了立足之地。每逢佳節,親朋好友談及工作,皆以開發手機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. 副本1放在和Client相同機架的節點上(Client不在叢集內則選擇最近的節點) 2. 副本2放在與第一個機架不同的機架中的任意節點上 3. 副本3放在與第二個節點所在機架的不同的節點 這樣,當一個節點故障導致檔案損壞,也可以通過其他節點的檔案副本保證正常使用,這就是資料容災策略,通過犧牲空間、資料冗餘來保證資料的可用性,類似於raid。同時,Kafka也是通過副本來保證資料可用性。 #### MapReduce MapReduce是一個分散式計算模型,將任務的執行分為Map和Reduce兩個階段,每個階段都拆分成多個任務來併發執行,類似於演算法中的分治思想。 ![分治思想](https://img-blog.csdnimg.cn/20210301174351575.jpg) 如圖,分治思想是將任務拆分成多個子任務同時計算,以此得出最終結果。MapReduce也是將任務拆分,分發到Hadoop的各個節點上進行計算,這樣就可以利用多個主機的計算資源。至於MapReduce底層的實現細節,有興趣的話可以研究一下。 ### 離線計算 離線資料通常是指已經持久化到磁碟的資料,例如儲存於檔案、資料庫。我把離線計算理解成有邊界計算,因為檔案、資料庫中的資料是已知的、通常不會改變。狹義上也可以理解為資料庫SQL計算,利用大資料技術在海量離線資料中進行分析,用於營銷決策或者報表展示等。 #### 技術架構 離線計算一般使用的是Hive。Hive作為資料倉庫工具,其資料檔案存放於HDFS之上,通過HiveSQL對資料檔案進行增刪改查操作。雖然Hive提供著資料庫的操作方式,但HiveSQL會被Hive的執行引擎解析成MapReduce任務,分發在Hadoop節點上執行,所以Hive本身並不是一個數據庫,底層計算還是依賴於MapReduce。 經常使用的技術還有SparkSQL、Kylin、Hbase、Druid等。 #### 應用舉例 電商舉例,分析出一個月內成交量最多的商品Top100,製作視覺化報表。 ### 實時計算 與離線計算對應的就是實時計算,可以理解為無邊界流式計算。資料就像河水一樣,源源不斷的進入程式中。而程式也會一直執行,直到出現異常或者被人工停止。 #### 技術架構 目前企業使用最多的實時計算框架的就是Flink和SparkStreaming,並配合Kafka作為訊息佇列來構建實時計算。這裡簡單模擬一下流處理: ![模擬流處理](https://img-blog.csdnimg.cn/20210228193656509.jpg) 如圖,採集程式作為生產者,實時生成資料寫入Kafka;Flink程式作為消費者,實時讀取Kafka中的資料來源來進行計算處理,最終將計算結果寫入Kafka或者HDFS中。 日常中比較常用的流處理技術還有Storm、RabbitMQ等,而Redis通常作為快取為流式計算提供服務。 #### 應用舉例 電商舉例,找出目前正在瀏覽某書籍的使用者,推送書籍優惠券。 ## 崗位劃分 很多人想從事大資料行業,問的最多的就是大資料有哪些崗位?大資料的崗位主要分為三種:大資料分析、大資料開發、大資料運維。當然往細了說,還有平臺架構師,主要負責叢集搭建等工作,這暫且不談。 我在實習的時候,做過一個月的大資料分析和半年的大資料運維工作,畢業之後就開始負責大資料開發的工作。一圈體驗下來,對每個崗位也有了一些自己的心得體會。 ### 大資料分析 大資料分析主要面向於離線計算。負責資料分析、報表統計等工作,重於資料價值的體現;資料的ETL排程,即E抽取、T轉換、L載入,著重於離線資料的流轉。雖然工作形式比較單一,但日常需求比較多,尤其是節假日的資料分析工作對時間要求也是極為緊迫。 在知乎上有人問,*為什麼大資料行業,大部分崗位都是做離線數倉的工作,寫HiveSQL的?* 我在大資料實習的第一份工作就是大資料分析,目前很多實習生來了也都是安排資料分析工作。因為這一塊工作偏向於業務,對技術水平要求不是很嚴格,入手比較簡單。大部分的工作都是資料庫SQL開發,經過指導很快就能開始工作。 其次,離線資料量大,資料的清洗、分層匯聚、準確性驗證都是很需要人力和時間的。同時,業務需求量多,離線資料需要通過統計、同比、環比等分析手段,高效地支撐客戶的營銷決策以及對外變現,能快速為公司創造效益。所以,公司的業務結構和運營體系決定了需要大量的大資料分析崗位。 #### 技術棧 1. 程式語言:會則錦上添花,不會也可工作,但是建議學一點Python、Java。 2. 大資料技術:Hadoop、HDFS、Hive、Hbase、ETL排程等。 3. 其他:Shell、Linux操作、SQL。 ### 大資料開發 大資料開發主要面向於實時計算。主要使用Java、Scala完成Flink、Spark的應用開發。相對於大資料分析來說,工作範圍比較廣,技術要求比較高,同時工作形式也比較靈活,可以通過不同的技術選型來制定多種解決方案,而且工作也沒有那麼繁雜。 一般公司大資料開發崗位比較少,大資料處理引擎和大資料平臺產品開發除外。在我們十幾個人大資料團隊中,大部分都是大資料分析崗位,大資料開發就我自己形單影隻。 目前,我的主要工作內容: 1. 資料的接入:將資料量1萬億/天的二進位制資料根據規範解析成明文,放於Kafka。主要是對Java多執行緒、JVM、NIO的應用。 2. 流處理開發:Flink、Spark、IBMStreams應用開發。開發語言:Scala、SPL。 3. 資料留存:將1萬億/天、300T大小的資料存放於HDFS,並載入到Hive。技術選型:Flume。 4. 爬蟲開發:結合營銷場景採集資料,百萬級資料量/天。技術選型:Scrapy。 所以,大資料開發主要是程式設計開發。和傳統的Java開發的區別就是,Java開發面向於專案工程,模組結構比較龐大複雜,需要多人協同完成;大資料開發面向於單個應用場景的解決方案,通常就是幾百行程式碼,通常一人即可完成。 #### 技術棧 1. 程式語言:主要語言是Java、Scala,需要有很強的程式設計能力。 2. 大資料技術:主要是Flink、Spark、Kafka、Redis、Hadoop、HDFS、Yarn。 3. 其他:Shell、Linux。 ### 大資料運維 大資料運維主要是監控大資料平臺、應用程式的健康狀態,需要對緊急情況及時做出反應。大資料運維的工作比較辛苦,經常需要熬夜值班。要求運維工作者需要對叢集、主機有一定的瞭解,同時也具有日誌分析、問題跟蹤解決的能力。 我負責大資料運維工作的時候,基本上電腦不離身,不是坐在電腦前就是揹著電腦走在路上,除此之外,還要時常接受告警簡訊的轟炸。 #### 技術棧 大資料平臺使用、Linux操作、主機、網路、排程等。 以上就是我個人對大資料各個崗位的實踐理解,同時也是對**從事大資料需要不需要學習Java**這個問題做出了回答。 ## 我和大資料 17年的那個夏天,經歷一番波折之後,開始了大資料的實習生活。剛開始主要做一些HiveSQL的資料校驗工作,也會被安排一些寫文件的工作。那時候心中依舊懷揣Java開發的理想,每天下班在出租屋裡和大學舍友一起學著沒學完的Java課程,在公司裡跟著大資料視訊搭建叢集,在公交車上每天看大資料的文章。 那時候的臉皮是真的薄,上班的時候習慣把頭趴到在電腦螢幕之下,遇到問題也不好意思去問,都是攢一起,等到同事過來詢問進度的時候一股腦兒的全問完。工作的重複以及與Java開發理想的漸行漸遠,讓我經常在夜深人靜會想:這是我想要的工作嗎? 兩個月後,運維小哥離職,我搖身一變,成為了一名大資料運維,從此過上了人機合一的生活。因為需要監控一些應用,我寫下了人生中的第一個Shell指令碼。後來因為會Java,也以運維的身份參與了一些開發工作,同時也自學Spark、Kafka等大資料開發技術。在後來幾個月的加班中,趁機深入瞭解了平臺架構,也理清了資料在整個大資料平臺的流轉過程,從此豁然開朗。 那時候真的辛苦,但也是真的快樂充實,那段時光讓我離大資料開發的崗位越來越近。那時候的我有著用不完的精力、對知識充滿著渴望,對工作充滿著熱情。長時間的相處下來,內心的懵懂與緊張也隨之淡去,在某天的不經意間融入到了大資料這個集體中。 後來,經歷了轉正,經歷了分別,經歷了一個人的成長,再後來成為了一名大資料開發。 **機會伴隨著努力**,讓我在每個崗位,都有著一段記憶深刻的經歷。如果沒有機會一次次出現,能力可能無處施展;如果沒有技術能力的支援,機會來了也抓不住。選擇了一條路,就要努力走下去。 *三年匆匆,亦未能洗盡鉛華*。但是三年前,當那個少年第一次緊張低聲地說出:“我可以,我能做好運維工作”的時候,可能未料到今天他可以自信的說出:"我可以,我能做好開發工作"。 > 人要忠於自己年輕時的夢想。 ## 結語 希望看完這篇文章,能讓你大資料有一些深入的瞭解。希望有一天別人談及大資料的時候,你也能胸有成竹、侃侃而談。亦或能讓你有一些感悟,哦,原來大資料是這樣。我心足矣。 時間更迭、技術換代,大資料的熱潮已然退去,人工智慧、機器學習已佔盡流量話題。但大資料依然還是大資料,我也依舊,還是那個懷揣夢想努力著的少年。 ### 往期系列文章 [我的程式設計師之路02:大資料實習篇](https://www.cnblogs.com/seven0007/p/internship.html) [我的程式設計師之路01:自學Java篇](https://www.cnblogs.com/seven0007/p/JavaLearn.html)
--- 寫的都是日常工作中的親身實踐,處於自己的角度從0寫到1,保證能夠真正讓大家看懂。 文章會在公眾號 [**入門到放棄之路**] 首發,期待你的關注。 ![公眾號](https://img-blog.csdnimg.cn/2020121714585