天天看點

2分鐘大白話:什麼是大資料架構。人人好懂

作者:架構師尼恩

▌問題背景:

在40歲老架構師 尼恩的讀者社群(50+)中,尼恩一直指導大家寫履歷,做面試,最高的拿到年薪近100W。

昨天指導 一個 阿裡 p6 小夥寫履歷,做面試。在幫他 挖掘履歷亮點時,發現他項目在Java上沒有什麼技術亮點,他項目的核心亮點,就在大資料

沒錯,就是大資料。但是小夥伴對大資料有畏懼心理, 擔心自己駕馭不了。

尼恩想說,其實大資料其實很簡單,是以,大家不用有畏懼心理。

這裡 尼恩給大家寫一篇 文章,2分鐘大白話,給大家講清楚 什麼是大資料架構。

  • 從此,大家 不會有 大資料 畏懼心理
  • 甚至,從此文開始, 會 愛上大資料
《尼恩 架構筆記》《尼恩 高并發三部曲》《尼恩 面試寶典》的PDF,請到公号【技術自由圈】取
2分鐘大白話:什麼是大資料架構。人人好懂

▌本文目錄:

- 問題背景
- 什麼是大資料
- 大資料架構的核心
- 超大規模 分布式 存儲架構:HDFS分布式檔案存儲架構
- 超大規模 分布式 計算 架構
- 超大規模 分布式 計算 架構:MapReduce
  - MapReduce是什麼?
  - WordCount的處理例子
  - 一個具體的MapReduce程式如下:
  - HDFS和MapReduce的親密關系
- 基于記憶體的中小規模計算: Spark快速大資料計算架構
  - Spark的RDD 資料模型
  - Spark的輕量級mapreduce函數
- 如何像寫sql一樣處理大資料:Hive大資料倉庫架構
  - 将SQL翻譯成MapReduce程式代碼
  - Hive整體架構
- 大資料流計算架構
  - 如何進行大資料的秒級處理
- 在2分鐘大白話的學習之後
- 11個技術聖經 PDF           

▌什麼是大資料:

比如說 尼恩曾經 主導的一個 大型大資料治理平台項目, 資料規模龐大:

  • 資料量在 10PB
  • 資料記錄在 100億以上
2分鐘大白話:什麼是大資料架構。人人好懂

比如說 尼恩曾經 主導的一個 大型搜尋中台項目

  • 資料量在 1PB
  • 資料記錄在 1億+
2分鐘大白話:什麼是大資料架構。人人好懂

資料規模一上來, 任務的執行就會很長,比如, 在 大型搜尋中台項目,一個高頻的、正常的、重要的 索引重刷任務,執行周期是多久呢?

  • 你以為是1小時
  • 實際上是10天
2分鐘大白話:什麼是大資料架構。人人好懂

▌大資料架構的核心:

面對如此龐大的資料,如何存儲、如何利用大規模的伺服器cluster處理計算才是大資料技術的核心。

大資料技術讨論的是,如何利用更多的計算機滿足大規模的資料計算要求。

大資料架構的核心, 就是分而治之, 無論在存儲上、還是在計算上,都是如此。

是以,尼恩把大資料架構的核心,分為兩個方面:

  • 超大規模 分布式 存儲架構
  • 超大規模 分布式 計算 架構
2分鐘大白話:什麼是大資料架構。人人好懂

▌超大規模 分布式 存儲架構:HDFS分布式檔案存儲架構

如何将數百TB或數百PB的資料存儲起來,通過一個檔案系統統一管理,這本身就是一項極大的挑戰。

大規模的資料計算首先要解決的是大規模資料的存儲問題。

HDFS的架構,有兩個大的核心角色,如下圖:

2分鐘大白話:什麼是大資料架構。人人好懂

NameNode伺服器充當檔案控制塊的角色,進行檔案中繼資料管理,即記錄檔案名、通路權限、資料存儲位址等資訊,而真正的檔案資料則存儲在DataNode伺服器上。

DataNode以塊為機關存儲檔案資料。在Hadoop2.x版本中,塊的大小可以通過配置參數來規定。預設為128M,但新版本中将塊大小調整為256M。

