溫馨提示×

溫馨提示×

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

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

Apache Ignite有什么用

發(fā)布時間:2021-12-16 16:14:23 來源:億速云 閱讀:285 作者:iii 欄目:云計算

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

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

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

2.面臨的問題

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

3.Ignite計算網格

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

3.1.MapReduce和ForkJoin

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

3.1.1.ComputeTask

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

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

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

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

3.1.2.更簡單的適配器ComputeTaskSplitAdapter

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

3.1.3.ComputeJob

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

3.1.4.簡單示例

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

    IgniteCompute compute = ignite.compute();
    // 在集群上執(zhí)行任務。
    int cnt = grid.compute().execute(CharacterCountTask.class, "Hello Grid Enabled World!");
    private static class CharacterCountTask extends ComputeTaskSplitAdapter<String, Integer> {
      // 1. 將收到的字符串拆分為字符串數(shù)組
      // 2. 為每個單詞創(chuàng)建一個作業(yè)
      // 3. 將每個作業(yè)發(fā)送給工作節(jié)點進行處理
      @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.容錯

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

3.3.負載平衡

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

3.4.作業(yè)調度

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

3.5.事務

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

3.6.其它

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

4.Ignite的優(yōu)勢

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

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

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

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

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

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

到此,關于“Apache Ignite有什么用”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續(xù)學習更多相關知識,請繼續(xù)關注億速云網站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>

向AI問一下細節(jié)

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

AI