hadoop统计txt词频
时间: 2025-01-07 16:00:06 浏览: 4
### 使用 Hadoop MapReduce 统计 TXT 文件中单词出现的频率
为了实现这一目标,需遵循一系列操作流程以确保文件被正确处理并得到预期的结果。
#### 准备工作环境
在 Linux 环境下配置好 Hadoop 并启动集群服务。确认 Hadoop 安装路径,并设置必要的环境变量以便能够顺利运行 HDFS 命令[^2]。
#### 创建测试文本文件
创建一个包含至少一万英文单词的文本文件 `wordtests.txt` 或者其他命名方式如 `zjh.txt`,用于后续上传至 HDFS 和执行词频统计实验[^3]。
#### 将文本文件上传到 HDFS
通过命令行工具将准备好的文本文件上传到指定位置 `/user/hadoop/input` 下:
```bash
cd /usr/local/hadoop
./bin/hdfs dfs -put ./wordtests.txt input
```
验证文件是否已成功上传:
```bash
./bin/hdfs dfs -ls input
```
此步骤确保源数据已被放置于分布式文件系统内供下一步骤访问。
#### 编写 Python Mapper 脚本
利用 Python 实现简单的映射器逻辑,在这里定义了一个名为 `mapper.py` 的脚本来解析输入流中的每一行文字,将其拆分为单个词语并通过标准输出发送每条记录附带数值 "1":
```python
#!/usr/bin/env python
import sys
for line in sys.stdin:
words = line.strip().split()
for word in words:
print(f"{word}\t1")
```
赋予该脚本可执行权限:
```bash
chmod +x mapper.py
```
这段代码实现了基本的地图端任务——即把原始文档转换成键值对形式的数据集,其中每个关键词对应着数量标记 “1”。这一步骤为之后聚合相同词条提供了基础材料[^4]。
#### 编写 Reducer 脚本
同样采用 Python 来构建化简器部分的功能,负责接收来自多个映射节点传递过来的信息并对它们实施累加运算从而得出最终结果。以下是简化版 reducer 示例 (`reducer.py`) :
```python
#!/usr/bin/env python
from collections import defaultdict
import sys
current_word = None
current_count = 0
word_counts = defaultdict(int)
for line in sys.stdin:
try:
word, count = line.split('\t', 1)
count = int(count)
if current_word != word and current_word is not None:
print(f'{current_word}\t{current_count}')
current_count = 0
current_word = word
current_count += count
except ValueError as e:
continue
if current_word is not None:
print(f'{current_word}\t{current_count}')
```
这个程序遍历所有接收到的标准输入项,当遇到新的关键字时就打印之前累积的数量;最后还需记得输出最后一个有效组合。
#### 提交作业给 YARN 集群调度管理平台
借助 hadoop-streaming.jar 工具提交上述两个阶段的任务描述以及关联资源地址给 Apache Yarn 进行统一管理和分配计算资源完成整个 MR 流程:
```bash
hadoop jar $HADOOP_HOME/share/hadoop/tools/lib/hadoop-streaming*.jar \
-file ~/path/to/mapper.py -mapper mapper.py \
-file ~/path/to/reducer.py -reducer reducer.py \
-input /user/hadoop/input/* -output /user/hadoop/output/
```
注意替换实际存在的绝对路径指向自定义编写的 map-reduce 脚本所在的位置。
#### 获取并保存结果
一旦作业结束,可以通过下面指令获取存储在 HDFS 上面的结果并将之下载回本地计算机上进一步分析或展示:
```bash
mkdir output && hdfs dfs -getmerge /user/hadoop/output/part-* ./
cat part-*
```
这样就可以看到完整的词频统计数据列表了[^5]。
阅读全文