NameNode 和DataNode 如何 配合?

具體如下圖:

2分鐘大白話:什麼是大資料架構。人人好懂

▲HDFS架構

  • 所有的塊資訊,比如塊ID、塊所在的伺服器IP位址等,都記錄在NameNode伺服器上;
  • 而具體的塊資料則存儲在DataNode伺服器上。

HDFS可以将數千台伺服器,組成一個統一的檔案存儲系統。數千台伺服器,中有NameNode 和DataNode 互相 配合,當然,DataNode 在數量上占了絕大數。

HDFS如何實作存儲的高可靠呢? 為了保證不會因為硬碟或者伺服器損壞而導緻檔案損壞,HDFS會對資料塊進行複制,每個資料塊都會存儲在多台伺服器上,甚至多個機架上。

▌超大規模 分布式 計算 架構:

超大規模 分布式 計算 架構 可以從很多元度進行劃分,這裡尼恩按照性能,簡單劃分為:

  • 基于檔案的 超大規模計算
  • 基于記憶體的中小規模計算
2分鐘大白話:什麼是大資料架構。人人好懂

基于檔案的 超大規模計算, 很簡單,就是中間過程資料都輸出到文檔

  • 優點是 計算規模可以無限大 ,因為理論上 磁盤可以無限大
  • 缺點是 速度低下, 因為磁盤IO是 很低性能,很慢的

基于記憶體的 超大規模計算, 很簡單,就是中間過程資料都輸出到記憶體

  • 缺點是 計算規模不可以無限大 ,因為理論上記憶體是很小的規模
  • 優點是 速度高,因為記憶體IO是高性能,很快的

▌超大規模 分布式 計算 架構:MapReduce

資料存儲在HDFS上的最終目标還是為了計算,通過資料分析或者機器學習獲得有益的結果。但是如果像傳統的應用程式那樣把HDFS當作普通檔案,從檔案中讀取資料後進行計算,那麼對于需要一次計算數百TB資料的大資料計算場景,就不知道要算到什麼時候了。

▌MapReduce是什麼?

MapReduce的核心思想是對資料進行分片計算。

MapReduce在多個 伺服器上啟動同一個計算程式,每個伺服器上的程式程序,負責處理本伺服器上要處理的資料塊,是以,大量的資料就可以同時進行計算了。

那麼,每個資料塊的資料都是獨立的,如果這些資料塊需要進行關聯計算怎麼辦?MapReduce 通過 shuffle洗牌 的動作去完成。

shuffle洗牌的職責也太簡單:負責的來說,shuffle洗牌就是資料的傳輸和路由。 直覺一點來說,shuffle洗牌 把計算過程的中間件資料, 傳輸到後面的計算所需要的節點。

是以,一般來說,一個 MapReduce 大資料的處理流程,就是三個階段:

  • map
  • shuffle洗牌
  • reduce
2分鐘大白話:什麼是大資料架構。人人好懂

MapReduce将計算過程分成3個部分

MapReduce将計算過程分成3個部分:

  • map過程,每個伺服器上會啟動多個map程序,map優先讀取本地資料進行計算,計算後輸出一個<key, value>集合;
  • shuffle過程,所謂的shuffle就是将相同的key發送到同一個reduce程序中,在reduce中完成資料關聯計算。
  • reduce過程,MapReduce在每個伺服器上都會啟動多個reduce程序,然後對所有map輸出的<key, value>集合進行聚合reduce操作。

▌WordCount的處理例子

下面以經典的WordCount,即統計所有資料中相同單詞的詞頻資料為例,來認識map和reduce的處理過程,如下圖所示。

2分鐘大白話:什麼是大資料架構。人人好懂

假設原始資料有兩個資料塊,MapReduce架構啟動了兩個map程序進行處理,它們分别讀入資料。

  • map函數會對輸入資料進行分詞處理,然後針對每個單詞輸出<單詞, 1>這樣的<key, value>結果。
  • 然後進行shuffle操作,相同的key發送給同一個reduce程序,
  • 最後是 reduce操作,輸入就是<key, value清單>這樣的結構,即相同key的value合并成了一個value清單。

