Hadoop python mrjob单词统计

一.mrjob实现WordCount
# -*- coding: utf-8 -*-
# @Time    : 2019/12/1 9:45
# @Author  :

from mrjob.job import MRJob


class MRWordFrequencyCount(MRJob):

    def mapper(self, _, line):
        yield "chars", len(line)
        yield "words", len(line.split())
        yield "lines", 1

    def reducer(self, key, values):
        yield key, sum(values)


if __name__ == '__main__':
    MRWordFrequencyCount.run()

1.本地测试
 python3 mr_word_count.py text.txt

在这里插入图片描述

2.提交job到Hadoop集群
# 确保text.txt文件已经存在Hadoop集群中
hadoop fs -ls /
hadoop fs -cat /text.txt
# 删除之前生成的output文件夹
hadoop fs -rm -r /output

# 提交job
python3 mr_word_count.py -r hadoop hdfs:///text.txt -o hdfs:///output
3.可能会遇到的问题

1.上传文件到Hadoop异常

could only be replicated to 0 nodes instead of minReplication (=1)
jps 发现DataNode没有起来
原因:
可能是多次运行hadoop namenode -format 格式化namenode引起的clusterIDid不一致
解决方法:
修改dfs/data/current/VERSION 中的clusterID值为dfs/name/current/VERSION中的值

2.Retrying connect to server: 0.0.0.0/0.0.0.0:8032

可能原因:
1.服务器性能不够
2.yarn-site.xml配置有问题
集群ha可以参考:https://blog.csdn.net/Cocktail_py/article/details/102631199

3.subprocess failed with code 127
参考: https://blog.csdn.net/Saltwind/article/details/82913477

二.mrjob 实现 topN统计
# -*- coding: utf-8 -*-
# @Time    : 2019/12/1 9:45
# @Author  :

from mrjob.job import MRJob, MRStep
import heapq


class TopNWords(MRJob):
    def mapper(self, _, line):
        if line.strip() != "":
            for word in line.strip().split():
                yield word, 1

    # 介于mapper和reducer之间,用于临时的将mapper输出的数据进行统计
    def combiner(self, word, counts):
        yield word, sum(counts)

    def reducer_sum(self, word, counts):
        yield None, (sum(counts), word)

    # 利用heapq将数据进行排序,将最大的2个取出
    def top_n_reducer(self, _, word_cnts):
        for cnt, word in heapq.nlargest(2, word_cnts):
            yield word, cnt

    # 实现steps方法用于指定自定义的mapper,comnbiner和reducer方法
    # MRStep指定执行顺序
    def steps(self):
        return [
            MRStep(mapper=self.mapper,
                   combiner=self.combiner,
                   reducer=self.reducer_sum),
            MRStep(reducer=self.top_n_reducer)
        ]


def main():
    TopNWords.run()


if __name__ == '__main__':
    main()

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Cocktail_py

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值