99999久久久久久亚洲,欧美人与禽猛交狂配,高清日韩av在线影院,一个人在线高清免费观看,啦啦啦在线视频免费观看www

熱線電話:13121318867

登錄
首頁(yè)精彩閱讀Spark一種快速數(shù)據(jù)分析替代方案
Spark一種快速數(shù)據(jù)分析替代方案
2018-07-20
收藏

Spark一種快速數(shù)據(jù)分析替代方案

Spark 是一種與 Hadoop 相似的開(kāi)源集群計(jì)算環(huán)境,但是兩者之間還存在一些不同之處,這些有用的不同之處使 Spark 在某些工作負(fù)載方面表現(xiàn)得更加優(yōu)越,換句話說(shuō),Spark 啟用了內(nèi)存分布數(shù)據(jù)集,除了能夠提供交互式查詢外,它還可以優(yōu)化迭代工作負(fù)載。
Spark 是在 Scala 語(yǔ)言中實(shí)現(xiàn)的,它將 Scala 用作其應(yīng)用程序框架。與 Hadoop 不同,Spark 和 Scala 能夠緊密集成,其中的 Scala 可以像操作本地集合對(duì)象一樣輕松地操作分布式數(shù)據(jù)集。

盡管創(chuàng)建 Spark 是為了支持分布式數(shù)據(jù)集上的迭代作業(yè),但是實(shí)際上它是對(duì) Hadoop 的補(bǔ)充,可以在 Hadoo 文件系統(tǒng)中并行運(yùn)行。通過(guò)名為 Mesos 的第三方集群框架可以支持此行為。Spark 由加州大學(xué)伯克利分校 AMP 實(shí)驗(yàn)室 (Algorithms, Machines, and People Lab) 開(kāi)發(fā),可用來(lái)構(gòu)建大型的、低延遲的數(shù)據(jù)分析應(yīng)用程序。
Spark 集群計(jì)算架構(gòu)
雖然 Spark 與 Hadoop 有相似之處,但它提供了具有有用差異的一個(gè)新的集群計(jì)算框架。首先,Spark 是為集群計(jì)算中的特定類(lèi)型的工作負(fù)載而設(shè)計(jì),即那些在并行操作之間重用工作數(shù)據(jù)集(比如機(jī)器學(xué)習(xí)算法)的工作負(fù)載。為了優(yōu)化這些類(lèi)型的工作負(fù)載,Spark 引進(jìn)了內(nèi)存集群計(jì)算的概念,可在內(nèi)存集群計(jì)算中將數(shù)據(jù)集緩存在內(nèi)存中,以縮短訪問(wèn)延遲。
Spark 還引進(jìn)了名為 彈性分布式數(shù)據(jù)集 (RDD) 的抽象。RDD 是分布在一組節(jié)點(diǎn)中的只讀對(duì)象集合。這些集合是彈性的,如果數(shù)據(jù)集一部分丟失,則可以對(duì)它們進(jìn)行重建。重建部分?jǐn)?shù)據(jù)集的過(guò)程依賴于容錯(cuò)機(jī)制,該機(jī)制可以維護(hù) “血統(tǒng)”(即充許基于數(shù)據(jù)衍生過(guò)程重建部分?jǐn)?shù)據(jù)集的信息)。RDD 被表示為一個(gè) Scala 對(duì)象,并且可以從文件中創(chuàng)建它;一個(gè)并行化的切片(遍布于節(jié)點(diǎn)之間);另一個(gè) RDD 的轉(zhuǎn)換形式;并且最終會(huì)徹底改變現(xiàn)有 RDD 的持久性,比如請(qǐng)求緩存在內(nèi)存中。
Spark 中的應(yīng)用程序稱為驅(qū)動(dòng)程序,這些驅(qū)動(dòng)程序可實(shí)現(xiàn)在單一節(jié)點(diǎn)上執(zhí)行的操作或在一組節(jié)點(diǎn)上并行執(zhí)行的操作。與 Hadoop 類(lèi)似,Spark 支持單節(jié)點(diǎn)集群或多節(jié)點(diǎn)集群。對(duì)于多節(jié)點(diǎn)操作,Spark 依賴于 Mesos 集群管理器。Mesos 為分布式應(yīng)用程序的資源共享和隔離提供了一個(gè)有效平臺(tái)(參見(jiàn) 圖 1)。該設(shè)置充許 Spark 與 Hadoop 共存于節(jié)點(diǎn)的一個(gè)共享池中。
圖 1. Spark 依賴于 Mesos 集群管理器實(shí)現(xiàn)資源共享和隔離。

