摘要:二求文件中包含包租婆的行數(shù)從一個(gè)總計(jì)行的文件中找出所有包含包租婆的行數(shù),我們不用太動(dòng)腦筋就有一個(gè)算法讀一行,判斷這一行有包租婆嗎如果有,全局變量加。在臺(tái)機(jī)器上分別執(zhí)行笨辦法計(jì)算包含包租婆的行數(shù)。
一、搬磚 vs. 分布式計(jì)算
一個(gè)人搬磚很累,幾個(gè)人一起搬就會(huì)輕松很多,也會(huì)快很多:
分布并行計(jì)算和幾個(gè)人一起搬磚的意思是一致的,一個(gè)資源密集型的任務(wù)(搬磚或計(jì)算),需要 一組資源(小伙伴或計(jì)算節(jié)點(diǎn)),并行地完成:
計(jì)算任務(wù) => 搬磚
計(jì)算節(jié)點(diǎn) => 小伙伴
當(dāng)計(jì)算任務(wù)過重時(shí),我們就把計(jì)算任務(wù)拆分,然后放到多個(gè)計(jì)算節(jié)點(diǎn)上同時(shí)執(zhí)行,這就是分布并行計(jì)算。
二、求文件中包含"包租婆"的行數(shù)從一個(gè)總計(jì)100行的文件中找出所有包含“包租婆”的行數(shù),我們不用太動(dòng)腦筋就有一個(gè)算法:
讀一行,判斷這一行有“包租婆”嗎?如果有,全局變量count加1。
文件到末尾了嗎?如果沒有,跳轉(zhuǎn)到第1步繼續(xù)執(zhí)行。
打印count。
這幾步程序,我打賭在你的計(jì)算機(jī)上可以一眨眼的功夫就執(zhí)行完。但是如果這個(gè)文件有100萬行呢? 如果還用剛才不動(dòng)腦筋的笨算法,可能就不好交差了......
并行分布計(jì)算采用了一個(gè)大智若愚的辦法,通過將笨算法丟給一群機(jī)器同時(shí)去算,實(shí)現(xiàn)規(guī)定時(shí)間內(nèi)規(guī)定 任務(wù)的完成。你要知道,如今流行的Map/Reduce就是這么干的,這聽起來不夠高端,也確實(shí)引起了一些數(shù)據(jù)庫(kù)專 家(聰明人)的非議。不過,不管黑貓白貓,能抓住老鼠的都是好貓。
三、Spark簡(jiǎn)化了分布式計(jì)算的開發(fā)如果要把剛才的任務(wù)進(jìn)行分布計(jì)算(假設(shè)有10臺(tái)機(jī)器可以用),需要對(duì)原始的笨算法做一些調(diào)整:
把100萬條數(shù)據(jù)分成10份,每份10萬條。
在10臺(tái)機(jī)器上分別執(zhí)行笨辦法計(jì)算包含“包租婆”的行數(shù)。
匯總合并10臺(tái)機(jī)器的計(jì)算結(jié)果,即count,打印出來。
Oh...NO.....太...累...了...
好在有Spark的存在!我們只要把數(shù)據(jù)和計(jì)算程序交給Spark,它會(huì)機(jī)智地進(jìn)行數(shù)據(jù)切分、算法復(fù)制、分布執(zhí)行、結(jié)果合并。
四、Spark的計(jì)算范式:數(shù)據(jù)集上的計(jì)算Spark用起來的確簡(jiǎn)單,但有一點(diǎn)特別要注意,你得按照Spark的范式寫算法。
Spark是在數(shù)據(jù)集的層次上進(jìn)行分布并行計(jì)算,是的,它只認(rèn)成堆的數(shù)據(jù):
我們提交給Spark的計(jì)算任務(wù),必須滿足兩個(gè)條件:
數(shù)據(jù)是可以分塊的,每塊構(gòu)成一個(gè)集合。
算法只能在集合級(jí)別執(zhí)行操作。
比如,對(duì)于文本文件,在Spark中,一行就是一條記錄,若干條記錄組成一個(gè)集合。我們 原來的算法直接在每一行上進(jìn)行計(jì)算,就不行了。需要先構(gòu)建數(shù)據(jù)集,然后通過數(shù)據(jù)集的操作, 實(shí)現(xiàn)我們的目的。
如果你熟悉SQL,可以用SQL的思維考慮下什么是集合操作:
UPDATE USER SET GENDER="FEMALE"
上面的SQL語(yǔ)句就是一個(gè)集合操作,對(duì)一個(gè)數(shù)據(jù)集合,執(zhí)行一條UPDATE操作,整個(gè)數(shù)據(jù)集都被修改了。
UPDATE語(yǔ)句有兩個(gè)特點(diǎn),這也是集合操作的要素:
1.對(duì)集合的每個(gè)記錄執(zhí)行相同的操作
UPDATE更新了集合中的所有記錄,這些記錄的 GENDER 字段值都被更新為 FEMALE 。
2.這個(gè)操作的具體行為是用戶指定的
UPDATE通過SET子句,指定更新那些字段,怎么更新。
六、JavaScript中的數(shù)據(jù)集JavaScript中數(shù)組對(duì)象的map方法也是一種集合操作。map方法將一個(gè)數(shù)組的每一個(gè)成員變換為新的成員, 并返回變換后新的集合。
var a=[1,2,3,4]; a.map(function(d){return d*2;}); console.log(a);
上面的JavaScript代碼對(duì)一個(gè)數(shù)組執(zhí)行map方法,將每一個(gè)成員進(jìn)行倍乘。結(jié)果是獲得一個(gè)新的 數(shù)組,比如在這里,將得到[2,4,6,8]。
這個(gè)例子也說明了集合操作的兩個(gè)要素:
1.對(duì)集合的每個(gè)記錄執(zhí)行相同的操作
在map方法執(zhí)行中,每個(gè)數(shù)組成員都被轉(zhuǎn)換為原始值的2倍。
2.這個(gè)操作的具體行為是用戶指定的
map方法使用一個(gè)匿名函數(shù),指定如何對(duì)每一個(gè)原始數(shù)據(jù)進(jìn)行變換。
七、將算法移植到Spark上現(xiàn)在我們修改原始的笨算法,使之適用于Spark:
將數(shù)據(jù)載入并構(gòu)造數(shù)據(jù)集
在Spark中,這個(gè)數(shù)據(jù)集被稱為RDD :彈性分布數(shù)據(jù)集。
對(duì)數(shù)據(jù)集進(jìn)行map操作
指定行為:如果一行原始記錄包含“包租婆”,該行記錄映射為新值1,否則映射為新值0 。
對(duì)map后的數(shù)據(jù)集進(jìn)行collect操作,獲得合并的結(jié)果。
上面的map操作,和前面JavaScript數(shù)組的map方法類似,將原始記錄映射為新的記錄,并返回一個(gè)新的RDD。 collect操作提取RDD中的全部數(shù)據(jù)到本地。
魔術(shù)發(fā)生在RDD上。Spark的RDD自動(dòng)進(jìn)行數(shù)據(jù)的切分和結(jié)果的整合。我們假裝不知道就好了, 就像這一切只發(fā)生在本地的一臺(tái)機(jī)器上。
八、Spark操作符Spark提供了80多種操作符對(duì)集合進(jìn)行操作。我們列舉常用的一些供你建立一點(diǎn)基本概念, 以便了解Spark可以支持什么:
變換
變換操作總是獲得一個(gè)新的RDD:
map(func) : 將原始數(shù)據(jù)集的每一個(gè)記錄使用傳入的函數(shù)func ,映射為一個(gè)新的記錄,并返回新的RDD。
filter(func) : 返回一個(gè)新的RDD,僅包含那些符合條件的記錄,即func返回true 。
flatMap(func) : 和map類似,只是原始記錄的一條可能被映射為新的RDD中的多條。
union(otherDataset) : 合并兩個(gè)RDD,返回一個(gè)新的RDD 。
intersection(otherDataset):返回一個(gè)新的RDD,僅包含兩個(gè)RDD共有的記錄。
動(dòng)作
動(dòng)作操作總是獲得一個(gè)本地?cái)?shù)據(jù),這意味著控制權(quán)回到你的程序了:
reduce(func) : 使用func對(duì)RDD的記錄進(jìn)行聚合。
collect() : 返回RDD中的所有記錄
count() : 返回RDD中的記錄總數(shù)
對(duì)spark中Scala語(yǔ)言快速掃盲、交互分析、RDD動(dòng)作、RDD變換的介紹如下:
http://www.hubwiz.com/course/5449c691e564e50960f1b7a9/
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/35731.html
摘要:點(diǎn)擊訂閱云棲夜讀周刊作為大神,賈揚(yáng)清讓人印象深刻的可能是他寫的框架,那已經(jīng)是六年前的事了。經(jīng)過多年的沉淀,成為阿里新人的他,對(duì)人工智能又有何看法最近,賈揚(yáng)清在阿里內(nèi)部分享了他的思考與洞察,歡迎共同探討交流?!军c(diǎn)擊訂閱云棲夜讀周刊】 作為 AI 大神,賈揚(yáng)清讓人印象深刻的可能是他寫的AI框架Caffe ,那已經(jīng)是六年前的事了。經(jīng)過多年的沉淀,成為阿里新人的他,對(duì)人工智能又有何看法?最近,賈揚(yáng)...
摘要:是中處理結(jié)構(gòu)化數(shù)據(jù)的模塊??梢詮暮芏鄶?shù)據(jù)源加載數(shù)據(jù)并構(gòu)造得到,如結(jié)構(gòu)化數(shù)據(jù)文件,中的表,外部數(shù)據(jù)庫(kù),或者已有的。使用反射機(jī)制,推導(dǎo)包含指定類型對(duì)象的。這一功能應(yīng)該優(yōu)先于使用。隨后,將會(huì)掃描必要的列,并自動(dòng)調(diào)整壓縮比例,以減少內(nèi)存占用和壓力。 Spark SQL是Spark中處理結(jié)構(gòu)化數(shù)據(jù)的模塊。與基礎(chǔ)的Spark RDD API不同,Spark SQL的接口提供了更多關(guān)于數(shù)據(jù)的結(jié)構(gòu)信息...
摘要:以及大數(shù)據(jù)平臺(tái)都已經(jīng)進(jìn)行了集成并且處于企業(yè)就緒狀態(tài)。因此,顧客避免浪費(fèi)時(shí)間在安裝配置及監(jiān)控系統(tǒng)方面。注意防止數(shù)據(jù)頻繁移動(dòng)。 本文源地址:http://www.mongoing.com/blog/post/leaf-in-the-wild-stratio-integrates-apache-spark-and-mongodb-to-unlock-new-customer-insights...
摘要:原文鏈接這些年,你不能錯(cuò)過的學(xué)習(xí)資源寫在前面本系列是綜合了自己在學(xué)習(xí)過程中的理解記錄對(duì)參考文章中的一些理解個(gè)人實(shí)踐過程中的一些心得而來。 原文鏈接:『 Spark 』5. 這些年,你不能錯(cuò)過的 spark 學(xué)習(xí)資源 寫在前面 本系列是綜合了自己在學(xué)習(xí)spark過程中的理解記錄 + 對(duì)參考文章中的一些理解 + 個(gè)人實(shí)踐spark過程中的一些心得而來。寫這樣一個(gè)系列僅僅是為了梳理個(gè)人學(xué)習(xí)s...
閱讀 2796·2023-04-26 01:47
閱讀 3602·2023-04-25 23:45
閱讀 2482·2021-10-13 09:39
閱讀 617·2021-10-09 09:44
閱讀 1808·2021-09-22 15:59
閱讀 2787·2021-09-13 10:33
閱讀 1734·2021-09-03 10:30
閱讀 667·2019-08-30 15:53