Hadoop、spark、hive到底是什麼,做算法要不要學?

2022-02-05 Coder梁

大家好,我是梁唐。

最近我發現,很多萌新說著想要做算法工程師,但是卻對這個崗位的要求以及工作內容一無所知。以為學一個Python,再學一些機器學習、深度學習的模型就可以勝任了。工作就是用Python不停地寫模型。

顯然,這樣的想法是有問題的,如果真這麼幹,即使通過了面試成功入職,也會幹得非常痛苦。因為你會發現這也不知道那也不知道,做啥都很吃力,需要一段很長的時間學習。而這種為了應付工作臨時抱佛腳的學習往往很難深入,有種不停打補丁的感覺。

今天就和大家聊聊算法工程師的幾項基本功,看看除了算法和模型之外,還需要學些什麼。

hadoop

首先當然是hadoop,不過hadoop不是一門技術,而是一個大數據框架。它的logo是一隻黃色的小象,據說是這個項目的創建者用女兒的玩具命名的。

經過了很多年的發展,現在hadoop框架已經非常成熟,衍生出了一個龐大的家族。有多龐大呢,我在google裡給大家找了一張圖,大家可以看看感受一下,這裡面有多少是自己知道的,有多少沒聽說過。

當然對於算法工程師來說,hadoop家族並不需要全部了解,只需要著重關注幾個就可以了。

hdfs

首先是hdfs,hdfs是hadoop框架中的分布式文件系統。因為在工業場景當中,數據量是非常龐大的,動輒TB甚至是PB量級。如此龐大的數據,顯然不可能存在一塊磁碟裡,必須要分布式存儲,分成不同的部分,不同的部分分開存儲。通過hdfs我們可以很方便地實現這一點,可以使用一些簡單的shell命令管理大規模的數據。

hdfs的內部是分片(block)存儲的,並且設計了嚴謹的容錯機制,儘可能地保證了數據的準確性。一般我們用hdfs存儲一些離線數據,也就是對延遲要求不高的數據,比如模型的訓練數據。它的特點是存儲能力很強,但是讀取速度很慢,中間的延遲很長。

因為訓練數據的規模往往也非常龐大,並且從用戶線上的實時行為轉化成模型需要的輸入,中間需要大量的計算步驟。這會帶來巨大的計算壓力,因此對於這樣的數據,我們往往都是藉助於hdfs做離線處理。設計一套數據處理流程,進行若干步驟的處理,每一步處理的中間數據都存儲在hdfs上。

模型訓練的時候,也通過掛載hdfs的方式直接讀取tensor進行訓練。

MapReduce

hdfs是hadoop的存儲系統,hadoop同樣也推出過一套計算系統,就是MapReduce。

我在之前的文章曾經介紹過MapReduce的原理,其實非常簡單,它將數據的計算過程抽象成了兩個步驟。一個步驟叫map,一個步驟叫reduce。

map步驟做的數據的映射,比如我們從一個很大的json文件當中讀取出我們想要的欄位,在這個步驟當中,我們從json獲得了幾個欄位。

reduce步驟做的是匯總,我們把剛剛map階段得到的結果,按照我們的想法匯聚在一起,比如計算平均數、中位數等等。

這個想法巧妙的地方在於map和reduce都是可以分布式進行的,比如map階段,我們可以對hdfs裡的每一個文件都設置一個map讀取文件進行處理。map階段結束之後,我們也可以起多個reducer對map的結果進行加工,儘可能導致了整個過程都是並發進行的,也就保證了數據的處理速度。

雖然MapReduce的提出到現在已經十多年了,但仍然沒有淘汰,還在很多場景當中廣泛使用。

hive

hive也是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的用武之地,畢竟數據量太大了,不可能都放內存裡,必須要藉助大數據計算平臺來解決。

好了,就說這麼多吧,感謝大家的閱讀。

