大家好,我是梁唐。
最近我發現,很多萌新說著想要做算法工程師,但是卻對這個崗位的要求以及工作內容一無所知。以為學一個Python,再學一些機器學習、深度學習的模型就可以勝任了。工作就是用Python不停地寫模型。
顯然,這樣的想法是有問題的,如果真這麼幹,即使通過了面試成功入職,也會幹得非常痛苦。因為你會發現這也不知道那也不知道,做啥都很吃力,需要一段很長的時間學習。而這種為了應付工作臨時抱佛腳的學習往往很難深入,有種不停打補丁的感覺。
今天就和大家聊聊算法工程師的幾項基本功,看看除了算法和模型之外,還需要學些什麼。
hadoop首先當然是hadoop,不過hadoop不是一門技術,而是一個大數據框架。它的logo是一隻黃色的小象,據說是這個項目的創建者用女兒的玩具命名的。
經過了很多年的發展,現在hadoop框架已經非常成熟,衍生出了一個龐大的家族。有多龐大呢,我在google裡給大家找了一張圖,大家可以看看感受一下,這裡面有多少是自己知道的,有多少沒聽說過。
當然對於算法工程師來說,hadoop家族並不需要全部了解,只需要著重關注幾個就可以了。
hdfs首先是hdfs,hdfs是hadoop框架中的分布式文件系統。因為在工業場景當中,數據量是非常龐大的,動輒TB甚至是PB量級。如此龐大的數據,顯然不可能存在一塊磁碟裡,必須要分布式存儲,分成不同的部分,不同的部分分開存儲。通過hdfs我們可以很方便地實現這一點,可以使用一些簡單的shell命令管理大規模的數據。
hdfs的內部是分片(block)存儲的,並且設計了嚴謹的容錯機制,儘可能地保證了數據的準確性。一般我們用hdfs存儲一些離線數據,也就是對延遲要求不高的數據,比如模型的訓練數據。它的特點是存儲能力很強,但是讀取速度很慢,中間的延遲很長。
因為訓練數據的規模往往也非常龐大,並且從用戶線上的實時行為轉化成模型需要的輸入,中間需要大量的計算步驟。這會帶來巨大的計算壓力,因此對於這樣的數據,我們往往都是藉助於hdfs做離線處理。設計一套數據處理流程,進行若干步驟的處理,每一步處理的中間數據都存儲在hdfs上。
模型訓練的時候,也通過掛載hdfs的方式直接讀取tensor進行訓練。
MapReducehdfs是hadoop的存儲系統,hadoop同樣也推出過一套計算系統,就是MapReduce。
我在之前的文章曾經介紹過MapReduce的原理,其實非常簡單,它將數據的計算過程抽象成了兩個步驟。一個步驟叫map,一個步驟叫reduce。
map步驟做的數據的映射,比如我們從一個很大的json文件當中讀取出我們想要的欄位,在這個步驟當中,我們從json獲得了幾個欄位。
reduce步驟做的是匯總,我們把剛剛map階段得到的結果,按照我們的想法匯聚在一起,比如計算平均數、中位數等等。
這個想法巧妙的地方在於map和reduce都是可以分布式進行的,比如map階段,我們可以對hdfs裡的每一個文件都設置一個map讀取文件進行處理。map階段結束之後,我們也可以起多個reducer對map的結果進行加工,儘可能導致了整個過程都是並發進行的,也就保證了數據的處理速度。
雖然MapReduce的提出到現在已經十多年了,但仍然沒有淘汰,還在很多場景當中廣泛使用。
hivehive也是hadoop家族核心的一員,它的思想也很巧妙,做了一件非常有利於程式設計師的事情。
使用hdfs以及MapReduce其實就足夠應付幾乎所有大數據計算的場景了,但是足夠應付並不代表應付起來很舒服。有些場景使用起來就不是很順手,比如說我們要把兩份數據關聯在一起,一份是用戶點擊數據,一份是商品數據,我們想要得到用戶點過的商品信息。
你會發現使用MapReduce去做這樣一件事情會非常蛋疼,要寫很多代碼。所以有人突發奇想,我們能不能利用hdfs以及MapReduce做一套好用一點的數據處理系統,比如說將數據全部格式化,然後像是資料庫一樣使用SQL來進行數據的查詢和處理?於是就有了hive。
hive底層的運算框架就是MapReduce,只不過有了表結構之後,很多之前很複雜的操作被大大簡化了。尤其是數據表之間的join、group by等操作,之前需要寫大量MapReduce的代碼,現在幾行SQL就搞定了。
不過hive畢竟不是資料庫,它的使用還是有一些它自己專屬的奇淫技巧。比如說避免數據傾斜的情況,比如說設置合理的內存分片,比如說udf的使用等等。
只是懂SQL的語法是寫不好hive的,多少還需要做一些深入的了解。
spark說到spark相信很多同學也是久仰大名,它是一個非常著名的開源集群計算框架,也可以理解成一個分布式計算框架。
spark在MapReduce的基礎上對MapReduce當中的一些問題進行了優化,比如MapReduce每次運算結束之後都會把數據存儲在磁碟上,這會帶來巨大的IO開銷。
而spark使用了存儲器內運算技術,可以儘量減少磁碟的寫入。這其中的技術細節看不懂沒有關係,我們只需要知道它的運算性能比MapReduce快很多就可以了,一般來說運算速度是MapReduce的十倍以上。並且spark原生支持hdfs,所以大部分公司都是使用hdfs做數據存儲,spark來進行數據運算。
在hadoop推出了hive之後,spark也推出了自己的spark SQL。不過後來hive也支持使用spark作為計算引擎代替MapReduce了,這兩者的性能上差異也就很小了,我個人還是更喜歡hive一點,畢竟寫起來方便。
另外spark除了計算框架之外,當中也兼容了一些機器學習的庫,比如MLlib,不過我沒有用過,畢竟現在機器學習的時代都快結束了。很少再有使用場景了,大家感興趣也可以了解一下。
總結最後做一個簡單的總結,總體上來說想要成為一名合格的算法工程師,hadoop、MapReduce、hive這些或多或少都需要有所了解。不說能夠精通到原理級,但至少需要會用,大概知道裡面怎麼回事。
這也是工業界和實驗室裡的最大區別,畢竟學校裡的實驗數據量也不會很大,直接放在內存裡就完事了。所以數據處理一般都是numpy + pandas什麼的,但是在公司裡,幾乎沒有pandas的用武之地,畢竟數據量太大了,不可能都放內存裡,必須要藉助大數據計算平臺來解決。
好了,就說這麼多吧,感謝大家的閱讀。