ApacheIgnite有什么用

這篇文章主要介紹“Apache Ignite有什么用”,在日常操作中,相信很多人在Apache Ignite有什么用問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Apache Ignite有什么用”的疑惑有所幫助!接下來,請跟著小編一起來學(xué)習(xí)吧!

創(chuàng)新互聯(lián)公司網(wǎng)站建設(shè)公司一直秉承“誠信做人,踏實(shí)做事”的原則,不欺瞞客戶,是我們最起碼的底線! 以服務(wù)為基礎(chǔ),以質(zhì)量求生存,以技術(shù)求發(fā)展,成交一個(gè)客戶多一個(gè)朋友!專注中小微企業(yè)官網(wǎng)定制,成都做網(wǎng)站、成都網(wǎng)站建設(shè),塑造企業(yè)網(wǎng)絡(luò)形象打造互聯(lián)網(wǎng)企業(yè)效應(yīng)。

1.傳統(tǒng)的方案

在各行各業(yè)中,批量業(yè)務(wù)處理都是常規(guī)需求,非常常見。它的特點(diǎn)是,離線處理、運(yùn)行時(shí)間長、計(jì)算密集。傳統(tǒng)的解決方式是,或者使用多線程技術(shù),或者使用數(shù)據(jù)庫計(jì)算,比如調(diào)用數(shù)據(jù)庫的存儲(chǔ)過程技術(shù)實(shí)現(xiàn)等等。 在以Hadoop為首的分布式計(jì)算技術(shù)出現(xiàn)后,情況有了很大的變化,MapReduce范式為大規(guī)模離線數(shù)據(jù)處理提供了新的思路,性能得到了很大的提升,也提供了很好的線性擴(kuò)展解決方案。

2.面臨的問題

多線程或者類似于存儲(chǔ)過程這樣的技術(shù),共有的缺陷是,擴(kuò)展性差,性能依賴于單一硬件性能,大幅提升性能困難,無法實(shí)現(xiàn)分布式計(jì)算。 而以Hadoop為首的大數(shù)據(jù)處理解決方案,近段時(shí)間發(fā)展迅速,性能指標(biāo)也在不斷地提升,但是設(shè)計(jì)的目標(biāo),或者說適用的場景,主要還是在互聯(lián)網(wǎng)的大規(guī)模非結(jié)構(gòu)化數(shù)據(jù)的分析業(yè)務(wù)上,雖然也可以用于傳統(tǒng)的批量業(yè)務(wù)處理,但是一方面批量業(yè)務(wù)處理并不需要那么多的功能,殺雞用了牛刀;另一方面,這些新一代的計(jì)算平臺(tái)屬于異構(gòu)系統(tǒng),需要在具體應(yīng)用之外單獨(dú)部署,如果要實(shí)現(xiàn)高可用,整體的架構(gòu)也會(huì)變得非常復(fù)雜,整體的運(yùn)維成本也會(huì)上升,增加了對應(yīng)的服務(wù)器之后,如果計(jì)算不多,資源利用率也會(huì)下降,采用這樣技術(shù)的投入產(chǎn)出比,是需要考慮的。

3.Ignite計(jì)算網(wǎng)格

Ignite計(jì)算網(wǎng)格實(shí)現(xiàn)了分布式的閉包和ExecutorService,同時(shí)它還提供了一個(gè)輕量級的MapReduce(或ForkJoin)實(shí)現(xiàn)。 本文重點(diǎn)講一下輕量級MapReduce,其它的可以參照相關(guān)的手冊。

3.1.MapReduce和ForkJoin

ComputeTask接口是Ignite的簡化版內(nèi)存MapReduce的抽象,它也非常接近于ForkJoin范式。這個(gè)接口可以對作業(yè)到節(jié)點(diǎn)的映射做細(xì)粒度的控制以及定制故障轉(zhuǎn)移的策略,如果不需要這些,可以使用更簡單的分布式閉包實(shí)現(xiàn),代碼將會(huì)更加精煉。

3.1.1.ComputeTask

ComputeTask定義了要在集群內(nèi)執(zhí)行的作業(yè)以及這些作業(yè)到節(jié)點(diǎn)的映射,它還定義了如何處理作業(yè)的返回值(Reduce)。所有的IgniteCompute.execute(...)方法都會(huì)在集群上執(zhí)行給定的任務(wù),應(yīng)用只需要實(shí)現(xiàn)ComputeTask接口的map(...)reduce(...)方法即可,其中:

  • map(...)方法負(fù)責(zé)將作業(yè)實(shí)例化然后將它們映射到工作節(jié)點(diǎn),這個(gè)過程通過ComputeTaskSplitAdapter,還可以進(jìn)一步簡化;

  • result(...)方法在每次作業(yè)在集群節(jié)點(diǎn)上執(zhí)行時(shí)都會(huì)被調(diào)用,它接收計(jì)算作業(yè)返回的結(jié)果,以及迄今為止收到的作業(yè)結(jié)果的列表,該方法會(huì)返回一個(gè)ComputeJobResultPolicy的實(shí)例,說明下一步要做什么;

  • 當(dāng)所有作業(yè)完成后,reduce(...)方法在Reduce階段被調(diào)用。該方法接收到所有計(jì)算結(jié)果的一個(gè)列表然后返回一個(gè)最終的計(jì)算結(jié)果。

