
- Hazelcast 教程
- Hazelcast - 主頁
- Hazelcast - 介紹
- Hazelcast - 設定
- Hazelcast - 第一個應用程式
- Hazelcast - 配置
- 設定多節點例項
- Hazelcast - 資料結構
- Hazelcast - 客戶端
- Hazelcast - 序列化
- Hazelcast 高階版
- Hazelcast - Spring 整合
- Hazelcast - 監控
- Map、Reduce 和聚合
- Hazelcast - 集合偵聽器
- 常見陷阱和效能提示
- Hazelcast 有用資源
- Hazelcast - 快速指南
- Hazelcast - 有用資源
- Hazelcast - 討論
Hazelcast - Map、Reduce 和聚合
當您擁有大量資料並且需要多臺機器(即分散式環境)來計算資料時,MapReduce 是一種計算模型,對資料處理很有用。它涉及將資料“對映”到成對的關鍵-值然後“縮減”(即對這些鍵進行分組並對值執行操作)。
鑑於 Hazelcast 是在考慮分散式環境的情況下進行設計的,因此天然就包含實施 Map-Reduce 框架。
讓我們看一個示例來說明如何做到這一點。
例如,假設我們有汽車(品牌和車牌號)及其車主的資訊。
Honda-9235, John Hyundai-235, Alice Honda-935, Bob Mercedes-235, Janice Honda-925, Catnis Hyundai-1925, Jane
現在,我們需要找出每種品牌(即現代、本田等)的汽車數量。
示例
讓我們嘗試使用 MapReduce 來找出其結果:
package com.example.demo; import java.lang.reflect.Array; import java.util.ArrayList; import java.util.Map; import java.util.concurrent.ExecutionException; import java.util.concurrent.atomic.AtomicInteger; import com.hazelcast.core.Hazelcast; import com.hazelcast.core.HazelcastInstance; import com.hazelcast.core.ICompletableFuture; import com.hazelcast.core.IMap; import com.hazelcast.mapreduce.Context; import com.hazelcast.mapreduce.Job; import com.hazelcast.mapreduce.JobTracker; import com.hazelcast.mapreduce.KeyValueSource; import com.hazelcast.mapreduce.Mapper; import com.hazelcast.mapreduce.Reducer; import com.hazelcast.mapreduce.ReducerFactory; public class MapReduce { public static void main(String[] args) throws ExecutionException, InterruptedException { try { // create two Hazelcast instances HazelcastInstance hzMember = Hazelcast.newHazelcastInstance(); Hazelcast.newHazelcastInstance(); IMap<String, String> vehicleOwnerMap=hzMember.getMap("vehicleOwnerMap"); vehicleOwnerMap.put("Honda-9235", "John"); vehicleOwnerMap.putc"Hyundai-235", "Alice"); vehicleOwnerMap.put("Honda-935", "Bob"); vehicleOwnerMap.put("Mercedes-235", "Janice"); vehicleOwnerMap.put("Honda-925", "Catnis"); vehicleOwnerMap.put("Hyundai-1925", "Jane"); KeyValueSource<String, String> kvs=KeyValueSource.fromMap(vehicleOwnerMap); JobTracker tracker = hzMember.getJobTracker("vehicleBrandJob"); Job<String, String> job = tracker.newJob(kvs); ICompletableFuture<Map<String, Integer>> myMapReduceFuture = job.mapper(new BrandMapper()) .reducer(new BrandReducerFactory()).submit(); Map<String, Integer&g; result = myMapReduceFuture.get(); System.out.println("Final output: " + result); } finally { Hazelcast.shutdownAll(); } } private static class BrandMapper implements Mapper<String, String, String, Integer> { @Override public void map(String key, String value, Context<String, Integer> context) { context.emit(key.split("-", 0)[0], 1); } } private static class BrandReducerFactory implements ReducerFactory<String, Integer, Integer> { @Override public Reducer<Integer, Integer> newReducer(String key) { return new BrandReducer(); } } private static class BrandReducer extends Reducer<Integer, Integer> { private AtomicInteger count = new AtomicInteger(0); @Override public void reduce(Integer value) { count.addAndGet(value); } @Override public Integer finalizeReduce() { return count.get(); } } }
我們來了解一下這段程式碼:
- 我們建立了 Hazelcast 成員。在示例中,我們只有一個成員,但還可以有許多個成員。
我們使用假資料建立了一個對映並從中建立了一個鍵-值儲存。
我們建立了一個 Map-Reduce 任務,並要求其將鍵-值儲存用作資料。
然後,我們向叢集提交任務並等待其完成。
對映器建立一個鍵,即從原始鍵中提取品牌資訊並將值設定為 1,然後將其資訊作為 K-V 傳送到還原器。
還原器根據鍵(即品牌名稱)對資料進行分組,然後對值進行簡單求和。
輸出
程式碼的輸出為:
Final output: {Mercedes=1, Hyundai=2, Honda=3}
廣告