使用 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 数据库中。

相关推荐
HelloGitHub3 分钟前
这个年轻的开源项目,想让每个人都能拥有自己的专业级 AI 智能体
开源·github·agent
刘发财6 小时前
弃用html2pdf.js,这个html转pdf方案能力是它的几十倍
前端·javascript·github
地平线开发者10 小时前
SparseDrive 模型导出与性能优化实战
算法·自动驾驶
董董灿是个攻城狮11 小时前
大模型连载2:初步认识 tokenizer 的过程
算法
地平线开发者11 小时前
地平线 VP 接口工程实践(一):hbVPRoiResize 接口功能、使用约束与典型问题总结
算法·自动驾驶
罗西的思考11 小时前
AI Agent框架探秘:拆解 OpenHands(10)--- Runtime
人工智能·算法·机器学习
sunny86514 小时前
Claude Code 跨会话上下文恢复:从 8 次纠正到 0 次的工程实践
人工智能·开源·github
HXhlx15 小时前
CART决策树基本原理
算法·机器学习
Lee川15 小时前
优雅进化的JavaScript:从ES6+新特性看现代前端开发范式
javascript·面试
Wect15 小时前
LeetCode 210. 课程表 II 题解:Kahn算法+DFS 双解法精讲
前端·算法·typescript