相關焦點

  • 搞懂Hadoop、MapReduce、Hive、HBase、YARN及Spark的區別與聯繫
    hadoop呢?03那什麼是hive呢hive是基於Hadoop的一個數據倉庫工具,用來進行數據提取、轉化、加載,可以存儲、查詢和分析存儲在跑批語句,注意設置不要compress,否則ImportTsv工具無法識別。
  • Spark【面試】
    和spark的都是並行計算,那麼他們有什麼相同和區別兩者都是用mr模型來進行並行計算,hadoop的一個作業稱為job,job裡面分為map task和reduce task,每個task都是在自己的進程中運行的,當task結束時,進程也會結束spark用戶提交的任務成為application,一個application
  • Hadoop數據分析之Hive
    db_hive;-- 刪除為空的資料庫hive> drop database db_hive;-- 如果刪除的資料庫不存在,最好採用if exists 判斷資料庫是否存在hive> drop database if exists db_hive;-- hive> drop database if exists db_hive cascade;
  • 手把手教你在 Windows 平臺搭建本地 Hive 訪問環境
    spark-sql訪問已經被hive創建的表出現的問題簡介學習大數據最痛苦和費時間的就是入門時的環境搭建,對於大數據工程師而言,這個過程必不可少,但對於一些簡單的測試,每次都要打開自己搭建好的虛擬機,未免有些麻煩。對於數據分析師而言,一般只需要使用hive和spark就好,搭建集群實在是一件費力沒有效果的事。
  • 深入淺出Hive數據傾斜
    hive|spark|hive|hbase   hadoop|hive|spark|hive sqoop|flume|scala|scala具體步驟如下:1.1  MapReduce讀取HDFS中的文件並進行切割,將每一行解析成一個<k,v>(初始的k值是根據偏移量來的)。
  • 代碼 | Spark讀取mongoDB數據寫入Hive普通表和分區表
    2.11.8 hadoop-2.6.0-cdh5.7.0 jdk 1.8 MongoDB 3.6.4一 原始數據及Hive表 MongoDB數據格式{    "_id" : ObjectId("5af65d86222b639e0c2212f3
  • 問題排查 | Spark OrcFileFormat inferSchema執行巨慢問題分析
    (DataInputStream.java:195) at org.apache.hadoop.hive.ql.io.orc.ReaderImpl.extractMetaInfoFromFooter(ReaderImpl.java:369) at org.apache.hadoop.hive.ql.io.orc.ReaderImpl.
  • hadoop與數據挖掘的關係_區別_哪個好
    下面就以hadoop教學實戰項目為例,為hadoop做一個詳細的解析: 項目說明:hadoop_storm_spark結合實驗的例子,模擬雙11,根據訂單詳細信息,匯總出總銷售量 - 第二階段(離線報表) - (1)用戶訂單入oracle資料庫, - (2)通過sqoop把數據導入hadoop上。 - (3)使用mr和rdd對hadoop上的原始訂單做etl清洗 - (4)建立hive表和sparkSQL內存表。
  • 百度大數據三面題:shuffle過程+HBase+Spark優化+kmeans算法
    map-reduce程序運行的時候會有什麼比較常見的問題,你簡單描述一下hadoop的TextInputFormat作用是什麼,如何自定義實現?hadoop和spark的都是並行計算,那麼他們有什麼相同和區別呢?
  • 用Spark學習FP Tree算法和PrefixSpan算法
    utm_source=tuicool&utm_medium=referral在 FP Tree算法原理總結 和 PrefixSpan算法原理總結 中,我們對FP Tree和PrefixSpan這兩種關聯算法的原理做了總結,這裡就從實踐的角度介紹如何使用這兩個算法。
  • Spark-2.0.2源碼編譯
    Spark官網下載地址:http://spark.apache.org/downloads.html有兩種一種是編譯好的 一種是沒編譯的(需要自己編譯) 看自己的選擇>下載好的文件解壓之後可以看源碼直接用IDE工具打開就可以從官網下載需要的版本https://archive.apache.org/dist/spark/解壓文件編譯前的環境準備
  • Hive整合HBase完整筆記(親測)
    create table 建表語句聲明course.hbase_testcourse  所創建的Hive表名稱(cname string,score int) 所創建Hive表欄位STORED BY 'org.apache.hadoop.hive.hbase.
  • 第12章 大數據分析(R和Hadoop) 筆記
    -2.7.0/share/hadoop/tools/sources/hadoop-streaming-2.7.0-mapr-1808-test-sources.jar/opt/mapr/hive/hive-2.3/hcatalog/share/hcatalog/hive-hcatalog-streaming-2.3.3-mapr-1808.jar/opt/mapr/oozie/oozie
  • Hive(七) ----函數
    如果要對窗口的結果做更細粒度的劃分,使用window子句,有如下幾個選項:window.png-- 通過部門編號分區,然後計算在組內計算第一行到當前行的累積和select ename, sal,deptno, sum(sal) over(partition by deptno order by ename) salsum from emp;
  • Hadoop大數據面試題全版本
    hive默認的欄位分隔符為'\001'34.描述一下hadoop中,有哪些地方使用到了緩存機制,作用分別是什麼?現有 1 億個整數均勻分布,如果要得到前 1K 個最大的數,求最優的算法。in 也要慎用,否則會導致全表掃描5.避免使用模糊查詢6.任何地方都不要使用select* from t73. zookeeper 優點,用在什麼場合答:極大方便分布式應用的開發;(輕量,成本低,性能好,穩定性和可靠性高)
  • Spark專題-SparkSQL算子估價
    三、CBORBO層面的優化主要是針對邏輯計劃,未考慮到數據本身的特點(數據分布、大小)以及算子執行(中間結果集分布、大小)的代價,因此sparksql又引入了CBO優化機制(Cost-BasedDatabase database_nameTable table_nameOwner testCreated Time Sat Sep 15 14:00:40 CST 2018Last Access Thu Jan 01 08:00:00 CST 1970Created By Spark 2.3.1Type EXTERNALProvider hiveTable
  • 萬字長文帶你入門 Hadoop
    簡單來說大數據是:1、有海量的數據2、有對海量數據進行挖掘的需求3、有對海量數據進行挖掘的軟體工具(hadoop、spark、flink.)Hadoop與大數據HADOOP最早起源於Nutch項目。不過要提醒的是大數據的技術發展迅速,要保持學習,不斷的獲取新的知識。二、分布式協調服務——Zookeeper在學習hadoop組件之前,要先了解下zookeeper。zookeeper是一個分布式協調服務;就是為用戶的分布式應用程式提供協調服務。簡單的說zk解決了分布式系統的一致性問題,可以將需要一致性的數據放在zk中,同時zk也提供了監聽等機制。
  • 發現華為FI性能調優文檔對Spark Broadcast Join的一處誤解
    2G --conf spark.sql.hive.convertMetastoreParquet=false spark.sql.crossJoin.enabled=true說明:spark.sql.hive.convertMetastoreParquet=false是為了解決spark查詢hive表時,所有欄位內容解析都是
  • 史上最詳細、最全面的Hadoop環境搭建
    [hadoop@bigdata-senior01 modules]$ cat /opt/data/wc.inputhadoop mapreduce hivehbase spark stormsqoop hadoop hivespark hadoop[hadoop@bigdata-senior01 hadoopstandalone