Java 对Redis数据进行MapReduce


前言:

  MapReduce 简称 MR是一个框架可以使用它来编写分布式处理大量数据的应用程序。由于它允许在大型商用硬件集群上并行处理数据,因此  `MapReduce` 可以显着加快数据处理速度。下面将介绍java基于[Redisson](https://redisson.org/)-Redis的内存数据网格使用`MapReduce`处理存储在Redis中的数据。

什么是MapReduce?

MapReduce 是一种可以用Java实现的分布式计算的程序模型。该算法包含两个关键任务,称为MapReduce

Map任务的目的 是将数据集转换为另一个数据集,其中元素被分解为称为元组的键/值对。该Reduce 任务将这些数据元组组合成一小组元组,使用地图的输出作为输入。

分布式计算意味着将任务分成几个单独的进程,然后可以在大型商用硬件集群上并行执行。一旦 MapReduce 将大数据集的各个元素分解为元组,然后进一步将它们缩小为较小的集合,剩余的数据可以并行处理,这可以显着加快需要对数据执行的处理。

何时用MapReduce处理Redis数据?

在许多情况下,使用它MapReduce 来处理Redis数据很有帮助 。通常它们的共同点是您需要处理的数据量非常大。

举一个简单的例子,您可以考虑一种情况,其中您有大量组织的月度能耗数据。现在假设您需要处理此数据以生成每个组织的最大使用年份,最小使用年份等结果。虽然编写算法来执行这种处理对于有经验的程序员来说并不困难,但是如果必须运行大量数据,许多这样的算法将花费很长时间来执行。

作为长处理时间的解决方案,您可以使用 MapReduce 减少数据集的总体大小,从而使处理速度更快。对于许多任务来说,处理时间的减少可能非常重要,因为它可以释放硬件,以便可以用于其他计算任务。

还有更多的情况,MapReduce 使用Redisson存储在Redis中的分布式数据可能是一件非常有用的事情。例如,MapReduce 如果您需要快速,可靠且准确地计算非常大的文件或文件集合的字数,特别有用。

用Java对Redis上存储的数据执行分布式MapReduce的示例

了解此算法如何使用Redisson-MapReduce 提供的文本数据并对其进行处理以可靠地生成准确的字数。

一、创建Redisson

从各个配置文件中心读取配置

// from JSON
Config config = Config.fromJSON(...)
// from YAML
Config config = Config.fromYAML(...)
// or dynamically
Config config = new Config();
…
image.gif

二、创建一个Redisson实例:

RedissonClient redisson = Redisson.create(config);
image.gif

三、定义Mapper对象用于每个Map 条目,并按空格分割值以分隔单词:

public class WordMapper implements RMapper<String, String, String, Integer> {
    @Override
    public void map(String key, String value, RCollector<String, Integer> collector) {
            String[] words = value.split("[^a-zA-Z]");
            for (String word : words) {
                collector.emit(word, 1);
            }
        }
    }
}
image.gif

四、定义Reducer 对象,这计算每个单词的总和。

public class WordReducer implements RReducer<String, Integer> {
     @Override
     public Integer reduce(String reducedKey, Iterator<Integer> iter) {
         int sum = 0;
         while (iter.hasNext()) {
            Integer i = (Integer) iter.next();
            sum += i;
         }
         return sum;
     }
}
image.gif

五、定义Collator 对象可选,这会计算单词总数。

public class WordCollator implements RCollator<String, Integer, Integer> {
     @Override
     public Integer collate(Map<String, Integer> resultMap) {
        int result = 0;
        for (Integer count : resultMap.values()) {
            result += count;
        }
        return result;
     }
}
image.gif

六、执行实例

RMap<String, String> map = redisson.getMap("wordsMap");
    map.put("line1", "Alice was beginning to get very tired");
    map.put("line2", "of sitting by her sister on the bank and");
    map.put("line3", "of having nothing to do once or twice she");
    map.put("line4", "had peeped into the book her sister was reading");
    map.put("line5", "but it had no pictures or conversations in it");
    map.put("line6", "and what is the use of a book");
    map.put("line7", "thought Alice without pictures or conversation");
    RMapReduce<String, String, String, Integer> mapReduce
             = map.<String, Integer>mapReduce()
                  .mapper(new WordMapper())
                  .reducer(new WordReducer());
    // count occurrences of words
    Map<String, Integer> mapToNumber = mapReduce.execute();
    // count total words amount
    Integer totalWordsAmount = mapReduce.execute(new WordCollator());
image.gif

MapReduce 也可用于收集类型的对象其中包括 SetSetCacheListSortedSetScoredSortedSetQueueBlockingQueueDeque, BlockingDequePriorityQueuePriorityDeque

总结:

使用Redisson对Redis中存储的数据执行MapReduce;[Redisson](https://redisson.org/)是一个最流行的Redis客户端,为使用Java进行编程和数据处理提供了无限可能。Redisson提供了服务,对象,集合,锁和同步器的分布式实现。它支持一系列Redis配置,包括单个,集群,标记或主从配置。

MapReduce 如果您已经使用Redisson在Redis中存储大量数据,则使用 是一个很好的选择。Redisson提供了一种基于Java的 MapReduce 编程模型,可以轻松处理存储在Redis中的大量数据。

可参考redission的更多使用:

  https://blog.csdn.net/u011663149/article/details/87877522
  [https://blog.csdn.net/u011663149/article/details/87875421](https://blog.csdn.net/u011663149/article/details/87875421)
  [https://blog.csdn.net/u011663149/article/details/85297483](https://blog.csdn.net/u011663149/article/details/85297483)

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,884评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,755评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,369评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,799评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,910评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,096评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,159评论 3 411
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,917评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,360评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,673评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,814评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,509评论 4 334
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,156评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,882评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,123评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,641评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,728评论 2 351

推荐阅读更多精彩内容