這篇文章主要是入門(mén)大數(shù)據(jù),不涉及到高深的知識(shí)點(diǎn)和理論,我相信每個(gè)人都看得懂。如果文章有錯(cuò)誤的地方,不妨在評(píng)論區(qū)友善指出~
一、什么是大數(shù)據(jù)?
1.1 前置知識(shí)
眾所周知,我們能存多少數(shù)據(jù),是取決于我們硬盤(pán)的大小的。比如,我的磁盤(pán)的大小就256GB(實(shí)際能存儲(chǔ)的大小是沒(méi)有256GB的,但這里我就不展開(kāi)了),這意味著我這電腦只能存儲(chǔ)比256GB要小的數(shù)據(jù)。
硬盤(pán)的大小
為了能夠更好地管理計(jì)算機(jī)的數(shù)據(jù)(訪(fǎng)問(wèn)和查找變得更加簡(jiǎn)單),我們就有了文件系統(tǒng)。
文件系統(tǒng)
有了文件系統(tǒng),已經(jīng)可以存儲(chǔ)數(shù)據(jù)了(很方便我們?nèi)カ@取),那為什么還會(huì)有數(shù)據(jù)庫(kù)呢?
文件系統(tǒng)存在以下缺點(diǎn):數(shù)據(jù)共享性差,冗余度大;數(shù)據(jù)獨(dú)立性差
數(shù)據(jù)庫(kù)系統(tǒng)實(shí)現(xiàn)整體結(jié)構(gòu)化,這是數(shù)據(jù)庫(kù)系統(tǒng)與文件系統(tǒng)的本質(zhì)區(qū)別。-----《數(shù)據(jù)庫(kù)系統(tǒng)概論》
數(shù)據(jù)庫(kù)其實(shí)就是為了針對(duì)特定類(lèi)型數(shù)據(jù)處理而設(shè)計(jì)的系統(tǒng),而文件系統(tǒng)則可看作通用型的數(shù)據(jù)存儲(chǔ)系統(tǒng) @知乎 吳穗榮
再回到大數(shù)據(jù)上,大數(shù)據(jù)就看名字我們就知道:數(shù)據(jù)量很大。大到什么程度呢?一塊普通的硬盤(pán)不能將一個(gè)文件存儲(chǔ)下來(lái)。
那我還想將這個(gè)文件存下來(lái),怎么辦呢?方案其實(shí)很簡(jiǎn)單(說(shuō)白了一個(gè)是垂直伸縮,一個(gè)是水平伸縮):
- 多買(mǎi)幾塊硬盤(pán),組成一個(gè)更大的“硬盤(pán)”,希望能容納更多的數(shù)據(jù)。
- RAID(獨(dú)立磁盤(pán)冗余陣列)技術(shù)是將多塊普通磁盤(pán)組成一個(gè)陣列,共同對(duì)外提供服務(wù)。
- 比如,我現(xiàn)在覺(jué)得我的電腦16GB不夠用了,而我的主板有兩個(gè)內(nèi)存槽,我多買(mǎi)一條16GB的內(nèi)存條插入。那我就可以說(shuō),我的電腦是32GB內(nèi)存的。
- 把這個(gè)文件切開(kāi)幾份,存到不同的硬盤(pán)中
- 比如我有1個(gè)TB的文件,我把它切分成5份,每份200G,存到不同的服務(wù)器中。
如果是普通的用戶(hù),肯定選擇的是多買(mǎi)一塊硬盤(pán),升級(jí)硬件啊。但是互聯(lián)網(wǎng)公司就不這樣干,他們就選擇將一個(gè)文件切分成幾份,放到不同的服務(wù)器中。為什么?
- 頂級(jí)的電腦硬件成本很大。(單臺(tái)計(jì)算機(jī)性能到一定的量上,再升級(jí)的成本就非常高)
- 單單一臺(tái)頂級(jí)的電腦可能也無(wú)法處理掉這么大量的數(shù)據(jù)
垂直伸縮和水平伸縮
綜上所述,目前互聯(lián)網(wǎng)企業(yè)中都是選擇水平伸縮在一個(gè)系統(tǒng)中添加計(jì)算機(jī)來(lái)滿(mǎn)足不斷增長(zhǎng)的用戶(hù)量和支撐數(shù)據(jù)的平穩(wěn)運(yùn)行。
1.2 解決存儲(chǔ)問(wèn)題
隨著數(shù)據(jù)量越來(lái)越大,在一臺(tái)機(jī)器上已經(jīng)無(wú)法存儲(chǔ)所有的數(shù)據(jù)了,那我們會(huì)將這些數(shù)據(jù)分配到不同的機(jī)器來(lái)進(jìn)行存儲(chǔ),但是這就帶來(lái)一個(gè)問(wèn)題:不方便管理和維護(hù)
所以,我們就希望有一個(gè)系統(tǒng)可以將這些分布在不同操作服務(wù)器上的數(shù)據(jù)進(jìn)行統(tǒng)一管理,這就有了分布式文件系統(tǒng)
- HDFS是分布式文件系統(tǒng)的其中一種(目前用得最廣泛的一種)
在使用HDFS的時(shí)候是非常簡(jiǎn)單的:雖然HDFS是將文件存儲(chǔ)到不同的機(jī)器上,但是我去使用的時(shí)候是把這些文件當(dāng)做是存儲(chǔ)在一臺(tái)機(jī)器的方式去使用(背后卻是多臺(tái)機(jī)器在執(zhí)行):
- 好比:我調(diào)用了一個(gè)RPC接口,我給他參數(shù),他返回一個(gè)response給我。RPC接口做了什么事其實(shí)我都不知道的(可能這個(gè)RPC接口又調(diào)了其他的RPC接口)-----屏蔽掉實(shí)現(xiàn)細(xì)節(jié),對(duì)用戶(hù)友好
HDFS使用
1.3 解決計(jì)算問(wèn)題
上面我們使用HDFS作為分布式文件系統(tǒng),已經(jīng)可以把數(shù)據(jù)存到不同的機(jī)器上(或者在不同的機(jī)器上讀取到數(shù)據(jù))。可以通過(guò)簡(jiǎn)單命令行的方式對(duì)文件的簡(jiǎn)單的存取。
現(xiàn)在呢,由于數(shù)據(jù)量是非常大的,分散到不同的機(jī)器上。我們想要對(duì)數(shù)據(jù)進(jìn)行處理,我們肯定會(huì)有一段寫(xiě)好的程序。處理的方式有兩種:
- 將數(shù)據(jù)傳遞給程序(機(jī)器A/B/C的數(shù)據(jù)傳給機(jī)器D程序來(lái)執(zhí)行)
- 程序到數(shù)據(jù)所在的地方執(zhí)行(將程序分別到機(jī)器A/B/C上執(zhí)行)
選哪個(gè)?我們一般會(huì)采用”程序到數(shù)據(jù)所在的地方執(zhí)行“,因?yàn)樵诖髷?shù)據(jù)里邊我們的數(shù)據(jù)量很大,如果要把機(jī)器A/B/C的數(shù)據(jù)輸入到機(jī)器D上,這樣不劃算。
- 數(shù)據(jù)量很大,通過(guò)網(wǎng)絡(luò)傳輸大數(shù)據(jù)到某一臺(tái)機(jī)器上做操作,不合適。
- 機(jī)器D只有一臺(tái)機(jī)器,處理的效率低下。
所以我們會(huì)將程序分別放到機(jī)器A/B/C上處理,本來(lái)程序就非常小,放到別的機(jī)器上是輕輕松松的。還可以使用機(jī)器A/B/C的資源做運(yùn)算,這就很合適了。
「將數(shù)據(jù)傳遞給程序」這種就是所謂的“移動(dòng)存儲(chǔ)到計(jì)算”,而「程序到數(shù)據(jù)所在的地方執(zhí)行」這種就是所謂的“移動(dòng)計(jì)算到存儲(chǔ)的觀念”。
在大數(shù)據(jù)的領(lǐng)域里, 移動(dòng)計(jì)算比移動(dòng)數(shù)據(jù)更劃算。MapReduce就是這樣干的:
- 每臺(tái)機(jī)器執(zhí)行任務(wù)的時(shí)候去檢查自己有沒(méi)有相應(yīng)的程序,如果沒(méi)有則通過(guò)網(wǎng)絡(luò)下載程序包,然后通過(guò)反射來(lái)加載程序
二、大數(shù)據(jù)沒(méi)有想象中神秘
在剛聽(tīng)到「大數(shù)據(jù)」這個(gè)詞的時(shí)候,可能有的人會(huì)想問(wèn):所謂大數(shù)據(jù),那數(shù)據(jù)是從哪里來(lái)的呢?
簡(jiǎn)單來(lái)說(shuō)可以歸類(lèi)為三類(lèi):
- 日志
- 數(shù)據(jù)庫(kù)
- 爬蟲(chóng)
1、 爬蟲(chóng)應(yīng)該很好理解,就是通過(guò)網(wǎng)絡(luò)爬蟲(chóng)獲取外部數(shù)據(jù),將這些數(shù)據(jù)自己存儲(chǔ)起來(lái)。很多的比價(jià)網(wǎng)站就是爬取各種電商網(wǎng)站的數(shù)據(jù),然后比較各個(gè)網(wǎng)站的數(shù)據(jù)后得到結(jié)果。本身它們網(wǎng)站本身是沒(méi)有這個(gè)數(shù)據(jù)的,這個(gè)數(shù)據(jù)是從別人那爬過(guò)來(lái)的。
2、數(shù)據(jù)庫(kù)本來(lái)就已經(jīng)存儲(chǔ)了我們的數(shù)據(jù),而我們要做的只是把數(shù)據(jù)庫(kù)的數(shù)據(jù)導(dǎo)入我們的大數(shù)據(jù)平臺(tái)那兒,讓數(shù)據(jù)能夠得到更好的分析。
3、日志這塊其實(shí)我更多想說(shuō)的是打點(diǎn)(埋點(diǎn))這塊。有的人會(huì)把這埋點(diǎn)和日志的概念分開(kāi),只是我把它給合在一起叫「日志」。日志有用戶(hù)行為日志(埋點(diǎn)),也有系統(tǒng)的運(yùn)行產(chǎn)生的日志。用戶(hù)行為日志這塊說(shuō)白了就是:從你進(jìn)去某個(gè)App的一刻開(kāi)啟。幾乎你所有的操作都會(huì)被記錄下來(lái)(點(diǎn)了某個(gè)tag、在某個(gè)tag停頓了多少秒)。猜你喜歡這類(lèi)的系統(tǒng)就是根據(jù)你以往行為來(lái)對(duì)進(jìn)行推薦。
好了,現(xiàn)在我們有不同的地方收集到數(shù)據(jù),我們要最終要做的就是把這個(gè)數(shù)據(jù)匯總到一起來(lái)進(jìn)行存儲(chǔ)和分析。
于是我們就需要將日志、數(shù)據(jù)庫(kù)、爬蟲(chóng)這些不同數(shù)據(jù)源的數(shù)據(jù)導(dǎo)入到我們的集群中(這個(gè)集群就是上面提到的,分布式文件系統(tǒng)(HDFS),分布式計(jì)算系統(tǒng))。
由于數(shù)據(jù)源的不同,所以會(huì)有多種的工具對(duì)數(shù)據(jù)進(jìn)行導(dǎo)入。比如將日志的數(shù)據(jù)收集我們會(huì)有Flume,從數(shù)據(jù)庫(kù)同步我們會(huì)有Sqoop。這也就是所謂的ETL(萃取「extract」、轉(zhuǎn)置「transform」、加載「load」)
ETL是將業(yè)務(wù)系統(tǒng)的數(shù)據(jù)經(jīng)過(guò)抽取、清洗轉(zhuǎn)換之后加載到數(shù)據(jù)倉(cāng)庫(kù)的過(guò)程,目的是將企業(yè)中的分散、零亂、標(biāo)準(zhǔn)不統(tǒng)一的數(shù)據(jù)整合到一起,為企業(yè)的決策提供分析依據(jù)。
(注:不要被上面的Sqoop、Flume 這樣的名詞給嚇著了,其實(shí)就是現(xiàn)有的成熟的框架技術(shù))
我們把所有的數(shù)據(jù)收集起來(lái),把這個(gè)存儲(chǔ)數(shù)據(jù)的地方叫做數(shù)據(jù)倉(cāng)庫(kù)。基于數(shù)據(jù)倉(cāng)庫(kù)我們統(tǒng)計(jì)能各種的指標(biāo),基于這些指標(biāo)可以指導(dǎo)我們是否要做一個(gè)需求或決策。
比如說(shuō):現(xiàn)在我們要對(duì)APP的首頁(yè)改版了,但不知道用戶(hù)是否能接受這次的改版。于是我們就可以先對(duì)一少部分的用戶(hù)做實(shí)驗(yàn)(這一部分的用戶(hù)看到的是改版后的首頁(yè)),我們根據(jù)這一部分用戶(hù)的行為來(lái)判斷這一次的改版是否有比較好的效果。
- 用戶(hù)的行為我們都有收集起來(lái)。只要將實(shí)驗(yàn)用戶(hù)關(guān)聯(lián)到對(duì)應(yīng)的指標(biāo),與現(xiàn)有的指標(biāo)做一次對(duì)比,我們大概就知道這次改版是否真的合理。
這種拿一部分流量做實(shí)驗(yàn),我們也稱(chēng)這種做法為「ABTest」,如果對(duì)ABTest感興趣的同學(xué)可以在我的GitHub下搜索關(guān)鍵字「ABTest」來(lái)閱讀具體的文章哦~
最后
這篇文章簡(jiǎn)單的說(shuō)了一下所謂的「大數(shù)據(jù)」中的數(shù)據(jù)是從哪里來(lái)的,由于數(shù)據(jù)量很大,所以我們要解決數(shù)據(jù)的存儲(chǔ)和計(jì)算的問(wèn)題。
基于存儲(chǔ)和計(jì)算問(wèn)題我們業(yè)內(nèi)就提供了很多現(xiàn)成的技術(shù)實(shí)現(xiàn)了,下面圖中的技術(shù)每一種類(lèi)型我后續(xù)都會(huì)講解到,可以關(guān)注我,不迷路哦。