前言

只有光頭才能變強。

文本已收錄至我的GitHub倉庫,歡迎Star: https://github.com/ZhongFuCheng3y/3y

這篇文章主要是 入門 大數據,不涉及到高深的知識點和理論,我相信每個人都看得懂。如果文章有錯誤的地方,不妨在評論區友善指出~

一、什麼是大數據?

1.1 前置知識

我有的時候給 外行人 講解什麼是數據庫,就常常用Excel來舉例子(因爲大多數人認識什麼是Excel)。在知乎有一個類似的題目《有excel了要數據庫幹啥?》,大家可以去看看:

其實很大一部分原因就是:Excel能處理的 數據量 遠遠沒有數據庫得多。由於我們互聯網產生的數據是非常非常多的,所以我們一般選擇數據庫來存儲數據。

Excel只有104w行,多了加載不進去的 ---- @知乎 EamonLiao

衆所周知,我們能存多少數據,是取決於我們 硬盤 的大小的。比如,我的磁盤的大小就256GB(實際能存儲的大小是沒有256GB的,但這裏我就不展開了),這意味着我這電腦只能存儲比256GB要小的數據。

爲了能夠更好地管理計算機的數據(訪問和查找變得更加簡單),我們就有了 文件系統

有了文件系統,已經可以存儲數據了(很方便我們去獲取),那爲什麼還會有數據庫呢?

文件系統存在以下缺點: 數據共享性差,冗餘度大; 數據獨立性差

數據庫系統實現整體結構化,這是數據庫系統與文件系統的本質區別。 -----《數據庫系統概論》

數據庫其實就是爲了針對 特定類型數據 處理而設計的系統,而 文件系統 則可看作 通用型 的數據存儲系統 @知乎 吳穗榮

再回到大數據上,大數據就看名字我們就知道: 數據量很大 。大到什麼程度呢?一塊普通的硬盤不能將一個文件存儲下來。

那我還想將這個文件存下來,怎麼辦呢?方案其實很簡單(說白了一個是垂直伸縮,一個是水平伸縮):

  • 多買幾塊硬盤,組成一個更大的“硬盤”,希望能容納更多的數據。

    • RAID(獨立磁盤冗餘陣列)技術是將 多塊普通磁盤組成一個陣列,共同對外提供服務
    • 比如,我現在覺得我的電腦16GB不夠用了,而我的主板有兩個內存槽,我多買一條16GB的內存條插入。那我就可以說,我的電腦是32GB內存的。
  • 把這個文件切開幾份,存到不同的硬盤中

    • 比如我有1個TB的文件,我把它切分成5份,每份200G,存到不同的服務器中。

如果是普通的用戶,肯定選擇的是多買一塊硬盤,升級硬件啊。但是互聯網公司就不這樣幹,他們就選擇將一個文件切分成幾份,放到不同的服務器中。爲什麼?

  1. 頂級的電腦硬件 成本 很大。(單臺計算機性能到一定的量上,再升級的成本就非常高)
  2. 單單 一臺 頂級的電腦可能也 無法處理 掉這麼大量的數據

綜上所述,目前互聯網企業中都是選擇 水平伸縮 在一個系統中添加計算機來滿足不斷增長的用戶量和支撐數據的平穩運行。

1.2 解決存儲問題

隨着數據量越來越大,在一臺機器上已經無法存儲所有的數據了,那我們會將這些數據分配到不同的機器來進行存儲,但是這就帶來一個問題: 不方便管理和維護

所以,我們就希望有一個系統可以將這些分佈在不同操作服務器上的數據進行 統一管理 ,這就有了 分佈式文件系統

  • HDFS 是分佈式文件系統的其中一種(目前用得最廣泛的一種)

在使用HDFS的時候是非常簡單的:雖然HDFS是將文件存儲到不同的機器上,但是我去使用的時候是把這些文件 當做 是存儲在一臺機器的方式去使用(背後卻是多臺機器在執行):

  • 好比:我調用了一個RPC接口,我給他參數,他返回一個response給我。RPC接口做了什麼事其實我都不知道的(可能這個RPC接口又調了其他的RPC接口)----- 屏蔽掉實現細節,對用戶友好

1.3 解決計算問題

上面我們使用HDFS作爲分佈式文件系統,已經可以把數據存到不同的機器上(或者在不同的機器上讀取到數據)。可以通過簡單 命令行 的方式對文件的 簡單的存取

現在呢,由於數據量是非常大的,分散到不同的機器上。我們想要對數據進行處理,我們肯定會有一段寫好的程序。處理的方式有兩種:

  • 將數據傳遞給程序(機器A/B/C的數據 傳給 機器D程序來執行)
  • 程序到數據所在的地方執行(將程序分別 機器A/B/C上執行)

選哪個?我們一般會採用” 程序到數據所在的地方執行 “,因爲在大數據裏邊我們的數據量很大,如果要把 機器A/B/C 的數據輸入到 機器D 上,這樣不划算。

  • 數據量很大,通過網絡傳輸大數據到某一臺機器上做操作,不合適。
  • 機器D只有一臺機器,處理的效率低下。

