中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

淺談分布式計算的開發與實現(一)

發布時間:2020-06-26 16:38:17 來源:網絡 閱讀:1736 作者:Java_老男孩 欄目:編程語言

介紹

分布式計算簡單來說,是把一個大計算任務拆分成多個小計算任務分布到若干臺機器上去計算,然后再進行結果匯總。 目的在于分析計算海量的數據,從雷達監測的海量歷史信號中分析異常信號(外星文明),淘寶雙十一實時計算各地區的消費習慣等。

海量計算最開始的方案是提高單機計算性能,如大型機,后來由于數據的爆發式增長、單機性能卻跟不上,才有分布式計算這種妥協方案。 因為計算一旦拆分,問題會變得非常復雜,像一致性、數據完整、通信、容災、任務調度等問題也都來了。

舉個例子,產品要求從數據庫中100G的用戶購買數據,分析出各地域的消費習慣金額等。 如果沒什么時間要求,程序員小明就寫個對應的業務處理服務程序,部署到服務器上,讓它慢慢跑就是了,小明預計10個小時能處理完。 后面產品嫌太慢,讓小明想辦法加快到3個小時。
平常開發中類似的需求也很多,總結出來就是,數據量大、單機計算慢。 如果上Hadoop、storm之類成本較高、而且有點大才小用。 當然讓老板買更好的服務器配置也是一種辦法。

利用分片算法

小明作為一個有追求有理想的程序員,決定用介于單機計算和成熟計算框架的過度解決方案,這樣成本和需求都能滿足了。 分布式計算的核心在于計算任務拆分,如果數據能以水平拆分的方式,分布到5臺機器上,每臺機器只計算自身的1/5數據,這樣即能在3小時內完成產品需求了。

如上所述,小明需要把這些數據按照一定維度進行劃分。 按需求來看以用戶ID劃分最好,由于用戶之間沒有狀態上的關聯,所以也不需要事務性及二次迭代計算。 小明用簡單的hash取模對id進行劃分。

<pre style="margin:0px;
    padding:0px;
    white-space:pre-wrap;
    overflow-wrap:break-word;
    font-family:"
    Courier New"
    !important;
    font-size:12px !important;
    ">f(memberid) % 5 = ServerN</pre>

這樣程序可以分別部署到5臺機器上,然后程序按照配置只取對應余數的用戶id,計算出結果并入庫。 這種方式多機之間毫無關聯,不需要進行通信,可以避免很多問題。 機器上的程序本身也不具備分布式的特性,它和單機一樣,只計算自身獲取到的數據即可,所以如果某臺機器上程序崩潰的話,處理方式和單機一樣,比如記錄下處理進度,下次從當前進度繼續進行后續計算。

利用消息隊列

使用分片方式相對比較簡單,但有如下不足之處。

  • 它不具有負載均衡的能力,如果某臺機器配置稍好點,它可能最先計算完,然后空閑等待著。也有可能是某些用戶行為數據比較少,導致計算比較快完成。
  • 還有一個弊端就是每臺機器上需要手動更改對應的配置, 這樣的話多臺機器上的程序不是完全一樣的,這樣可以用遠程配置動態修改的辦法來解決。

小明這種方式引入了個第三方,消息隊列。 小明先用一個單獨的程序把用戶信息推送到消息隊列里去,然后各臺機器分別取消費這個隊列。 于是就有了3個角色:

  • 推送消息的,簡稱Master。
  • 消息隊列,這里以Rabbitmq為例。
  • 各個處理程序,簡稱Worker或Slave都行。

雖然僅僅引入了個第三方,但它已經具備了分布式計算的很多特性。

  1. 計算任務分發。 Master把需要計算的用戶數據,不斷的推送消息隊列。
  2. 程序一致性。 Worker訂閱相同的消息隊列即可,無需更改程序代碼。
  3. 任意擴容。 由于程序完全一樣,意味著如果想要加快速度,重復部署一份程序到新機器即可。 當然這是理論上的,實際當中會受限于消息隊列、數據庫存儲等。
  4. 容災性。 如果5臺中某一臺程序掛了也不影響,利用Rabbitmq的消息確認機制,機器崩潰時正在計算的那一條數據會在超時,在其他節點上進行消費處理。

Hadoop簡介

Hadoop介紹已經相當多了,這里簡述下比如:"Hadoop是一套海量數據計算存儲的基礎平臺架構",分析下這句話。

  • 其中計算指的是MapReduce,這是做分布式計算用的。
  • 存儲指的是HDFS,基于此上層的有HBase、Hive,用來做數據存儲用的。
  • 平臺,指可以給多個用戶使用,比如小明有一計算需求,他只需要按照對應的接口編寫業務邏輯即可,然后把程序以包的形式發布到平臺上,平臺進行分配調度計算等。 而上面小明的分布式計算設計只能給自己使用,如果另外有小華要使用就需要重新寫一份,然后單獨部署,申請機器等。Hadoop最大的優勢之一就在于提供了一套這樣的完整解決方案。

