MapReduce 2.0编程实践(涉及多语言编程)

         Hadoop提供了三种编程方式:Java(最原始的方式、Hadoop Streaming(支持多语言)以及Hadoop Pipes(支持C/C++)。Java编程接口是所有编程方式的基础。不同的编程接口只是暴露给用户的形式不同而已,内部执行引擎是一样的。不同编程方式效率不同。 


          与Linux管道机制一致,通过标准输入输出实现进程间通信 。 几个举例: 

            cat 1.txt | grep “dong” | sort 

            cat 1.txt | python grep.py | java sort.jar 

JAVA编程


        Map阶段将输入的行数据,解析成单词-1的key-value对。其伪代码如右图所示。


        Reduce阶段将map阶段的输出结果进行归并,最后统计输出。


        MapReduce的数据流如图所示。inputfotmat中的RecordReader函数将split的每一行解析成偏移量-行数据的key-value形式。map实现单词切分。reduce实现归并。最终,统计文本中的单词数。

Grep问题 
       一批TB或者PB量级的文档,需要完成以下功能:  搜索符合某种规则(正则表达式)的单词或者句子。然后,统计相应的单词或者句子的数目。最后,按照数目对其进行排序,并输出最终结果。 

          该过程执行流程如上图所示。分两个过程执行,word统计和sort排序。贴出实现过程如下:



多语言编程

        以标准输入流作为输入。例如:C++:cin 、C:scanf 。以标准输出流作为输出。例如:C++:cout 、C:printf 可实现Mapper和Reducer,其他组件( InputFormat、Partitioner等需要用Java语言实现)。用C++实现wordcount如下图所示:

map阶段



reduce阶段


       执行c++mapreduce: 编译程序,生成可执行文件; g++ -o mapper mapper.cpp ;g++ -o reducer reducer.cpp。 测试程序; cat test.txt | ./mapper | sort | ./reducer 



Streaming程序运行方式 
      区分通用参数和命令行参数,通用参数应放在命令行参数前面,否则不起作用。通用参数有7个:  -conf  -D  -fs -jt -files - libjars    -archives 。“-file”或者“-files”参数,设置要分发到各个节点上的文件,对于mapper和reducer文件,必须要用或者“-files” 或“-file”指定。 如: -files mapper,reducer 和-file mapper -file reducer 。每次运行程序前,需要清空输出目录bin/hadoop fs -rmr /test/output 。

      下面用PHP实现wordcount:

map阶段:


reduce阶段:


测试mapper和reducer:

       cat test.txt| php mapper.php | sort | php reducer.php 

在Hadoop上运行 :


       最后,Java编程是Hadoop最原始开发语言。支持所有功能,是其他编程方式的基础。 Streaming编程仅用于开发Mapper和Reducer,其他组件需采用 Java实现。其天生支持文本格式,但二进制格式支持较弱。通常用于简单的文本数据处理,加快开发效率。 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值