前言
只有光頭才能變強。
文本已收錄至我的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 解決存儲問題
隨着數據量越來越大,在一台機器上已經無法存儲所有的數據了,那我們會將這些數據分配到不同的機器來進行存儲,但是這就帶來一個問題:不方便管理和維護
所以,我們就希望有一個系統可以將這些分布在不同操作服務器上的數據進行統一管理,這就有了分布式文件系統
- 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」。
- 🔥海量視頻資源
- 🔥Java精美腦圖
- 🔥Java學習路線
- 🔥開發常用工具
- 🔥精美整理好的PDF電子書
在公眾號下回復「888」即可獲取!!
本已收錄至我的GitHub精選文章,歡迎Star:https://github.com/ZhongFuCheng3y/3y
求點贊 求關注️ 求分享👥 求留言💬 對我來說真的 非常有用!!!