3.1.2.更簡單的適配器ComputeTaskSplitAdapter

定義計(jì)算時(shí)每次都實(shí)現(xiàn)ComputeTask的所有三個(gè)方法并不是必須的,通過Ignite提供的適配器,可以進(jìn)一步簡化開發(fā),我著重介紹下ComputeTaskSplitAdapter,它增加了將作業(yè)自動(dòng)分配給節(jié)點(diǎn)的功能。它隱藏了map(...)方法然后增加了一個(gè)新的split(...)方法,使得開發(fā)者只需要提供一個(gè)待執(zhí)行的作業(yè)集合即可,這非常適用于批量業(yè)務(wù)處理。這個(gè)適配器對于所有節(jié)點(diǎn)都適于執(zhí)行作業(yè)的同質(zhì)化環(huán)境是非常有用的,這樣的話映射階段就可以隱式地完成。

3.1.3.ComputeJob

任務(wù)觸發(fā)的所有作業(yè)都要實(shí)現(xiàn)ComputeJob接口,這個(gè)接口的execute()方法定義了作業(yè)的邏輯然后返回一個(gè)作業(yè)的結(jié)果。

3.1.4.簡單示例

下面這段代碼,作為一個(gè)簡單示例,顯示了如何計(jì)算一段話中的字母的總數(shù)量:

    IgniteCompute compute = ignite.compute();
    // 在集群上執(zhí)行任務(wù)。
    int cnt = grid.compute().execute(CharacterCountTask.class, "Hello Grid Enabled World!");
    private static class CharacterCountTask extends ComputeTaskSplitAdapter<String, Integer> {
      // 1. 將收到的字符串拆分為字符串?dāng)?shù)組
      // 2. 為每個(gè)單詞創(chuàng)建一個(gè)作業(yè)
      // 3. 將每個(gè)作業(yè)發(fā)送給工作節(jié)點(diǎn)進(jìn)行處理
      @Override 
      public List<ClusterNode> split(List<ClusterNode> subgrid, String arg) {
        String[] words = arg.split(" ");
        List<ComputeJob> jobs = new ArrayList<>(words.length);
        for (final String word : arg.split(" ")) {
          jobs.add(new ComputeJobAdapter() {
            @Override public Object execute() {
              return word.length();
            }
          });
        }
        return jobs;
      }
      @Override 
      public Integer reduce(List<ComputeJobResult> results) {
        int sum = 0;
        for (ComputeJobResult res : results)
          sum += res.<Integer>getData();
        return sum;
      }
    }

是不是非常簡單?

3.2.容錯(cuò)

Ignite支持作業(yè)的自動(dòng)故障轉(zhuǎn)移,當(dāng)一個(gè)節(jié)點(diǎn)故障時(shí),作業(yè)會(huì)被轉(zhuǎn)移到其它可用節(jié)點(diǎn)再次執(zhí)行。故障轉(zhuǎn)移是通過FailoverSpi實(shí)現(xiàn)的,FailoverSpi負(fù)責(zé)選擇一個(gè)新的節(jié)點(diǎn)來執(zhí)行失敗的作業(yè)。它會(huì)檢查發(fā)生故障的作業(yè)以及該作業(yè)可以嘗試執(zhí)行的所有可用的網(wǎng)格節(jié)點(diǎn)的列表。它會(huì)確保該作業(yè)不會(huì)再次映射到出現(xiàn)故障的同一個(gè)節(jié)點(diǎn)。故障轉(zhuǎn)移是在ComputeTask.result(...)方法返回ComputeJobResultPolicy.FAILOVER策略時(shí)觸發(fā)的。Ignite內(nèi)置了一些故障轉(zhuǎn)移SPI的實(shí)現(xiàn),開發(fā)者也可以進(jìn)行定制。另外,Ignite保證,只要有一個(gè)節(jié)點(diǎn)是有效的,作業(yè)就不會(huì)丟失。

3.3.負(fù)載平衡

Ignite中的負(fù)載平衡是通過LoadBalancingSpi實(shí)現(xiàn)的。它控制所有節(jié)點(diǎn)的負(fù)載以及確保集群中的每個(gè)節(jié)點(diǎn)負(fù)載水平均衡。對于同質(zhì)化環(huán)境中的同質(zhì)化的任務(wù),負(fù)載平衡采用的是隨機(jī)或者循環(huán)的策略。然而在很多其它場景中,特別是在一些不均勻的負(fù)載下,就需要更復(fù)雜的自適應(yīng)負(fù)載平衡策略。Ignite內(nèi)置了若干中負(fù)載平衡實(shí)現(xiàn),比如循環(huán)式負(fù)載平衡RoundRobinLoadBalancingSpi以及隨機(jī)或者加權(quán)負(fù)載平衡WeightedRandomLoadBalancingSpi,這部分開發(fā)者也可以定制開發(fā),滿足個(gè)性化需求。

