MapReduce 2.0编程实践(涉及多语言编程)
Posted yunpiao123456
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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实现。其天生支持文本格式,但二进制格式支持较弱。通常用于简单的文本数据处理,加快开发效率。
以上是关于MapReduce 2.0编程实践(涉及多语言编程)的主要内容,如果未能解决你的问题,请参考以下文章
实验5 MapReduce初级编程实践——编程实现文件合并和去重操作
实验5 MapReduce初级编程实践——编程实现文件合并和去重操作