91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

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

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

Apache Ignite有什么用

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

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

1.傳統的方案

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

2.面臨的問題

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

3.Ignite計算網格

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

3.1.MapReduce和ForkJoin

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

3.1.1.ComputeTask

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

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

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

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

3.1.2.更簡單的適配器ComputeTaskSplitAdapter

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

3.1.3.ComputeJob

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

3.1.4.簡單示例

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

    IgniteCompute compute = ignite.compute();
    // 在集群上執行任務。
    int cnt = grid.compute().execute(CharacterCountTask.class, "Hello Grid Enabled World!");
    private static class CharacterCountTask extends ComputeTaskSplitAdapter<String, Integer> {
      // 1. 將收到的字符串拆分為字符串數組
      // 2. 為每個單詞創建一個作業
      // 3. 將每個作業發送給工作節點進行處理
      @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支持作業的自動故障轉移,當一個節點故障時,作業會被轉移到其它可用節點再次執行。故障轉移是通過FailoverSpi實現的,FailoverSpi負責選擇一個新的節點來執行失敗的作業。它會檢查發生故障的作業以及該作業可以嘗試執行的所有可用的網格節點的列表。它會確保該作業不會再次映射到出現故障的同一個節點。故障轉移是在ComputeTask.result(...)方法返回ComputeJobResultPolicy.FAILOVER策略時觸發的。Ignite內置了一些故障轉移SPI的實現,開發者也可以進行定制。另外,Ignite保證,只要有一個節點是有效的,作業就不會丟失。

3.3.負載平衡

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

3.4.作業調度

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

3.5.事務

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

3.6.其它

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

4.Ignite的優勢

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

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

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

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

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

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

到此,關于“Apache Ignite有什么用”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

向AI問一下細節

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

AI

禄丰县| 盐亭县| 虹口区| 库伦旗| 彝良县| 峨眉山市| 白水县| 湾仔区| 崇仁县| 郯城县| 辉南县| 个旧市| 定日县| 松江区| 阳信县| 疏附县| 临高县| 怀来县| 沂源县| 郧西县| 腾冲县| 睢宁县| 东阿县| 松阳县| 石首市| 调兵山市| 大姚县| 广安市| 德保县| 四川省| 平湖市| 河南省| 芮城县| 离岛区| 盐源县| 周口市| 桐乡市| 镇远县| 长海县| 江孜县| 西贡区|