写MapReduce程序的时候通常需要向Map中传递参数,比如在Map中过滤数据时往往需要一个过滤列表,传入的参数即为一个过滤数据的集合。
Hadoop参数传递有一种比较简单的方法,即使用Configuration的set()和get()方法:
void Configuration.set(String key, String value)
String Configuration.get(String key)
这种简单的方法的缺陷是,传递的值必须是String类型,具有一定的局限性。
还有一种可以传递对象参数的方法,需要让对象继承让这个对象实现Writable接口,使它具有序列化的能力,然后使用 org.apache.hadoop.io.DefaultStringifier的store(conf, obj, keyname)和load(conf, keyname, itemclass)静态方法设置和获取这个对象。他的主要思想就是将这个对象序列化成一个字节数组后,用Base64编码成一个字符串,然后传递给 conf, 解析的时候与之类似。Writable接口提供两个方法,write和readFields,分别用来序列化和反序列化。这种方法实现比较复杂,一些结构复杂的对象(如Fileds中包括Set集合等)则很难实现write和readFields方法。
因此,笔者采用以下方法传递参数:首先将对象进行序列化(采用Java原生的序列化方法),然后将序列化后的对象转成String类型,使用Configuration进行set。恢复时,将对象进行反序列化(也是Java原生的反序列化方法)即可,示例如下:
对象Ad:
public class Ad implements Serializable {
private long adId;
private Set<Long> productKeywordsSet;
private Set<Long> otherKeywordsSet;
…
}
对象AdList:
public class AdList implements Serializable {
private List<Ad> adList;
…
}
现需要传递AdList对象,配置JobConf的代码如下:
JobConf conf = new JobConf(Hadoop.class);
AdList adList = new AdList();
ByteArrayOutputStream bout = new ByteArrayOutputStream();
ObjectOutputStream out = new ObjectOutputStream(bout);
out.writeObject(adList);
out.flush();
out.close();
String s = bout.toString("ISO-8859-1");
s = URLEncoder.encode(s, "UTF-8");
conf.set("conf", s);
在Mapper端获取AdList对象如下:
public static class HadoopMap extends MapReduceBase
implementsMapper<LongWritable, Text, Text, LongWritable>, JobConfigurable{
private static AdList adList = null;
public void configure(JobConf conf){
String s = conf.get("conf");
try {
s = URLDecoder.decode(s, "UTF-8");
ObjectInputStream in =
new ObjectInputStream(new ByteArrayInputStream(s.getBytes("ISO-8859-1")));
adList = (AdList)in.readObject();
in.close();
} catch (Exception e) {
e.printStackTrace();
}
}
public void map(LongWritable key, Text value, OutputCollector<Text, LongWritable> output, Reporter reporter) throws IOException{
…
}
}
Configuration的get与set方法对于传递的参数有内存的限制,若传递的参数内存过大,则任务会运行失败。若要传递一个很大的数据(比如一个词典文件),则可以使用一个分布式Cache的方法。首先需要向hdfs文件系统中上传(put)一个分布式文件,然后在Configure中读取文件,示例如下:
字典文件dictory.list格式如下:
apple
bag
cat
…
配置JobConf的代码如下:
JobConf conf = new JobConf(Hadoop.class);
DistributedCache.addCacheFile(new Path(“dictory.list”).toUri(), conf);
在Mapper端读取文件如下:
public static class HadoopMap extends MapReduceBase
implementsMapper<LongWritable, Text, Text, LongWritable>, JobConfigurable{
private Set<String> dictSet = new HashSet<String>();
public void configure(JobConf conf) {
Path[] pathwaysFiles;
try {
pathwaysFiles = DistributedCache.getLocalCacheFiles(conf);
for (Path path: pathwaysFiles) {
BufferedReader fis = new BufferedReader(new FileReader(path.toString()));
String line = "";
while ((line = fis.readLine()) != null) {
dictSet.add(line);
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
public void map(LongWritable key, Text value, OutputCollector<Text, LongWritable> output, Reporter reporter) throws IOException{
…
}
}
分享到:
相关推荐
DLL文件的作用在于提供了一种方式,使得多个应用程序可以共享同一段代码和数据,从而减少内存占用和磁盘空间。在Hadoop的上下文中,这个dll文件可能包含了与Hadoop通信、数据处理或系统交互所需的特定功能。 Hadoop...
在IT行业中,Hadoop是一个广泛使用的开源框架,主要用于大数据处理和分布式存储。Hadoop 2.7.3是这个框架的一个稳定版本,它包含了多个改进和优化,以提高性能和稳定性。在这个版本中,Winutils.exe和hadoop.dll是两...
在大数据处理领域,Hadoop是一个不可或缺的开源框架,它提供了分布式存储和计算的能力。本文将详细探讨与"Hadoop.dll"和"winutils.exe"相关的知识点,以及它们在Hadoop-2.7.1版本中的作用。 Hadoop.dll是Hadoop在...
在Hadoop生态系统中,`hadoop.dll`和`winutils.exe`是两个关键组件,尤其对于Windows用户来说,它们在本地开发和运行Hadoop相关应用时必不可少。`hadoop.dll`是一个动态链接库文件,主要用于在Windows环境中提供...
Hadoop是Apache软件基金会开发的一个开源分布式计算框架,它允许在普通硬件上高效处理大量数据。在Windows环境下,Hadoop的使用与Linux有所不同,因为它的设计最初是针对Linux操作系统的。"winutils"和"hadoop.dll...
Hadoop 是一个处理、存储和分析海量的分布式、非结构化数据的开源框架。最初由 Yahoo 的工程师 Doug Cutting 和 Mike Cafarella Hadoop 是一个处理、存储和分析海量的分布式、非结构化数据的开源框架。最初由 Yahoo...
在IT行业中,Hadoop是一个广泛使用的开源框架,主要用于大数据处理和分布式存储。Hadoop 2.7.3是Hadoop发展中的一个重要版本,它包含了众多的优化和改进,旨在提高性能、稳定性和易用性。在这个版本中,`hadoop.dll`...
在Hadoop生态系统中,Hadoop 2.7.7是一个重要的版本,它为大数据处理提供了稳定性和性能优化。Hadoop通常被用作Linux环境下的分布式计算框架,但有时开发者或学习者在Windows环境下也需要进行Hadoop相关的开发和测试...
在Hadoop生态系统中,`hadoop.dll`和`winutils.exe`是两个关键组件,尤其对于Windows用户来说。本文将详细介绍这两个文件以及它们在Hadoop 2.6.0版本中的作用。 `hadoop.dll`是Hadoop在Windows环境下运行所必需的一...
Hadoop是一个由Apache基金会所开发的分布式系统基础架构。用户可以在不了解分布式底层细节的情况下,开发分布式程序。充分利用集群的威力进 Hadoop是一个由Apache基金会所开发的分布式系统基础架构。用户可以在不...
标题 "hadoop2.6 hadoop.dll+winutils.exe" 提到的是Hadoop 2.6版本中的两个关键组件:`hadoop.dll` 和 `winutils.exe`,这两个组件对于在Windows环境中配置和运行Hadoop至关重要。Hadoop原本是为Linux环境设计的,...
在IT行业中,Hadoop是一个广泛使用的开源框架,主要用于大数据处理和分布式存储。它是由Apache软件基金会开发并维护的,旨在实现高效、可扩展的数据处理能力。Hadoop的核心由两个主要组件构成:Hadoop Distributed ...
在Windows操作系统中,DLL文件是程序共享函数库的实现方式,多个程序可以调用同一份代码,从而节省内存并便于更新。`hadoop.dll`通常包含了Hadoop的Java Native Interface (JNI)实现,使得Java代码能够调用C或C++...
在Windows环境下安装Hadoop 3.1.0是学习和使用大数据处理技术的重要步骤。Hadoop是一个开源框架,主要用于分布式存储和处理大规模数据集。在这个过程中,我们将详细讲解Hadoop 3.1.0在Windows上的安装过程以及相关...
Hadoop课程实验和报告——Hadoop安装实验报告 Hadoop是一个开源的大数据处理框架,由Apache基金会开发和维护。它提供了一种可靠、可扩展、可高效的方法来存储和处理大规模数据。在本实验报告中,我们将介绍Hadoop的...
Hadoop是Apache软件基金会开发的一个开源分布式计算框架,主要由HDFS(Hadoop Distributed File System)和MapReduce两大部分组成,旨在提供一种可靠、可扩展、高效的数据处理和存储解决方案。在标题中提到的...
在Hadoop生态系统中,`winutils.exe`和`hadoop.dll`是Windows环境下运行Hadoop必备的组件,尤其对于开发和测试环境来说至关重要。这里我们深入探讨这两个组件以及与Eclipse插件的相关性。 首先,`winutils.exe`是...
在IT行业中,Hadoop是一个广泛使用的开源框架,主要用于大数据处理和分布式存储。Hadoop2.6.0是这个框架的一个重要版本,它包含了多项优化和改进,以提高系统的稳定性和性能。在这个压缩包中,我们关注的是与Windows...
《Hadoop Eclipse Plugin:开发利器的进化》 在大数据领域,Hadoop作为开源分布式计算框架,扮演着核心角色。为了方便开发者在Eclipse或MyEclipse这样的集成开发环境中高效地进行Hadoop应用开发,Hadoop-Eclipse-...