下面找了介紹Hadoop的概覽圖,跟小明的設計做對比下:

  • 圖中“大數據計算任務” 對應小明的100G用戶數據的計算任務。
  • ”任務劃分“ 對應Master和消息隊列。
  • “子任務” 對應Worker的業務邏輯。
  • ”結果合并“ 對應把每個worker的計算結果入庫。
  • “計算結果” 對應入庫的用戶消費習慣數據。

淺談分布式計算的開發與實現(一)

PS:為了方便描述,把小明設計的分布式計算,叫做小和尚。

MapReduce

由于MapReduce計算輸入和輸出都是基于HDFS文件,所以大多數公司的做法是把mysql或sqlserver的數據導入到HDFS,計算完后再導出到常規的數據庫中,這是MapReduce不夠靈活的地方之一。 MapReduce優勢在于提供了比較簡單的分布式計算編程模型,使開發此類程序變得非常簡單,像之前的MPI編程就相當復雜。

狹隘的來講,MapReduce是把計算任務給規范化了,它可以等同于小和尚中Worker的業務邏輯部分。 MapReduce把業務邏輯給拆分成2個大部分,Map和Reduce,可以先在Map部分把任務計算一半后,扔給Reduce部分繼續后面的計算。 當然在Map部分把計算任務全做完也是可以的。

如果把小明產品經理的需求放到Hadoop來做,其處理流程大致如下:

  1. 把100G數據導入到HDFS
  2. 按照Mapreduce的接口編寫處理邏輯,分Map、Reduce兩部分。
  3. 把程序包提交到Mapreduce平臺上,存儲在HDFS里。
  4. 平臺中有個叫Jobtracker進程的角色進行分發任務。 這個類似小和尚的Master負載調度管理。
  5. 如果有5臺機器進行計算的話,就會提前運行5個叫TaskTracker的slave進程。 這類似小和尚worker的分離版,平臺把程序和業務邏輯進行分離了, 簡單來說就是在機器上運行個獨立進程,它能動態加載、執行jar或dll的業務邏輯代碼。
  6. Jobtracker把任務分發到TaskTracker后,TaskTracker把開始動態加載jar包,創建個獨立進程執行Map部分,然后把結果寫入到HDFS上。
  7. 如果有Reduce部分,TaskTracker會創建個獨立進程把Map輸出的HDFS文件,通過RPC方式遠程拉取到本地,拉取成功后,Reduce開始計算后續任務。
  8. Reduce再把結果寫入到HDFS中
  9. 從HDFS中把結果導出。

這樣一看好像是把簡單的計算任務給復雜化了,其實如果只有幾臺計算任務的話,使用Mapreduce確實是殺雞用牛刀了。 如果有TB、PB級別的數據、跑在成百上千臺計算節點上,Mapreduce的優勢才會體現出來。 其計算框架圖架構如下:?

淺談分布式計算的開發與實現(一)

離線計算

通常稱Mapreduce及小和尚這種計算為離線計算,因為它對已經持久化的文件數據進行計算,不能實時響應。 還有個原因就是它的處理速度比較慢,它的輸入和輸出源都是基于HDFS設計,如果數據不是一開始就寫入到HDFS上,就會涉及到數據導入導出,這部分相對耗費時間。 而且它的數據流動是基于文件系統的,Map部分輸出的數據不是直接傳送到Reduce部分,而是先寫入HDFS再進行傳送。

處理速度慢也是Mapreduce的不足之處,促使了后面實時計算的誕生。
另外個缺點是Mapreduce的計算任務流比較單一,它只有Map、Reduce兩部分。 簡單的可以只寫一部分邏輯來解決,如果想拆分成多個部分,如邏輯A、邏輯B、邏輯C等, 而且一部分計算邏輯依賴上一次計算結果的話,MapReduce處理起來就比較困難了。 像storm框架解決此類問題的方案,也稱為流式計算,下一章繼續補充。?
淺談分布式計算的開發與實現(一)


文末彩蛋

針對于上面所涉及到的知識點我總結出了有1到5年開發經驗的程序員在面試中涉及到的絕大部分架構面試題及答案做成了文檔和架構視頻資料免費分享給大家(包括Dubbo、Redis、Netty、zookeeper、Spring cloud、分布式、高并發等架構技術資料),希望能幫助到您面試前的復習且找到一個好的工作,也節省大家在網上搜索資料的時間來學習,也可以關注我一下以后會有更多干貨分享。

資料獲取方式 QQ群搜索“708-701-457” 即可免費領取

淺談分布式計算的開發與實現(一)
淺談分布式計算的開發與實現(一)
淺談分布式計算的開發與實現(一)

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

黑河市| 万山特区| 宜宾县| 若尔盖县| 阿拉尔市| 十堰市| 河津市| 甘德县| 海林市| 安陆市| 北辰区| 铅山县| 盐城市| 隆回县| 云南省| 巫溪县| 山阳县| 瓮安县| 屏东县| 久治县| 英德市| 当阳市| 汪清县| 安达市| 体育| 南涧| 大新县| 株洲县| 玉田县| 丹巴县| 日照市| 印江| 建瓯市| 久治县| 内黄县| 翁牛特旗| 哈密市| 调兵山市| 原阳县| 贡觉县| 大化|