Spark 編程模式
驅(qū)動(dòng)程序可以在數(shù)據(jù)集上執(zhí)行兩種類(lèi)型的操作:動(dòng)作和轉(zhuǎn)換。動(dòng)作 會(huì)在數(shù)據(jù)集上執(zhí)行一個(gè)計(jì)算,并向驅(qū)動(dòng)程序返回一個(gè)值;而轉(zhuǎn)換 會(huì)從現(xiàn)有數(shù)據(jù)集中創(chuàng)建一個(gè)新的數(shù)據(jù)集。動(dòng)作的示例包括執(zhí)行一個(gè) Reduce 操作(使用函數(shù))以及在數(shù)據(jù)集上進(jìn)行迭代(在每個(gè)元素上運(yùn)行一個(gè)函數(shù),類(lèi)似于 Map 操作)。轉(zhuǎn)換示例包括 Map 操作和 Cache 操作(它請(qǐng)求新的數(shù)據(jù)集存儲(chǔ)在內(nèi)存中)。
我們隨后就會(huì)看看這兩個(gè)操作的示例,但是,讓我們先來(lái)了解一下 Scala 語(yǔ)言。
Scala 簡(jiǎn)介
Scala 可能是 Internet 上不為人知的秘密之一。您可以在一些最繁忙的 Internet 網(wǎng)站(如 Twitter、LinkedIn 和 Foursquare,F(xiàn)oursquare 使用了名為 Lift 的 Web 應(yīng)用程序框架)的制作過(guò)程中看到 Scala 的身影。還有證據(jù)表明,許多金融機(jī)構(gòu)已開(kāi)始關(guān)注 Scala 的性能(比如 EDF Trading 公司將 Scala 用于衍生產(chǎn)品定價(jià))。
Scala 是一種多范式語(yǔ)言,它以一種流暢的、讓人感到舒服的方法支持與命令式、函數(shù)式和面向?qū)ο蟮恼Z(yǔ)言相關(guān)的語(yǔ)言特性。從面向?qū)ο蟮慕嵌葋?lái)看,Scala 中的每個(gè)值都是一個(gè)對(duì)象。同樣,從函數(shù)觀點(diǎn)來(lái)看,每個(gè)函數(shù)都是一個(gè)值。Scala 也是屬于靜態(tài)類(lèi)型,它有一個(gè)既有表現(xiàn)力又很安全的類(lèi)型系統(tǒng)。
此外,Scala 是一種虛擬機(jī) (VM) 語(yǔ)言,并且可以通過(guò) Scala 編譯器生成的字節(jié)碼,直接運(yùn)行在使用 Java Runtime Environment V2 的 Java? Virtual Machine (JVM) 上。該設(shè)置充許 Scala 運(yùn)行在運(yùn)行 JVM 的任何地方(要求一個(gè)額外的 Scala 運(yùn)行時(shí)庫(kù))。它還充許 Scala 利用大量現(xiàn)存的 Java 庫(kù)以及現(xiàn)有的 Java 代碼。
最后,Scala 具有可擴(kuò)展性。該語(yǔ)言(它實(shí)際上代表了可擴(kuò)展語(yǔ)言)被定義為可直接集成到語(yǔ)言中的簡(jiǎn)單擴(kuò)展。
Scala 的起源
Scala 語(yǔ)言由 Ecole Polytechnique Federale de Lausanne(瑞士洛桑市的兩所瑞士聯(lián)邦理工學(xué)院之一)開(kāi)發(fā)。它是 Martin Odersky 在開(kāi)發(fā)了名為 Funnel 的編程語(yǔ)言之后設(shè)計(jì)的,F(xiàn)unnel 集成了函數(shù)編程和 Petri net 中的創(chuàng)意。在 2011 年,Scala 設(shè)計(jì)團(tuán)隊(duì)從歐洲研究委員會(huì) (European Research Council) 那里獲得了 5 年的研究經(jīng)費(fèi),然后他們成立新公司 Typesafe,從商業(yè)上支持 Scala,接收籌款開(kāi)始相應(yīng)的運(yùn)作。
舉例說(shuō)明 Scala
讓我們來(lái)看一些實(shí)際的 Scala 語(yǔ)言示例。Scala 提供自身的解釋器,充許您以交互方式試用該語(yǔ)言。Scala 的有用處理已超出本文所涉及的范圍,但是您可以在 參考資料 中找到更多相關(guān)信息的鏈接。
清單 1 通過(guò) Scala 自身提供的解釋器開(kāi)始了快速了解 Scala 語(yǔ)言之旅。啟用 Scala 后,系統(tǒng)會(huì)給出提示,通過(guò)該提示,您可以以交互方式評(píng)估表達(dá)式和程序。我們首先創(chuàng)建了兩個(gè)變量,一個(gè)是不可變變量(即 vals,稱作單賦值),另一個(gè)變量是可變變量 (vars)。注意,當(dāng)您試圖更改 b(您的 var)時(shí),您可以成功地執(zhí)行此操作,但是,當(dāng)您試圖更改 val 時(shí),則會(huì)返回一個(gè)錯(cuò)誤。
清單 1. Scala 中的簡(jiǎn)單變量
$ scalaWelcome to Scala version 2.8.1.final (OpenJDK Client VM, Java 1.6.0_20).
Type in expressions to have them evaluated.
Type :help for more information.
 
