简介
本示例展示了如何使用 Hadoop 的 MapReduce 框架来统计文本文件中单词的出现次数,并将结果存储在 Google Bigtable 中。这个过程涉及以下步骤:设置身份验证、编写 MapReduce 代码以及执行作业。
设置身份验证
在本地环境中使用 Google Cloud 服务时,需要设置身份验证。以下是设置步骤:
- 安装 Google Cloud CLI。
- 初始化 gcloud CLI :运行命令
gcloud init
。 - 设置应用默认凭据 :在本地 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 作业
- 编译代码:确保代码正确编译并打包成 JAR 文件。
- 提交作业 :使用 Hadoop 的
hadoop jar
命令提交 MapReduce 作业。 - 监控作业:通过 Hadoop 的 Web UI 或命令行工具监控作业的执行状态。
示例用例
- 输入文件:包含多个文本文件,每个文件中有多个单词。
- 输出:Bigtable 表中,每行对应一个单词,包含该单词在所有文件中出现的总次数。
通过这个示例,你可以了解如何利用 Hadoop 和 Bigtable 处理大规模数据,并将结果存储在 NoSQL 数据库中。