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

相关推荐
穗余30 分钟前
WEB3全栈开发——面试专业技能点P5中间件
中间件·面试·职场和发展
liujing1023292939 分钟前
Day09_刷题niuke20250609
java·c++·算法
不7夜宵42 分钟前
力扣热题100 k个一组反转链表题解
算法·leetcode·链表
江城开朗的豌豆1 小时前
JavaScript篇:偷懒也有理!事件代理让我少写一半代码
前端·javascript·面试
HelloGitHub1 小时前
3 个超火的开源项目「GitHub 热点速览」
开源·github
江城开朗的豌豆1 小时前
Proxy:JavaScript中的'变形金刚',让你的对象为所欲为!
前端·javascript·面试
江城开朗的豌豆2 小时前
JavaScript中的instanceof:你的代码真的认识'自家孩子'吗?
前端·javascript·面试
JinSo2 小时前
create-easy-editor —— 快速搭建你的可视化编辑器
前端·前端框架·github
蒟蒻小袁2 小时前
力扣面试150题--课程表
算法·leetcode·面试
闻缺陷则喜何志丹2 小时前
【动态规划】B4336 [中山市赛 2023] 永别|普及+
c++·算法·动态规划·洛谷