使用 Hadoop MapReduce 和 Bigtable 进行单词统计

简介

本示例展示了如何使用 Hadoop 的 MapReduce 框架来统计文本文件中单词的出现次数,并将结果存储在 Google Bigtable 中。这个过程涉及以下步骤:设置身份验证、编写 MapReduce 代码以及执行作业。

设置身份验证

在本地环境中使用 Google Cloud 服务时,需要设置身份验证。以下是设置步骤:

  1. 安装 Google Cloud CLI
  2. 初始化 gcloud CLI :运行命令 gcloud init
  3. 设置应用默认凭据 :在本地 shell 中,使用命令 gcloud auth application-default login 登录并设置凭据。

MapReduce 代码概览

代码示例提供了一个简单的命令行界面,用于处理一个或多个文本文件,并统计每个单词的出现次数。主要逻辑在 WordCountHBase 类中。

映射器(Mapper)

映射器的任务是将文本文件的内容分解成单词,并生成键值对,其中键为单词,值为 1。

java 复制代码
public static class TokenizerMapper extends
    Mapper {

  private final static IntWritable one = new IntWritable(1);

  @Override
  public void map(Object key, Text value, Context context) throws IOException,
      InterruptedException {
    StringTokenizer itr = new StringTokenizer(value.toString());
    ImmutableBytesWritable word = new ImmutableBytesWritable();
    while (itr.hasMoreTokens()) {
      word.set(Bytes.toBytes(itr.nextToken()));
      context.write(word, one);
    }
  }
}

缩减器(Reducer)

缩减器对每个键(单词)的值进行求和,并将结果写入 Bigtable 表中。每行对应一个单词,包含一个 cf:count 列,记录该单词的出现次数。

java 复制代码
public static class MyTableReducer extends
    TableReducer {

  @Override
  public void reduce(ImmutableBytesWritable key, Iterable values, Context context)
      throws IOException, InterruptedException {
    int sum = sum(values);
    Put put = new Put(key.get());
    put.addColumn(COLUMN_FAMILY, COUNT_COLUMN_NAME, Bytes.toBytes(sum));
    context.write(null, put);
  }

  public int sum(Iterable values) {
    int i = 0;
    for (IntWritable val : values) {
      i += val.get();
    }
    return i;
  }
}

执行 MapReduce 作业

  1. 编译代码:确保代码正确编译并打包成 JAR 文件。
  2. 提交作业 :使用 Hadoop 的 hadoop jar 命令提交 MapReduce 作业。
  3. 监控作业:通过 Hadoop 的 Web UI 或命令行工具监控作业的执行状态。

示例用例

  • 输入文件:包含多个文本文件,每个文件中有多个单词。
  • 输出:Bigtable 表中,每行对应一个单词,包含该单词在所有文件中出现的总次数。

通过这个示例,你可以了解如何利用 Hadoop 和 Bigtable 处理大规模数据,并将结果存储在 NoSQL 数据库中。

相关推荐
T___T40 分钟前
全方位解释 JavaScript 执行机制(从底层到实战)
前端·面试
小O的算法实验室1 小时前
2025年TRE SCI1区TOP,随机环境下无人机应急医疗接送与配送的先进混合方法,深度解析+性能实测
算法·论文复现·智能算法·智能算法改进
9号达人1 小时前
普通公司对账系统的现实困境与解决方案
java·后端·面试
小白程序员成长日记1 小时前
2025.11.06 力扣每日一题
算法·leetcode
暴风鱼划水1 小时前
算法题(Python)数组篇 | 4.长度最小的子数组
python·算法·力扣
勤劳打代码1 小时前
条分缕析 —— 通过 Demo 深入浅出 Provider 原理
flutter·面试·dart
gugugu.1 小时前
算法:二分算法类型题目总结---(含二分模版)
算法
大G的笔记本2 小时前
算法篇常见面试题清单
java·算法·排序算法
努力学算法的蒟蒻2 小时前
day10(11.7)——leetcode面试经典150
面试
7澄12 小时前
深入解析 LeetCode 数组经典问题:删除每行中的最大值与找出峰值
java·开发语言·算法·leetcode·intellij idea