如何给Map/Reduce程序传递参数?

前言

以前我们启动一个Map/Reduce,经常是利用hadoop jar ./xxx.jar yyy.KK input output的方式在SHELL脚本或者命令行直接提交作业。但是最近涉及到的一个项目,需要根据配置动态的启动MR作业,也就是涉及到向MAP,REDUCE处理类传递参数的问题。

传递参数的方式


最常见的方式:

Configuration conf = new Configuration();

conf.set("key","value");

然后在MAP/REDUCE类中:

String value = conf.get("key");

这种方式,非常方便的处理了字符串信息的传递,也是常用的方式。

但是,如果我们想传递一个对象给MAP/REDUCE呢?

如果一个对象内部,还有一些对象类型的属性,这种复杂对象又该如何传递呢?

如果利用conf.set的方式那么将非常繁琐,也不利于程序的可读性。

传递对象给MR的思路:

我们知道,一个对象无论多么复杂,不论对象内部的属性是不是对象类型,到最后,都是由一个一个的基本数据类型构成,我们当然可以override toString方法,得到一个我们想要的string,比如以,号分割的一些有用信息,然后利用conf.set的方式传递,MR收到后,进行解析即可得到。但是能不能,利用conf.set设置的是一个STRING,但是MR收到后进行“解析”成对象,然后我们就可以“随心所欲”的调用这个对象的属性和方法?答案是可以的,比如,我们可以将对象序列化成STRING,利用conf.set设置,MR收到后,反序列化STRING,这样就能得到我们想要的对象了!

步骤:

1.实现序列化接口 

implements Serializable只是一个标示,标志可以进行序列化,并不需要我们去实现什么。

我们仅仅需要注意的是,如果本类有属性是对象类型的,没有实现序列化接口的,都应该实现这个接口,比如:

2.提供方法实现Object-->String String-->Object

例如:

我们知道JAVA的序列化是将对象弄成字节序列,在上面的过程实际上,利用IO流的装饰功能得到序列化后的字符串,然后进行编码。

反序列的功能实际上就是上述序列化的逆向!

3.利用conf.set conf.get设置、取得STRING,利用反序列化得到对象即可

Action action = Tool.decodeString(context.getConfiguration().get("action"));

时间: 2024-08-21 14:00:09

如何给Map/Reduce程序传递参数?的相关文章

【hadoop】如何向map和reduce脚本传递参数,加载文件和目录

本文主要讲解三个问题: 1 使用Java编写MapReduce程序时,如何向map.reduce函数传递参数. 2 使用Streaming编写MapReduce程序(C/C++, Shell, Python)时,如何向map.reduce脚本传递参数. 3 使用Streaming编写MapReduce程序(C/C++, Shell, Python)时,如何向map.reduce脚本传递文件或文件夹. (1) streaming 加载本地单个文件 (2) streaming 加载本地多个文件 (3

如何向map和reduce脚本传递参数,加载文件和目录

本文主要讲解三个问题: 1 使用Java编写MapReduce程序时,如何向map.reduce函数传递参数. 2 使用Streaming编写MapReduce程序(C/C++, Shell, Python)时,如何向map.reduce脚本传递参数. 3 使用Streaming编写MapReduce程序(C/C++, Shell, Python)时,如何向map.reduce脚本传递文件或文件夹. (1) streaming 加载本地单个文件 (2) streaming 加载本地多个文件 (3

day 2 给程序传递参数

1.如何实现变化name name = "alex" print("欢迎%s前来指导学习"%name) 欢迎alex前来指导学习 2.sys.argv import sys print(sys.argv) name = "alex" print("欢迎%s前来指导学习"%name) ### 运行结果 ['04-给程序传递参数.py'] 欢迎alex前来指导学习 ### 运行结果2 python3 04-给程序传递参数.py a

用python写map reduce程序

利用hadoop streaming框架,帮助我们在map和reduce之间传递数据,通过stdin和stdout. http://wenku.baidu.com/link?url=R1vj6NWV5nv_aVI8P0G5SNzxOyaDsffGeOJrRT6iA9iYHry3w60hJ9CVAtS1iRkh7IOYEuGozIqAZubfXybzf1URxTEY7a2gY9L3LTZQ0Wq

Linux下C程序设计(4)----操作环境变量 、程序传递参数getopt getopt_long操作、获取时间

通过命令传递参数查看环境变量  /************************************************************************* > File Name: env.c > Author: > Mail: > Created Time: Tue 24 Feb 2015 10:42:21 PM PST *******************************************************************

详述执行map reduce 程序的步骤(本地执行MR、服务器上执行MR)

MR程序的执行环境有两种:本地测试环境.服务器环境. 1.本地环境执行MR程序的步骤: (1)在windows下配置hadoop的环境变量 (2)拷贝debug工具(winutils)到HADOOP_HOME/bin (3)从源码中拷贝org.apache.hadoop.io.nativeio.NativeIO.java到我们的mr的src目录下,修改NativeIO.java.(大家可去http://download.csdn.net/detail/u013226462/9516657下载.)

Hadoop 使用Combiner提高Map/Reduce程序效率

众所周知,Hadoop框架使用Mapper将数据处理成一个<key,value>键值对,再网络节点间对其进行整理(shuffle),然后使用Reducer处理数据并进行最终输出. 在上述过程中,我们看到至少两个性能瓶颈: 如果我们有10亿个数据,Mapper会生成10亿个键值对在网络间进行传输,但如果我们只是对数据求最大值,那么很明显的Mapper只需要输出它所知道的最大值即可.这样做不仅可以减轻网络压力,同样也可以大幅度提高程序效率. 使用专利中的国家一项来阐述数据倾斜这个定义.这样的数据远

map reduce程序示例

package test2; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.Path; import org.apache.hadoop.io.IntWritable; import org.apache.hadoop.io.Text; import org.apache.hadoop.mapreduce.Job; import org.apache.hadoop.mapreduce.Mapper

Hadoop实战:使用Combiner提高Map/Reduce程序效率

好不easy算法搞定了.小数据測试也得到了非常好的结果,但是扔到进群上.挂上大数据就挂了.无休止的reduce不会结束了. .. .. .... .. ... .. ==================================================================== 这才想起还有个combiner! .!!!.!! !.!!.!! !! ! !! ! 我们知道.MapReduce是分为Mapper任务和Reducer任务.Mapper任务的输出,通过网络传输到