如何给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只是一个标示,标志可以进行序列化,并不需要我们去实现什么。


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


wKioL1WfbGKxs3G6AAEkSspHEno583.jpg




wKioL1WfbKSgyYFOAAA4TwOFBsY158.jpg

wKiom1WfatKRvaovAAA14aQIOa0682.jpg



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


例如:


wKioL1WfbQPDSdOLAAGK7cYp1uw081.jpg


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



wKioL1Wfb67AIa1nAAGAUuY2fOA357.jpg


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



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


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



本文转自zfz_linux_boy 51CTO博客,原文链接:http://blog.51cto.com/zhangfengzhe/1672893,如需转载请自行联系原作者


相关文章
|
7月前
|
JavaScript 前端开发
解释 JavaScript 中的`map()`、`filter()`和`reduce()`方法的用途。
解释 JavaScript 中的`map()`、`filter()`和`reduce()`方法的用途。
73 1
|
7月前
|
开发者 Python
Python中的函数式编程:理解map、filter和reduce
【2月更文挑战第13天】 本文深入探讨了Python中函数式编程的三个主要工具:map、filter和reduce。我们将详细解释这些函数的工作原理,并通过实例来展示它们如何使代码更简洁、更易读。我们还将讨论一些常见的误解和陷阱,以及如何避免它们。无论你是Python新手还是有经验的开发者,本文都将帮助你更好地理解和使用这些强大的函数。
|
7月前
|
分布式计算 JavaScript 前端开发
JS中数组22种常用API总结,slice、splice、map、reduce、shift、filter、indexOf......
JS中数组22种常用API总结,slice、splice、map、reduce、shift、filter、indexOf......
|
3月前
|
索引
ES5常见的数组方法:forEach ,map ,filter ,some ,every ,reduce (除了forEach,其他都有回调,都有return)
ES5常见的数组方法:forEach ,map ,filter ,some ,every ,reduce (除了forEach,其他都有回调,都有return)
|
6月前
|
Python
高阶函数如`map`, `filter`, `reduce`和`functools.partial`在Python中用于函数操作
【6月更文挑战第20天】高阶函数如`map`, `filter`, `reduce`和`functools.partial`在Python中用于函数操作。装饰器如`@timer`接收或返回函数,用于扩展功能,如记录执行时间。`timer`装饰器通过包裹函数并计算执行间隙展示时间消耗,如`my_function(2)`执行耗时2秒。
38 3
|
6月前
|
存储 安全 测试技术
【Go语言精进之路】构建高效Go程序:了解map实现原理并高效使用
【Go语言精进之路】构建高效Go程序:了解map实现原理并高效使用
69 3
|
3月前
|
JavaScript 前端开发
js map和reduce
js map和reduce
|
5月前
|
人工智能 算法 大数据
算法金 | 推导式、生成器、向量化、map、filter、reduce、itertools,再见 for 循环
这篇内容介绍了编程中避免使用 for 循环的一些方法,特别是针对 Python 语言。它强调了 for 循环在处理大数据或复杂逻辑时可能导致的性能、可读性和复杂度问题。
60 6
算法金 | 推导式、生成器、向量化、map、filter、reduce、itertools,再见 for 循环
|
4月前
|
分布式计算 Python
【python笔记】高阶函数map、filter、reduce
【python笔记】高阶函数map、filter、reduce
|
5月前
|
JavaScript API
js【最佳实践】遍历数组的八种方法(含数组遍历 API 的对比)for,forEach,for of,map,filter,reduce,every,some
js【最佳实践】遍历数组的八种方法(含数组遍历 API 的对比)for,forEach,for of,map,filter,reduce,every,some
94 1