scala> val a = 1a: Int = 1
 
scala> var b = 2b: Int = 2
 
scala> b = b + ab: Int = 3
 
scala> a = 26: error: reassignment to val
       a = 2
         ^
接下來(lái),創(chuàng)建一個(gè)簡(jiǎn)單的方法來(lái)計(jì)算和返回 Int 的平方值。在 Scala 中定義一個(gè)方法得先從def 開(kāi)始,后跟方法名稱和參數(shù)列表,然后,要將它設(shè)置為語(yǔ)句的數(shù)量(在本示例中為 1)。無(wú)需指定任何返回值,因?yàn)榭梢詮姆椒ū旧硗茢喑鲈撝怠W⒁?,這類(lèi)似于為變量賦值。在一個(gè)名為 3的對(duì)象和一個(gè)名為 res0 的結(jié)果變量(Scala 解釋器會(huì)自動(dòng)為您創(chuàng)建該變量)上,我演示了這個(gè)過(guò)程。這些都顯示在 清單 2 中。
清單 2. Scala 中的一個(gè)簡(jiǎn)單方法

scala> def square(x: Int) = x*xsquare: (x: Int)Int
 
scala> square(3)res0: Int = 9

scala> square(res0)res1: Int = 81

接下來(lái),讓我們看一下 Scala 中的一個(gè)簡(jiǎn)單類(lèi)的構(gòu)建過(guò)程(參見(jiàn) 清單 3)。定義一個(gè)簡(jiǎn)單的Dog 類(lèi)來(lái)接收一個(gè) String 參數(shù)(您的名稱構(gòu)造函數(shù))。注意,這里的類(lèi)直接采用了該參數(shù)(無(wú)需在類(lèi)的正文中定義類(lèi)參數(shù))。還有一個(gè)定義該參數(shù)的方法,可在調(diào)用參數(shù)時(shí)發(fā)送一個(gè)字符串。您要?jiǎng)?chuàng)建一個(gè)新的類(lèi)實(shí)例,然后調(diào)用您的方法。注意,解釋器會(huì)插入一些豎線:它們不屬于代碼。
清單 3. Scala 中的一個(gè)簡(jiǎn)單的類(lèi)

