在 Hadoop 中使用 Python 进行统计开发

Hadoop 的 Native 语言是 Java,它也提供其他语言(如 C、Python)的接口。在 Hadoop 下面其他语言是怎么工作的呢?原理是使用 HadoopStreaming 的标准输入 STDIN 和标准输出 STDOUT 来帮我们在 Map 和 Reduce 间传递数据。

Python map/reduce

编写 map.py

#!/usr/bin/env python
import sys

def read_inputs(file):  
  for line in file:
    line = line.strip()
    yield line.split()

def main():  
  file = sys.stdin
  lines = read_inputs(file)
  for words in lines:
    for word in words:
      print("{}\t{}".format(word, 1))

if __name__ == "__main__":  
  main()

测试

echo "Hello world Bye world" | ./map.py 
Hello   1
world   1
Bye 1
world   1

编写 reduce.py

#!/usr/bin/env python
import sys

def read_map_outputs(file):  
  for line in file:
    yield line.strip().split("\t", 1)

def main():  
  current_word = None
  word_count   = 0
  lines = read_map_outputs(sys.stdin)
  for word, count in lines:
    try:
      count = int(count)
    except ValueError:
      continue
    if current_word == word:
      word_count += count
    else:
      if current_word:
        print("{}\t{}".format(current_word, word_count))
      current_word = word
      word_count = count
  if current_word:
    print("{}\t{}".format(current_word, word_count))

if __name__ == "__main__":  
  main()

测试

echo "Hello World Bye World Hello" | ./map.py | sort | ./reduce.py
Bye 1
Hello   2
World   2

上面都是使用 Python 自己的特性去进行统计,下面展示使用 Hadoop 的流程来执行

使用 MapReduce 执行 Python 脚本

查找 hadoop-stream 库的位置

find ./ -name "hadoop-streaming*.jar"  
./local/hadoop/share/hadoop/tools/sources/hadoop-streaming-2.7.3-test-sources.jar
./local/hadoop/share/hadoop/tools/sources/hadoop-streaming-2.7.3-sources.jar
./local/hadoop/share/hadoop/tools/lib/hadoop-streaming-2.7.3.jar

在 HDFS 上建立读入文件夹 input

hadoop -fs mkdir input

将待处理文件放入 HDFS

hadoop -fs put allfiles input

运行命令处理

hadoop jar ~/local/hadoop/share/hadoop/tools/lib/hadoop-streaming-2.7.3.jar -input input -output output -mapper ./map.py -reducer ./reduce.py

处理后的文件

Bye 1
Goodbye 1
Hadoop  2
Hello   2
World   2

Python 代码中 map.py 的 print 会将行输入到 Hadoop 中,而 reduce.py 中的 print 会将 hadoop 流中的数据输出到 HDFS 中。

转载于:https://my.oschina.net/lvyi/blog/806564

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Hadoop Streaming 是 Hadoop 生态系统的一部分,它允许我们使用Java 编写的 MapReduce 程序来进行据处理。在词频统计任务,我们可以使用 Hadoop Streaming 来进行高效的词频统计。 首先,我们需要将我们的据准备好,并以文本文件的形式存储在 Hadoop 分布式文件系统(HDFS)。接下来,我们需要编写一个用于词频统计的 MapReduce 程序,这个程序可以使用任何非 Java 编程语言编写。 在 Map 阶段,我们可以使用一个脚本(比如 Python、Ruby 等)来解析每一行的文本据,并将每个单词以键值对的方式输出。键为单词,值为字 1,表示这个单词出现了一次。 在 Reduce 阶段,我们可以使用另一个脚本来将相同键的值进行累加。这样,我们就可以得到每个单词的词频。 通过 Hadoop Streaming,我们可以将这两个脚本作为 Map 和 Reduce 程序进行提交到 Hadoop 集群上,并通过命令行或脚本来执行任务。Hadoop Streaming 将负责调度、分配任务,并将最终的统计结果输出到指定的文件。 总的来说,Hadoop Streaming 提供了一种灵活、高效的方式来进行词频统计使用Java 编程语言来编写 MapReduce 程序可以降低学习成本,并提高开发的效率。同时,Hadoop Streaming 也充分利用了 Hadoop 的分布式计算能力,可以处理大规模的据,提供可靠、高性能的词频统计服务。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值