在這個示例中,這個value清單就是由很多個1組成的清單。reduce對這些1進行求和操作,就得到每個單詞的詞頻結果了。

▌一個具體的MapReduce程式如下:

其實,大資料非常簡單,隻是很多小夥伴, 膽子太小

public class WordCount {
 
    public static class TokenizerMapper
        extends Mapper<Object, Text, Text, IntWritable>{
 
    private final static IntWritable one = new IntWritable(1);
    private Text word = new Text();
 
    public void map(Object key, Text value, Context context
                   ) throws IOException, InterruptedException {
        StringTokenizer itr = new StringTokenizer(value.toString());
        while (itr.hasMoreTokens()) {
          word.set(itr.nextToken());
          context.write(word, one);
          }
      }
 
    public static class IntSumReducer
        extends Reducer<Text,IntWritable,Text,IntWritable> {
    private IntWritable result = new IntWritable();
 
    public void reduce(Text key, Iterable<IntWritable> values,
                     Context context
                     ) throws IOException, InterruptedException {
        int sum = 0;
        for (IntWritable val : values) {
          sum += val.get();
        }
        result.set(sum);
        context.write(key, result);
    }
}
           

上面講述了map和reduce程序合作完成資料處理的過程,那麼這些程序是如何在分布式的伺服器cluster上啟動的呢?

▌HDFS和MapReduce的親密關系

HDFS和MapReduce都是Hadoop的組成部分。HDFS和MapReduce是一種非常的親密關系

如下圖所示。

2分鐘大白話:什麼是大資料架構。人人好懂

▲MapReduce1計算處理過程

MapReduce的任務排程主要有JobTracker和TaskTracker這兩種程序角色,JobTracker是master的角色,在MapReduce cluster中隻有一個,而TaskTracker是worker的角色,和DataNode一起啟動在cluster的所有伺服器上。

MapReduce應用程式JobClient啟動後,會向JobTracker(master)送出作業,JobTracker根據作業中輸入的檔案路徑分析需要在哪些DataNode伺服器上啟動map程序,然後就向這些伺服器上的TaskTracker(worker)發送任務指令。

TaskTracker(worker)收到任務後,啟動一個TaskRunner程序下載下傳任務對應的程式,然後反射加載程式中的map函數,讀取任務中配置設定的資料塊,并進行map計算。

map計算結束後,TaskTracker(worker)會對map輸出進行shuffle操作,然後目标的worke,再一次啟動TaskRunner加載reduce函數進行後續計算。

▌基于記憶體的中小規模計算: Spark快速大資料計算架構

MapReduce主要使用硬碟存儲計算過程中的資料,雖然可靠性比較高,但是性能卻較差。

此外,MapReduce隻能使用map和reduce函數進行程式設計,雖然能夠完成各種大資料計算,但是程式設計比較複雜。

而且受map和reduce程式設計模型相對簡單的影響,複雜的計算必須組合多個MapReduce job才能完成,程式設計難度進一步增加。

總之,MapReduce是基于檔案的 超大規模計算, 很簡單,就是中間過程資料都輸出到文檔

  • 優點是 計算規模可以無限大 ,因為理論上 磁盤可以無限大
  • 缺點是 速度低下, 因為磁盤IO是 很低性能,很慢的

是以,演進出來了基于記憶體的 超大規模計算。

基于記憶體的 超大規模計算, 很簡單,就是中間過程資料都輸出到記憶體

  • 缺點是 計算規模不可以無限大 ,因為理論上記憶體是很小的規模
  • 優點是 速度高,因為記憶體IO是高性能,很快的

Spark在MapReduce的基礎上演進出來的,基于記憶體的 超大規模計算、

Spark主要使用記憶體進行中間計算資料存儲,加快了計算執行時間,在某些情況下性能可以提升上百倍。

▌Spark的RDD 資料模型

沒有了檔案, Spark抽象了自己的資料模型,叫做RDD

RDD(Resilient Distributed Dataset)叫做彈性分布式資料集,是Spark 中最基本的資料抽象,它代表一個不可變、可分區、裡面的元素可并行計算的集合。

在Spark 中,對資料的所有操作不外乎建立RDD、轉化已有RDD 以及調用RDD 操作進行求值。

每個RDD 都被分為多個分區,這些分區運作在cluster中的不同節點上。

RDD 可以包含Python、Java、Scala 中任意類型的對象, 甚至可以包含使用者自定義的對象。

RDD 具有資料流模型的特點:自動容錯、位置感覺性排程和可伸縮性。

RDD 允許使用者在執行多個查詢時顯式地将工作集緩存在記憶體中,後續的查詢能夠重用工作集,這極大地提升了查詢速度。

RDD 支援兩種操作:transformation操作和action操作。

RDD 的轉化操作是傳回一個新的RDD 的操作,比如map()和filter(),而action操作則是向驅動器程式傳回結果或把結果寫入外部系統的操作。比如count() 和first()。

Spark 采用惰性計算模式,RDD 隻有第一次在一個行動操作中用到時,才會真正計算。

Spark 可以優化整個計算過程。預設情況下,Spark 的RDD 會在你每次對它們進行行動操作時重新計算。如果想在多個行動操作中重用同一個RDD , 可以使用RDD.persist() 讓Spark 把這個RDD 緩存下來。

▌Spark的輕量級mapreduce函數

Spark的主要程式設計模型是RDD,即彈性資料集。在RDD上定義了許多常見的大資料計算函數,利用這些函數可以用極少的代碼完成較為複雜的大資料計算。

RDD 在Spark中,替代了 檔案在 mapreduce中的地位。

Spark的梳理處理模型,和mapreduce 類似,可以了解為 輕量級mapreduce函數

2分鐘大白話:什麼是大資料架構。人人好懂

前面舉例的WorkCount如果用Spark程式設計,隻需要三行代碼:

val textFile = sc.textFile("hdfs://...")
val counts = textFile.flatMap(line => line.split(" "))
                 .map(word => (word, 1))
                 .reduceByKey(_ + _)
counts.saveAsTextFile("hdfs://...")           

首先,從HDFS讀取資料,建構出一個RDD textFile。然後,在這個RDD上執行三個操作:

  • 一是将輸入資料的每一行文本用空格拆分成單詞;
  • 二是将每個單詞進行轉換,比如word→(word, 1),生成<Key, Value>的結構;
  • 三是針對相同的Key進行統計,統計方式是對Value求和。最後,将RDD counts寫入HDFS,完成結果輸出。

上面代碼中flatMap、map、reduceByKey都是Spark的RDD轉換函數,RDD轉換函數的計算結果還是RDD,是以上面三個函數可以寫在一行代碼上,最後得到的還是RDD。

Spark會根據程式中的轉換函數生成計算任務執行計劃,這個執行計劃就是一個DAG。Spark可以在一個作業中完成非常複雜的大資料計算,Spark DAG示例如下圖所示。

2分鐘大白話:什麼是大資料架構。人人好懂

▲Spark RDD有向無環圖DAG示例

在上圖中,A、C和E是從HDFS上加載的RDD。A經過groupBy分組統計轉換函數計算後得到RDD B,C經過map轉換函數計算後得到RDD D,D和E經過union合并轉換函數計算後得到RDD F,B和F經過join連接配接轉換函數計算後得到最終結果RDD G。

▌如何像寫sql一樣處理大資料:Hive大資料倉庫架構

問題:

無論是基于檔案的MapReduce,還是基于記憶體的spark,都需要寫一大段的處理算子,還需要管理那些算子之間,複雜的先後依賴關系,是以,開發比較複雜。

傳統上,主要使用SQL進行資料分析,如果能根據SQL自動生成MapReduce,就可以極大降低大資料技術在資料分析領域的應用門檻。

Hive就是這樣一個工具。

▌将SQL翻譯成MapReduce程式代碼

Hive要做的就是:将SQL翻譯成MapReduce程式代碼

我們來看對于如下一條常見的SQL語句,Hive是如何将其轉換成MapReduce計算的。

SELECT pageid, age, count(1) FROM pv_users GROUP BY pageid, age;           

這是一條常見的SQL統計分析語句,用于統計不同年齡的使用者通路不同網頁的興趣偏好,具體資料輸入和執行結果示例如下圖所示。

2分鐘大白話:什麼是大資料架構。人人好懂

▲SQL統計分析輸入資料和執行結果舉例

看這個示例我們就會發現,這個計算場景和WordCount很像。

事實上也确實如此,我們可以用MapReduce完成這條SQL的處理,如下圖所示。

2分鐘大白話:什麼是大資料架構。人人好懂

▲MapReduce完成SQL處理過程舉例

map函數輸出的key是表的行記錄,value是1,reduce函數對相同的行進行記錄,也就是針對具有相同key的value集合進行求和計算,最終得到SQL的輸出結果。

實際上,Hive内置了很多Operator,每個Operator完成一個特定的計算過程,

Hive将這些Operator構造成一個有向無環圖DAG,然後根據這些Operator之間是否存在shuffle将其封裝到map或者reduce函數中,之後就可以送出給MapReduce執行了。

Operator組成的DAG如下圖

2分鐘大白話:什麼是大資料架構。人人好懂

▲示例SQL的MapReduce 有向無環圖DAG

這是一個包含where查詢條件的SQL,where查詢條件對應一個FilterOperator。

▌Hive整體架構

Hive整體架構如下圖所示。

2分鐘大白話:什麼是大資料架構。人人好懂

▲Hive整體架構

Hive的表資料存儲在HDFS。

表的結構,比如表名、字段名、字段之間的分隔符等存儲在Metastore中。

使用者通過Client送出SQL到Driver,Driver請求Compiler将SQL編譯成如上示例的DAG執行計劃中,然後交給Hadoop執行。

▌大資料流計算架構:

大資料兩個方向: 離線計算、流式計算。前面講的,都是離線計算。 再來看 流式計算。

▌如何進行大資料的秒級處理

Spark雖然比MapReduce快很多,但是在大多數場景下計算耗時依然是分鐘級别的,這種計算一般被稱為大資料批處理計算。

而在實際應用中,有些時候需要在秒級别、毫秒級完成不斷輸入的海量資料的計算處理。

秒級别、毫秒級非常多:

  • 比如今日頭條的個性化推薦
  • 比如實時對攝像頭采集的資料進行監控分析,這就是所謂的大資料流計算。

早期比較著名的流式大資料計算引擎是Storm,今日頭條的個性化推薦,就是一個超大規模storm cluster。

後來随着Spark的火爆,Spark上的流式計算引擎Spark Streaming也逐漸流行起來。

Spark Streaming的架構原理是将實時流入的資料切分成小的一批一批的資料,然後将這些小的一批批資料交給Spark執行。

由于資料量比較小,Spark Streaming又常駐系統,不需要重新啟動,是以可以在毫秒級完成計算,看起來像是實時計算一樣,如下圖所示。

2分鐘大白話:什麼是大資料架構。人人好懂

▲Spark Streaming流計算将實時流式資料轉化成小的批處理計算

最近幾年比較流行的大資料引擎Flink其架構原理和Spark Streaming很相似,它可以基于不同的資料源,根據資料量和計算場景的要求,靈活地适應流計算和批處理計算。

關于flink的學習,後面尼恩團隊會給大家寫一本超級牛逼的 《flink學習聖經》。

這裡就不做展開了。

▌在2分鐘大白話的學習之後:

看完此文的2分鐘大白話,大家基本也清楚 什麼是大資料架構。

是以說,其實大資料其實很簡單,大家不用有畏懼心理。

從此,大家 不用有 大資料 畏懼心理 。甚至,從此文開始,大家會 愛上大資料

學習的過程中,遇到問題,可以找尼恩。

2分鐘大白話:什麼是大資料架構。人人好懂

▌11個技術聖經 PDF:

2分鐘大白話:什麼是大資料架構。人人好懂

繼續閱讀