使用 Hadoop Streaming 编写 MapReduce 应用程序

发布日期:2026-07-02 12:18:05   来源 : 杭州电子商务研究院    浏览量 :13
杭州电子商务研究院 发布日期:2026-07-02 12:18:05  
13

介绍

Hadoop Common(最初称为 Hadoop Core)是任何 Hadoop 生态系统的核心组件的集合。这些通用库和服务支持 Hadoop 生态系统的其他成员。有两个组件构成了 Hadoop 的基本功能:分布式存储(称为 HDFS)和分布式计算(称为 MapReduce)。

本指南将向您展示如何使用 Hadoop 流式传输工具来利用 Hadoop 的核心 MapReduce 功能。这样您就可以使用任何编程语言编写 MapReduce 应用程序,只要它具有映射器和缩减器功能即可。

MapReduce 回顾

MapReduce框架是当今大多数数据密集型框架的基础。下图说明了基本的 MapReduce 字数统计流程。

首先将文本语料库分成初始<key,value>对。以文本作为输入,初始<key,value>对是行和行的内容。之后,映射器函数将这些初始<key,value>对分成中间键值对。在这种情况下,单词的每个实例都映射到值 1。然后,shuffle 阶段按键对每个<key,value>对进行排序,以便Reducer可以负责聚合这些对以获得最终结果。

MapReduce 代码

Hadoop Streaming实用程序允许您以任何语言提交可执行文件,只要它遵循 MapReduce 标准即可。这将允许您编写原始 MapReduce 代码而无需抽象层。

以下是名为wordSplitter.py的映射器函数示例,它将一行中的每个单词分成一个<key,value>对。代码循环遍历给定行中的每个单词,并返回一个以制表符分隔的单词和数字对。关键字LongValueSum向 Hadoop 的内置聚合缩减器发出信号,表示需要对对中的值进行总计。

      #!/usr/bin/python
import sys 
import re 

def main(argv): 
    pattern = re.compile("[a-zA-Z][a-zA-Z0-9]*") 
    for line in sys.stdin: 
        for word in pattern.findall(line): 
            print("LongValueSum:" + word.lower() + "\t" + "1" )

if __name__ == "__main__": 
    main(sys.argv)
    

下面是一个Reducer.py函数的示例。此函数的作用是维护每个键的运行总数。由于所有数据都按键排序,因此一旦函数到达特定键的最后一个实例,聚合即视为完成。到达最后一个键后,Hadoop Streaming 便可以对下一个键调用 Reducer 函数,依此类推。

      #!/usr/bin/env python
 
import sys
 
last_key = None
running_total = 0
 
for input_line in sys.stdin:
   input_line = input_line.strip()
   this_key, value = input_line.split("\t", 1)
   value = int(value)
 
   if last_key == this_key:
       running_total += value
   else:
       if last_key:
           print( "%s\t%d" % (last_key, running_total) )
       running_total = value
       last_key = this_key
 
if last_key == this_key:
   print( "%s\t%d" % (last_key, running_total) )
    

但是,对于简单的聚合(如字数统计)或简单的总计值,Hadoop 有一个名为aggregate的内置reducer 。以下是使用自定义映射器但内置聚合reducer运行Hadoop Streaming作业的脚本示例。

      hadoop-streaming -mapper wordSplitter.py \
-reducer aggregate \
-input <input location> \
-output <output location> \
-file myPythonScript.py # Location of the script in HDFS, S3, or other storage
    

wordSplitter.py文件应存储在分布式存储中,通常是 HDFS 或 Amazon S3。然后应将文件的位置作为参数传递给hadoop-streamin 。如果您使用自定义 Reducer 则还需要传入自定义 Reducer 脚本。

结论

Hadoop Streaming 是 Hadoop 开发人员最先学习的内容之一。它提供了一个简单的接口来编写 MapReduce 代码,但它通过强制开发人员编写原始 MapReduce 代码来消除 Hive 或 Pig 的抽象层。它是 Hadoop 的核心组件之一,应该存在于所有 Hadoop 部署和发行版中。

以上内容来自杭州电子商务研究院推送
关注
关于我们
热门推荐
合作伙伴
免责声明:本站部分资讯来源于网络,如有侵权请及时联系客服,我们将尽快处理
Copyright © 2025-2027 ToB产业网址导航 公安备案 浙公网安备33010602013138号 浙ICP备16025413号-9
支持 反馈 关注 数据