写MapReduce程序通常要传递各种各样的参数,选择合适的方式来传递参数既能提高工作效率,也可以避免bug的产生。根据参数的大小,可以粗略的分为以下几种。
最直接的方式就是使用Configuration的各种set方法,对于基本数据类型都有很好的支持,比如传递kmeans聚类算法的中心点个数。
如何传递一个对象型参数?话说所有的对象都是由基本类型构建的,所以我们可以覆盖这个对象的toString()方法,将它的所有元素表示成字符串,然后使用Configuration.set(name, value)传递这个字符串。然后在Mapper端获得这个字符串,做析构。这种朴素的方法有两个缺点。首先,将对象变成字符串会有精度上的损失,比如 double类型转换成字符串,不仅精度有损失,而且8字节的空间用字符串来表示可能会变成几十字节。其次,由于字符串化和反字符串化分散在不同的地方,很容易产生bug,如果修改了这个对象的结构,这种bug产生的几率非常大。既然有这种需求存在,难道hadoop没有提供nice点的方法吗?有,不过在api文档中没有直接说明。
正确的方法是,让这个对象实现Writable接口,使它具有序列化的能力,然后使用 org.apache.hadoop.io.DefaultStringifier的store(conf,obj, keyname)和load(conf, keyname, itemclass)静态方法设置和获取这个对象。他的主要思想就是将这个对象序列化成一个字节数组后,用Base64编码成一个字符串,然后传递给 conf, 解析的时候与之类似。
如何传递更大的参数,比如分词用的语料库等等?可以使用hadoop的缓存文件DistributedCache。
1、使用configuration的set()和get()方法,这里的name和value都是String型
Configuration.set(name, value)
Configuration.get(name)
这种方法适合基本数据类型的传递。
2、使用Stringifier 接口。
DefaultStringifier.store(conf, object ,"key");
将object以序列化后以指定的key存在conf中。
object = DefaultStringifier.load(conf, "key", variableClass );
从conf中取出object。
需要指出的是使用第二种方法的对象必须是可序列化的。Hadoop的序列化是通过Writable接口来实现的,在org.apache.hadoop.io包下包含了大量的可序列化的组件,它们都实现了Writable接口,Writable接口提供了两个方法,write和readFields,分别用来序列化和反序列化,实现该接口的典型例子如下:
package com.sanyuan.resource.xml.Entity;
import java.io.DataInput;
import java.io.DataOutput;
import java.io.IOException;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.io.Writable;
public class PublishUrl implements Writable {
private static final long serialVersionUID = 1L;
private Text url;
private Text title;
public PublishUrl(){
this.url = new Text();
this.title = new Text();
}
public Text getUrl() {
return url;
}
public void setUrl(Text url) {
this.url = url;
}
public Text getTitle() {
return title;
}
public void setTitle(Text title) {
this.title = title;
}
@Override
public void readFields(DataInput in) throws IOException {
url.readFields(in);
title.readFields(in);
}
@Override
public void write(DataOutput out) throws IOException {
url.write(out);
title.write(out);
}
3、如果是一些更大的object,是不能放在conf中传递的,这就需要用到DistributedCache或者Hdfs文件系统。
分享到:
相关推荐
在文档的部分内容中,我们看到一系列的段落和代码示例,这些示例主要涵盖了Hadoop Streaming的基本使用方法,包括如何设置环境、编写map和reduce脚本、提交作业以及一些高级用法和优化技巧。 #### 环境配置 文档中...
### Hadoop The Definitive Guide知识点总结 #### 1. 了解Hadoop - **数据的重要性**:在当今数字化世界中,数据被视为一种极其宝贵的资源。随着数据量的激增,传统的数据处理方法逐渐显得力不从心。因此,开发出...
通过以上对Hadoop经典实战教程的学习,我们不仅了解了Hadoop的基本概念和核心组件,还深入了解了HDFS和MapReduce的工作原理,掌握了Hadoop的高级特性和性能优化方法。更重要的是,通过具体案例的分析,读者可以更好...
总结来说,Hadoop的WordCount例程是一个很好的起点,它揭示了如何利用MapReduce进行大规模数据处理的基本步骤。通过这个例子,学习者可以理解分布式计算的精髓,包括数据拆分、并行处理、结果聚合等概念。在实际应用...
- **性能调优**:通过对Hadoop集群的各项参数进行调整,以及优化MapReduce作业的设计,可以显著提高Hadoop集群的处理效率。 - **数据本地性**:Hadoop作业调度时优先选择与数据节点距离较近的任务执行器,可以减少...
其中`jobMainClass`是主类名,`jobArgs`是传递给主类的参数。 - **job -kill**: 终止正在运行的作业。 ```bash sh bin/hadoop job -kill job_201005310937_0053 ``` ### 命令总结 以上命令涵盖了Hadoop中最...
4. **运行hadoop jar命令**:使用命令行输入`hadoop jar <jar_file> <main_class> [args...]`,其中`<jar_file>`是你创建的JAR文件,`<main_class>`是你的程序的主类,`[args...]`是传递给主类的参数。例如,如果你...
在主类中,`Run`方法定义了任务的运行参数,而`Main`函数则是启动MapReduce任务的入口点。 【数据筛选示例】 课程中提供了一个具体的案例,即从路由日志中提取MAC地址和时间。Map函数将读取数据,根据需求进行处理...
Reducer的目的是为了对Mapper的输出进行总结或聚合,通常用于计算总计、平均值或者找出最大最小值等。 在上述的项目结构中,MapReduce程序被分为三个模块:ebsdi-core、ebsdi-domain和ebsdi-apps。ebsdi-core包含...
总结,Hadoop Streaming为开发者提供了灵活的MapReduce编程模型,使非Java语言也能在Hadoop环境中发挥威力。通过理解其工作原理和使用技巧,开发者可以构建高效、适应性强的分布式应用。对于更多高级特性和优化技巧...
- **配置**:通过 `Configuration` 类来设置各种参数,如输入输出路径、Mapper 和 Reducer 类以及文件分割策略等。 - **自定义类**:用户可以自定义 `InputFormat` 和 `OutputFormat` 类来控制输入输出格式。 #### ...
- `[args]`:传递给主类的参数。 **示例**: ``` hadoop jar /path/to/your/job.jar com.example.WordCount /input /output ``` **注意事项**:确保jar文件正确无误,并且输入输出路径不存在冲突。 ##### 5. `...
总结来说,基于Hadoop的云计算试验平台搭建研究涵盖了虚拟化技术、Linux操作系统、Java环境、Hadoop框架的安装配置以及故障恢复等多个方面,是大数据处理和云计算教学及研发的重要实践环节。通过这个平台,不仅可以...
为了运行这个"MaxTemperature"程序,你需要配置Hadoop环境,包括设置HADOOP_HOME环境变量,配置hadoop-site.xml以指定HDFS和YARN的相关参数。然后,你可以使用Hadoop的`hadoop jar`命令提交Job,指定包含MapReduce...
总结来说,这个压缩包提供了在Linux环境中搭建和使用Hadoop 2.11与Kafka 0.11.0.0的基础,涵盖了大数据处理和实时流处理的关键技术。学习这些内容不仅能够帮助你理解大数据基础设施的工作原理,还能提升你在大数据...
- 输出的结果会被排序后传递给Reduce阶段。 2. **Reduce阶段**: - 对Map阶段产生的中间结果进行汇总,得到最终输出。 - Reduce函数同样接收键值对形式的输入,并将相同键的所有值合并处理。 - 减少输出数据量...
每个键的所有值都会被传递给同一个Reduce函数,进行聚合或总结操作,从而得出最终结果。 5. **容错机制**:Hadoop的MapReduce框架具有强大的容错性。如果某个节点失败,其上的任务会被重新调度到其他节点执行,确保...