scala> class Dog( name: String ) {
     |   def bark() = println(name + " barked")
     | }defined class Dog
 
scala> val stubby = new Dog("Stubby")stubby: Dog = Dog@1dd5a3d
 
scala> stubby.barkStubby barked
 
scala>
完成上述操作后,只需輸入 :quit 即可退出 Scala 解釋器。


數(shù)據(jù)分析咨詢請(qǐng)掃描二維碼

若不方便掃碼,搜微信號(hào):CDAshujufenxi

數(shù)據(jù)分析師資訊
更多

OK
客服在線
立即咨詢
客服在線
立即咨詢
') } function initGt() { var handler = function (captchaObj) { captchaObj.appendTo('#captcha'); captchaObj.onReady(function () { $("#wait").hide(); }).onSuccess(function(){ $('.getcheckcode').removeClass('dis'); $('.getcheckcode').trigger('click'); }); window.captchaObj = captchaObj; }; $('#captcha').show(); $.ajax({ url: "/login/gtstart?t=" + (new Date()).getTime(), // 加隨機(jī)數(shù)防止緩存 type: "get", dataType: "json", success: function (data) { $('#text').hide(); $('#wait').show(); // 調(diào)用 initGeetest 進(jìn)行初始化 // 參數(shù)1:配置參數(shù) // 參數(shù)2:回調(diào),回調(diào)的第一個(gè)參數(shù)驗(yàn)證碼對(duì)象,之后可以使用它調(diào)用相應(yīng)的接口 initGeetest({ // 以下 4 個(gè)配置參數(shù)為必須,不能缺少 gt: data.gt, challenge: data.challenge, offline: !data.success, // 表示用戶后臺(tái)檢測(cè)極驗(yàn)服務(wù)器是否宕機(jī) new_captcha: data.new_captcha, // 用于宕機(jī)時(shí)表示是新驗(yàn)證碼的宕機(jī) product: "float", // 產(chǎn)品形式,包括:float,popup width: "280px", https: true // 更多配置參數(shù)說(shuō)明請(qǐng)參見(jiàn):http://docs.geetest.com/install/client/web-front/ }, handler); } }); } function codeCutdown() { if(_wait == 0){ //倒計(jì)時(shí)完成 $(".getcheckcode").removeClass('dis').html("重新獲取"); }else{ $(".getcheckcode").addClass('dis').html("重新獲取("+_wait+"s)"); _wait--; setTimeout(function () { codeCutdown(); },1000); } } function inputValidate(ele,telInput) { var oInput = ele; var inputVal = oInput.val(); var oType = ele.attr('data-type'); var oEtag = $('#etag').val(); var oErr = oInput.closest('.form_box').next('.err_txt'); var empTxt = '請(qǐng)輸入'+oInput.attr('placeholder')+'!'; var errTxt = '請(qǐng)輸入正確的'+oInput.attr('placeholder')+'!'; var pattern; if(inputVal==""){ if(!telInput){ errFun(oErr,empTxt); } return false; }else { switch (oType){ case 'login_mobile': pattern = /^1[3456789]\d{9}$/; if(inputVal.length==11) { $.ajax({ url: '/login/checkmobile', type: "post", dataType: "json", data: { mobile: inputVal, etag: oEtag, page_ur: window.location.href, page_referer: document.referrer }, success: function (data) { } }); } break; case 'login_yzm': pattern = /^\d{6}$/; break; } if(oType=='login_mobile'){ } if(!!validateFun(pattern,inputVal)){ errFun(oErr,'') if(telInput){ $('.getcheckcode').removeClass('dis'); } }else { if(!telInput) { errFun(oErr, errTxt); }else { $('.getcheckcode').addClass('dis'); } return false; } } return true; } function errFun(obj,msg) { obj.html(msg); if(msg==''){ $('.login_submit').removeClass('dis'); }else { $('.login_submit').addClass('dis'); } } function validateFun(pat,val) { return pat.test(val); }