摘要:關(guān)于三者的一些概括總結(jié)離線分析框架,適合離線的復(fù)雜的大數(shù)據(jù)處理內(nèi)存計(jì)算框架,適合在線離線快速的大數(shù)據(jù)處理流式計(jì)算框架,適合在線的實(shí)時(shí)的大數(shù)據(jù)處理我是一個(gè)以架構(gòu)師為年之內(nèi)目標(biāo)的小小白。
整理自《架構(gòu)解密從分布式到微服務(wù)》第七章——聊聊分布式計(jì)算.做了相應(yīng)補(bǔ)充和修改。
[TOC]
前言不管是網(wǎng)絡(luò)、內(nèi)存、還是存儲(chǔ)的分布式,它們最終目的都是為了實(shí)現(xiàn)計(jì)算的分布式:數(shù)據(jù)在各個(gè)計(jì)算機(jī)節(jié)點(diǎn)上流動(dòng),同時(shí)各個(gè)計(jì)算機(jī)節(jié)點(diǎn)都能以某種方式訪問(wèn)共享數(shù)據(jù),最終分布式計(jì)算后的輸出結(jié)果被持久化存儲(chǔ)和輸出。 分布式作為分布式系統(tǒng)里最重要的一個(gè)能力和目標(biāo),也是大數(shù)據(jù)系統(tǒng)的關(guān)技術(shù)之一。經(jīng)過(guò)多年的發(fā)展與演進(jìn),目前業(yè)界已經(jīng)存在很多成熟的分布式計(jì)算相關(guān)的開(kāi)源編程框架和平臺(tái)供我們選擇。
一 不得不說(shuō)的Actor模型 1.1 Actor模型的誕生與發(fā)展Carl Hewitt于1970年發(fā)明Actor模型,當(dāng)時(shí)Actor模型的概念遠(yuǎn)遠(yuǎn)領(lǐng)先于那個(gè)時(shí)代,知道Erlang這樣基于Actor模型設(shè)計(jì)的面向并發(fā)編程的新語(yǔ)言橫空出世之后,Actor模型才真真火了起來(lái)。
1.2 Actor模型是什么?Actor是計(jì)算機(jī)科學(xué)領(lǐng)域中的一個(gè)并行計(jì)算模型,它把Actor當(dāng)做通用的并行計(jì)算原語(yǔ):一個(gè)Actor對(duì)接收到的消息做出響應(yīng),進(jìn)行本地決策,可以創(chuàng)建更多的Actor(子Actor),或者發(fā)送更多的消息;同時(shí)準(zhǔn)備接收下一條消息。
在Actor理論中,一切都被認(rèn)為是Actor,這和面向?qū)ο笳Z(yǔ)言里一切都被看成對(duì)象很類(lèi)似。但包括面向?qū)ο笳Z(yǔ)言在內(nèi)的軟件通常是順序執(zhí)行的,而Actor模型本質(zhì)上則是并發(fā)的。Actor之間僅通過(guò)發(fā)送消息進(jìn)行通信,所有的操作都是異步的,不同的Actor可以同時(shí)處理各自的信息,使整個(gè)系統(tǒng)獲得大規(guī)模的并發(fā)能力。
1.3 Actor模型原理簡(jiǎn)單介紹Actor模型簡(jiǎn)單原理圖:
根據(jù)上圖,每個(gè)Actor都有一個(gè)Mailbox(郵箱),Actor A 發(fā)送給消息給Actor B,就好像Actor A 給Actor B寫(xiě)了一封郵箱地址為Actor B的郵箱地址的郵件(消息)一樣,隨后平臺(tái)負(fù)責(zé)投遞郵件。當(dāng)郵件Actor B之后,平臺(tái)就會(huì)通知Actor B收取郵件并做出回復(fù),如果有多封郵件,則Actor B按順序處理。很簡(jiǎn)單和容易理解的技術(shù),但是蘊(yùn)含了強(qiáng)大的力量。Actor B收到消息后可能會(huì)做那些處理呢?
創(chuàng)建其他Actor
向其他Actor發(fā)送消息
指定下一條消息到來(lái)的行為,比如修改自己的狀態(tài)
在什么情況下一個(gè)Actor會(huì)創(chuàng)建子Actor呢?
通常情況是為了并行計(jì)算,比如我們有10G的文件要分析處理,我們可以在根Actor里創(chuàng)建10個(gè)子Actor,讓每個(gè)Actor分別處理一個(gè)文件,為此根Actor給每個(gè)子Actor發(fā)送一個(gè)消息,消息里包含分配給它的的文件編號(hào)(或位置),當(dāng)子Actor完成處理后,就把處理好的結(jié)果封裝為應(yīng)答消息返回給根Actor,然后根Actor在進(jìn)行最后的匯總與輸出,下面是這個(gè)過(guò)程的示意圖。
一個(gè)Actor與其所創(chuàng)建的Actor形成父子關(guān)系。在實(shí)際編程中,父Actor應(yīng)該監(jiān)督其所創(chuàng)建的子Actor的狀態(tài),原因是父Actor知道可能會(huì)出現(xiàn)那些失敗情況,知道如何處理他們,比如重新產(chǎn)生一個(gè)新的子Actor 來(lái)重做失敗的任務(wù),或者某個(gè)Actor失敗后就通知其他Actor終止任務(wù)。
1.4 Actor模型的優(yōu)缺點(diǎn)通過(guò)上面對(duì)Actor模型原理的簡(jiǎn)單分析,我們來(lái)總結(jié)一下Actor模型的優(yōu)缺點(diǎn)。
優(yōu)點(diǎn):
1)將消息收發(fā)、線程調(diào)度、處理競(jìng)爭(zhēng)和同步的所有復(fù)雜邏輯都委托給了Actor框架本身,而且對(duì)應(yīng)用來(lái)說(shuō)是透明的,我們可以認(rèn)為Actor只是一個(gè)實(shí)現(xiàn)了Runnable接口的對(duì)象。關(guān)注多線程并發(fā)問(wèn)題時(shí),只需要關(guān)注多個(gè)Actor之間的消息流即可。
2)符合Actor模型的程序很容易進(jìn)行測(cè)試,因?yàn)槿我庖粋€(gè)Actor都可以被多帶帶進(jìn)行單元測(cè)試。如果測(cè)試案例覆蓋了該Actor所能響應(yīng)的所有類(lèi)型的消息,我們就可以確定該Actor的代碼十分可靠。
缺點(diǎn):
1) Actor完全避免共享并且僅通過(guò)消息來(lái)進(jìn)行交流,使得程序失去了精細(xì)化并發(fā)調(diào)控能力,所以不適合實(shí)施細(xì)粒度的并行且可能導(dǎo)致系統(tǒng)響應(yīng)時(shí)延的增加。如果在Actor程序中引入一些并行框架,就可能會(huì)導(dǎo)致系統(tǒng)的不確定性。二 初始AKKA 2.1 AKKA簡(jiǎn)介
2)盡管使用Actor模型的程序 比使用線程和鎖模型的程序更容易調(diào)試,Actor模型仍會(huì)碰到死鎖這一類(lèi)的共性問(wèn)題,也會(huì)碰到一些Actor模型獨(dú)有的問(wèn)題(例如信箱移溢出)。
Akka 是一個(gè)用 Scala 編寫(xiě)的庫(kù),用于簡(jiǎn)化編寫(xiě)容錯(cuò)的、高可伸縮性的 Java 和 Scala 的 Actor 模型應(yīng)用。它已經(jīng)成功運(yùn)用在電信行業(yè)。系統(tǒng)幾乎不會(huì)宕機(jī)(高可用性 99.9999999 % 一年只有 31 ms 宕機(jī))。
Akka雖然是Scala寫(xiě)成的,但是由于Scala最終還是編譯為Java字節(jié)碼運(yùn)行在JVM上,所以我們可以認(rèn)為Akka屬于Java領(lǐng)域。
Akka處理并發(fā)的方法基于Actor模型。在Akka里,Actor之間通信的唯一機(jī)制就是消息傳遞。
Akka官方宣傳是這樣介紹Akka的:
是對(duì)并發(fā)、并行程序的簡(jiǎn)單的高級(jí)別的抽象
是異步、非阻塞、高性能的事件驅(qū)動(dòng)編程模型
是非常輕量級(jí)的事件驅(qū)動(dòng)處理(1GB內(nèi)存可容納約270萬(wàn)個(gè)actors)
2.2 為什么要用Akka?Akka是一個(gè)運(yùn)行時(shí)與編程模型一致的系統(tǒng),為以下目標(biāo)設(shè)計(jì):
垂直擴(kuò)展(并發(fā))
水平擴(kuò)展(遠(yuǎn)程調(diào)用)
高容錯(cuò)
使用Akka帶來(lái)的好處:
AKKA提供一種Actor并發(fā)模型,其粒度比線程小很多,這意味著你可以在項(xiàng)目中使用大量的Actor。
Akka提供了一套容錯(cuò)機(jī)制,允許在Actor出錯(cuò)時(shí)進(jìn)行一些恢復(fù)或者重置操作
AKKA不僅可以在單機(jī)上構(gòu)建高并發(fā)程序,也可以在網(wǎng)絡(luò)中構(gòu)建分布式程序,并提供位置透明的Actor定位服務(wù)
三 使用面很廣的Storm與前面提到的Actor面向消息的分布式計(jì)算式模型不同,Apache Storm提供的是面向連續(xù)的消息流(Stream)的一種通用的分布式計(jì)算解決框架。2.1 Storm簡(jiǎn)介
Apache Storm是一種側(cè)重于極低延遲的流處理框架,也是要求近實(shí)時(shí)處理的工作負(fù)載的最佳選擇。該技術(shù)可處理非常大量的數(shù)據(jù),通過(guò)比其他解決方案更低的延遲提供結(jié)果。
Storm作為實(shí)時(shí)流式計(jì)算中的佼佼者,因其良好的特性使其使用場(chǎng)景非常廣泛。
Zookeeper作為分布式協(xié)調(diào)服務(wù)框架,因其完善的數(shù)據(jù)一致性保證特性使其成為各框架必備組件。
1)日志處理: 監(jiān)控系統(tǒng)中的事件日志,使用 Storm 檢查每條日志信息,把符合匹配規(guī)則的消息保存到數(shù)據(jù)庫(kù)。
2)電商商品推薦: 后臺(tái)需要維護(hù)每個(gè)用戶(hù)的興趣點(diǎn),主要基于用戶(hù)的歷史行為、查詢(xún)、點(diǎn)擊、地理信息等信息獲得,其中有很多實(shí)時(shí)數(shù)據(jù),可以使用 Storm 進(jìn)行處理,在此基礎(chǔ)上進(jìn)行精準(zhǔn)的商品推薦和放置廣告。
Hadoop 是強(qiáng)大的大數(shù)據(jù)處理系統(tǒng),但是在實(shí)時(shí)計(jì)算方面不夠擅長(zhǎng);Storm的核心功能就是提供強(qiáng)大的實(shí)時(shí)處理能力,但沒(méi)有涉及存儲(chǔ);所以 Storm 與 Hadoop 即不同也互補(bǔ)。
Storm與Hadoop應(yīng)用場(chǎng)景對(duì)比:
Storm: 分布式實(shí)時(shí)計(jì)算,強(qiáng)調(diào)實(shí)時(shí)性,常用于實(shí)時(shí)性要求較高的地方三 MapReduce及其引發(fā)的新世界 3.1 MapReduce簡(jiǎn)單介紹
Hadoop:分布式批處理計(jì)算,強(qiáng)調(diào)批處理,常用于對(duì)已經(jīng)在的大量數(shù)據(jù)挖掘、分析
與前面介紹的Actor模型一樣,MapReduce本質(zhì)上也是一種很古老的并行計(jì)算模型,它的名字起源于LISP類(lèi)函數(shù)式語(yǔ)言里的map和reduce操作。MapReduce的計(jì)算模型非常簡(jiǎn)單,它的思想就是“分而治之”,Mapper負(fù)責(zé)“分”,即把復(fù)雜的大任務(wù)分解為若干個(gè)小任務(wù)來(lái)處理,彼此之間沒(méi)有依賴(lài)關(guān)系,以便可以分布到多個(gè)計(jì)算節(jié)點(diǎn)上實(shí)現(xiàn)高度的并行計(jì)算能力;Reducer則負(fù)責(zé)對(duì)map階段的結(jié)果進(jìn)行匯總和輸出。
我們通過(guò)一個(gè)最簡(jiǎn)單的統(tǒng)計(jì)詞頻的案例看一下,MapReduce的簡(jiǎn)單原理:
Hadoop傳統(tǒng)意義上就是離線數(shù)據(jù)處理平臺(tái)。但是2.0之后就不一樣了,因?yàn)槎嗔藋arn資源管理器(可能是收到了分布式資源調(diào)度系統(tǒng)Mesos的啟發(fā)),Spark和Storm都可以搭建在Hadoop之上,用yarn進(jìn)行調(diào)度。這是大數(shù)據(jù)處理中目前最流行的三個(gè)計(jì)算框架。
Mapreduce: 適用于離線計(jì)算。這個(gè)框架充分利用了磁盤(pán),處處存在著排序和合并。所以適合于實(shí)時(shí)性不高的離線計(jì)算。
Spark: 相對(duì)于Hadoop的MapReduce會(huì)在運(yùn)行完工作后將中介數(shù)據(jù)存放到磁盤(pán)中,Spark使用了存儲(chǔ)器內(nèi)運(yùn)算技術(shù),能在數(shù)據(jù)尚未寫(xiě)入硬盤(pán)時(shí)即在存儲(chǔ)器內(nèi)分析運(yùn)算。Spark在存儲(chǔ)器內(nèi)運(yùn)行程序的運(yùn)算速度能做到比Hadoop MapReduce的運(yùn)算速度快上100倍,即便是運(yùn)行程序于硬盤(pán)時(shí),Spark也能快上10倍速度。Spark允許用戶(hù)將數(shù)據(jù)加載至集群存儲(chǔ)器,并多次對(duì)其進(jìn)行查詢(xún),非常適合用于機(jī)器學(xué)習(xí)算法。
Storm: 一種側(cè)重于極低延遲的流處理框架,也是要求近實(shí)時(shí)處理的工作負(fù)載的最佳選擇。該技術(shù)可處理非常大量的數(shù)據(jù),通過(guò)比其他解決方案更低的延遲提供結(jié)果。
關(guān)于三者的一些概括總結(jié)Hadoop: 離線分析框架,適合離線的復(fù)雜的大數(shù)據(jù)處理
Spark:內(nèi)存計(jì)算框架,適合在線、離線快速的大數(shù)據(jù)處理
Storm: 流式計(jì)算框架,適合在線的實(shí)時(shí)的大數(shù)據(jù)處理
我是Snailclimb,一個(gè)以架構(gòu)師為5年之內(nèi)目標(biāo)的小小白。 歡迎關(guān)注我的微信公眾號(hào):"Java面試通關(guān)手冊(cè)"(一個(gè)有溫度的微信公眾號(hào),期待與你共同進(jìn)步~~~堅(jiān)持原創(chuàng),分享美文,分享各種Java學(xué)習(xí)資源)
最后,就是使用阿里云服務(wù)器一段時(shí)間后,感覺(jué)阿里云真的很不錯(cuò),就申請(qǐng)做了阿里云大使,然后這是我的優(yōu)惠券地址.
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/11882.html
閱讀 1607·2021-11-23 09:51
閱讀 1177·2019-08-30 13:57
閱讀 2256·2019-08-29 13:12
閱讀 2011·2019-08-26 13:57
閱讀 1192·2019-08-26 11:32
閱讀 978·2019-08-23 15:08
閱讀 699·2019-08-23 14:42
閱讀 3079·2019-08-23 11:41