3.4.作業(yè)調(diào)度

Ignite中,作業(yè)是在客戶端側(cè)的任務(wù)拆分初始化或者閉包執(zhí)行階段被映射到集群節(jié)點(diǎn)上的,但是一旦作業(yè)到達(dá)被分配的節(jié)點(diǎn),就會(huì)有序地執(zhí)行。默認(rèn)情況下,作業(yè)會(huì)被提交到一個(gè)線程池然后隨機(jī)地執(zhí)行,如果要對作業(yè)執(zhí)行順序進(jìn)行細(xì)粒度控制的話,需要啟用CollisionSpi,比如,可以按照FIFO排序或者按照優(yōu)先級排序。

3.5.事務(wù)

在企業(yè)級批量業(yè)務(wù)處理中,通常要對數(shù)據(jù)庫進(jìn)行頻繁的更新操作,在分布式計(jì)算環(huán)境下,將整個(gè)任務(wù)配置為一個(gè)事務(wù)顯然是不合適的。最佳實(shí)踐是將每個(gè)作業(yè)配置成一個(gè)事務(wù),這樣如果某個(gè)作業(yè)失敗,只是該作業(yè)回滾,其它成功的作業(yè)還是正常提交的,然后故障轉(zhuǎn)移機(jī)制會(huì)使該失敗的作業(yè)再次執(zhí)行,直到成功提交。

3.6.其它

Ignite的內(nèi)存MapReduce實(shí)現(xiàn)還支持會(huì)話,這個(gè)機(jī)制可以在任務(wù)和作業(yè)之間共享一些數(shù)據(jù),還支持節(jié)點(diǎn)局部狀態(tài)共享,這個(gè)其實(shí)是節(jié)點(diǎn)的局部變量,它可以用于任務(wù)在不同的執(zhí)行過程中共享狀態(tài)。還有,通過計(jì)算和緩存數(shù)據(jù)的并置,可以極大地提高性能,它還支持檢查點(diǎn),可以在一個(gè)長時(shí)間執(zhí)行的作業(yè)中保存一些中間狀態(tài),這個(gè)機(jī)制在重啟一個(gè)故障節(jié)點(diǎn)后,作業(yè)可以從保存的檢查點(diǎn)載入然后從故障處繼續(xù)執(zhí)行。等等,在這里就不一一介紹了。

4.Ignite的優(yōu)勢

在之前的關(guān)于Ignite的集群部署的文章中我對Ignite的集群特性做了簡要的介紹,該文中推薦了一種混合式的集群部署方案,如下圖: Apache Ignite有什么用

在這個(gè)架構(gòu)中,如果能夠在應(yīng)用集群組中進(jìn)行分布式計(jì)算來實(shí)現(xiàn)批量業(yè)務(wù)處理,那么這會(huì)是一個(gè)很優(yōu)雅的解決方案,幸運(yùn)的是,Ignite真的實(shí)現(xiàn)了,這個(gè)解決方案整體上來講,具有如下的優(yōu)勢:

  • **開發(fā)簡單:**很簡單的幾段代碼就實(shí)現(xiàn)了MapReduce,入門門檻極低,經(jīng)過很短時(shí)間的學(xué)習(xí),就可以把注意力放在復(fù)雜業(yè)務(wù)的處理上;

  • 調(diào)試簡單:Ignite單機(jī)就可以啟動(dòng)一個(gè)只有一個(gè)節(jié)點(diǎn)的集群,可以在IDE中直接單步調(diào)試,不需要為了開發(fā)調(diào)試構(gòu)建任何復(fù)雜的環(huán)境;

  • **部署簡單:**只要將Ignite的幾個(gè)jar包嵌入應(yīng)用內(nèi)部,就可以利用Ignite的發(fā)現(xiàn)機(jī)制自動(dòng)建立集群,實(shí)現(xiàn)分布式計(jì)算,而其它分布式計(jì)算平臺(tái),基本都需要部署單獨(dú)的計(jì)算服務(wù)器,整個(gè)部署架構(gòu)也變得復(fù)雜,運(yùn)維成本也會(huì)上升;

  • **資源利用率高:**通常批量業(yè)務(wù)處理都是在夜間系統(tǒng)空閑時(shí),如果還是在這些設(shè)備上進(jìn)行分布式計(jì)算,可以充分利用計(jì)算資源,如果采用需要單獨(dú)增加服務(wù)器的計(jì)算方案,因?yàn)榇蟛糠謺r(shí)間設(shè)備閑置,整體設(shè)備成本上升,資源利用效率也會(huì)大幅下降。

到此,關(guān)于“Apache Ignite有什么用”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請繼續(xù)關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)砀鄬?shí)用的文章!

分享題目:ApacheIgnite有什么用
網(wǎng)站鏈接:http://bm7419.com/article8/gijiip.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供動(dòng)態(tài)網(wǎng)站、微信小程序網(wǎng)站內(nèi)鏈、App設(shè)計(jì)網(wǎng)站收錄、做網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都定制網(wǎng)站網(wǎng)頁設(shè)計(jì)