所以我們會將程序分別放到 機器A/B/C 上處理,本來程序就非常小,放到別的機器上是輕輕鬆鬆的。還可以使用 機器A/B/C 的資源做運算,這就很合適了。

「將數據傳遞給程序」這種就是所謂的“ 移動存儲到計算 ”,而「程序到數據所在的地方執行」這種就是所謂的“ 移動計算到存儲的觀念 ”。

在大數據的領域裏, 移動計算比移動數據更划算MapReduce 就是這樣乾的:

  • 每臺機器執行任務的時候去檢查自己有沒有相應的程序,如果沒有則通過網絡下載程序包,然後通過 反射 來加載程序

二、大數據沒有想象中神祕

在剛聽到「大數據」這個詞的時候,可能有的人會想問: 所謂大數據,那數據是從哪裏來的呢

簡單來說可以歸類爲三類:

  • 日誌
  • 數據庫
  • 爬蟲

1、爬蟲應該很好理解,就是通過網絡爬蟲獲取 外部 數據,將這些數據自己存儲起來。很多的 比價網站 就是爬取各種電商網站的數據,然後比較各個網站的數據後得到結果。本身它們網站本身是沒有這個數據的,這個數據是從別人那爬過來的。

2、數據庫本來就已經存儲了我們的數據,而我們要做的只是把數據庫的數據 導入 我們的大數據平臺那兒,讓數據能夠得到更好的分析。

3、日誌這塊其實我更多想說的是 打點(埋點) 這塊。有的人會把這埋點和日誌的概念分開,只是我把它給合在一起叫「日誌」。日誌有用戶行爲日誌(埋點),也有系統的運行產生的日誌。 用戶行爲日誌 這塊說白了就是:從你進去某個APP的一刻開啓。 幾乎你所有的操作都會被記錄下來 (點了某個tag、在某個tag停頓了多少秒)。猜你喜歡這類的系統就是 根據你以往行爲 來對進行推薦。

好了,現在我們有不同的地方收集到數據,我們要最終要做的就是把這個數據 彙總 到一起來進行存儲和分析。

於是我們就需要將日誌、數據庫、爬蟲這些 不同數據源的數據 導入到我們的集羣中(這個集羣就是上面提到的,分佈式文件系統(HDFS),分佈式計算系統)。

由於數據源的不同,所以會有多種的工具對數據進行導入。比如將日誌的數據收集我們會有 Flume ,從數據庫同步我們會有 Sqoop 。這也就是所謂的 ETL (萃取「extract」、轉置「transform」、加載「load」)

ETL是將 業務系統的數據經過抽取、清洗轉換之後加載到數據倉庫的過程 ,目的是將企業中的分散、零亂、標準不統一的數據整合到一起,爲企業的決策提供分析依據。

:不要被上面的Sqoop、Flume 這樣的名詞給嚇着了,其實就是 現有的成熟的框架技術

我們把所有的數據收集起來,把這個存儲數據的地方叫做 數據倉庫 。基於數據倉庫我們統計能各種的指標,基於這些指標可以 指導 我們 是否要做一個需求或決策

比如說:現在我們要對APP的首頁改版了,但不知道用戶是否能接受這次的改版。於是我們就可以先對一少部分的用戶做實驗(這一部分的用戶看到的是改版後的首頁),我們 根據這一部分用戶的行爲來判斷這一次的改版是否有比較好的效果

  • 用戶的行爲我們都有收集起來。只要將實驗用戶關聯到對應的指標,與現有的指標做一次對比,我們大概就知道這次改版是否真的合理。

這種拿一部分流量做實驗,我們也稱這種做法爲「 ABTest 」,如果對ABTest感興趣的同學可以在我的 GitHub 下搜索關鍵字「ABTest」來閱讀具體的文章哦~

最後

這篇文章簡單的說了一下所謂的「大數據」中的 數據是從哪裏來的 ,由於數據量很大,所以我們要解決數據的存儲和計算的問題。

基於存儲和計算問題我們業內就提供了很多現成的技術實現了,下面圖中的技術每一種類型我後續都會講解到,可以 關注我,不迷路哦

參考資料:《從0開始學大數據》--李智慧

如果大家想要 實時 關注我更新的文章以及分享的乾貨的話,可以關注我的公衆號「 Java3y 」。

  • :fire: 海量視頻資源
  • :fire: Java精美腦圖
  • :fire: Java學習路線
  • :fire: 開發常用工具
  • :fire: 精美整理好的PDF電子書

在公衆號下回復「 888 」即可獲取!!

本已收錄至我的GitHub精選文章,歡迎Starhttps://github.com/ZhongFuCheng3y/3y

求點贊 求關注️ 求分享:busts_in_silhouette: 求留言:speech_balloon: 對我來說真的 非常有用 !!!

相關文章