- 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}
广告