`

Hadoop传递参数的方法总结

 
阅读更多

 MapReduce程序通常要传递各种各样的参数,选择合适的方式来传递参数既能提高工作效率,也可以避免bug的产生。根据参数的大小,可以粗略的分为以下几种。

最直接的方式就是使用Configuration的各种set方法,对于基本数据类型都有很好的支持,比如传递kmeans聚类算法的中心点个数。

如何传递一个对象型参数?话说所有的对象都是由基本类型构建的,所以我们可以覆盖这个对象的toString()方法,将它的所有元素表示成字符串,然后使用Configuration.set(name, value)传递这个字符串。然后在Mapper端获得这个字符串,做析构。这种朴素的方法有两个缺点。首先,将对象变成字符串会有精度上的损失,比如 double类型转换成字符串,不仅精度有损失,而且8字节的空间用字符串来表示可能会变成几十字节。其次,由于字符串化和反字符串化分散在不同的地方,很容易产生bug,如果修改了这个对象的结构,这种bug产生的几率非常大。既然有这种需求存在,难道hadoop没有提供nice点的方法吗?有,不过在api文档中没有直接说明。

正确的方法是,让这个对象实现Writable接口,使它具有序列化的能力,然后使用org.apache.hadoop.io.DefaultStringifierstore(conf,  obj, keyname)load(conf, keyname, itemclass)静态方法设置和获取这个对象。他的主要思想就是将这个对象序列化成一个字节数组后,用Base64编码成一个字符串,然后传递给 conf, 解析的时候与之类似。

如何传递更大的参数,比如分词用的语料库等等?可以使用hadoop的缓存文件DistributedCache

1、使用configurationset()get()方法,这里的namevalue都是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接口提供了两个方法,writereadFields,分别用来序列化和反序列化,实现该接口的典型例子如下:

 

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 官方中文文档

    在文档的部分内容中,我们看到一系列的段落和代码示例,这些示例主要涵盖了Hadoop Streaming的基本使用方法,包括如何设置环境、编写map和reduce脚本、提交作业以及一些高级用法和优化技巧。 #### 环境配置 文档中...

    Hadoop The Definitive Guide PDF

    ### Hadoop The Definitive Guide知识点总结 #### 1. 了解Hadoop - **数据的重要性**:在当今数字化世界中,数据被视为一种极其宝贵的资源。随着数据量的激增,传统的数据处理方法逐渐显得力不从心。因此,开发出...

    hadoop经典实战教程

    通过以上对Hadoop经典实战教程的学习,我们不仅了解了Hadoop的基本概念和核心组件,还深入了解了HDFS和MapReduce的工作原理,掌握了Hadoop的高级特性和性能优化方法。更重要的是,通过具体案例的分析,读者可以更好...

    hadoop之wordcount例程代码

    总结来说,Hadoop的WordCount例程是一个很好的起点,它揭示了如何利用MapReduce进行大规模数据处理的基本步骤。通过这个例子,学习者可以理解分布式计算的精髓,包括数据拆分、并行处理、结果聚合等概念。在实际应用...

    hadoop权威指南第三版完整版

    - **性能调优**:通过对Hadoop集群的各项参数进行调整,以及优化MapReduce作业的设计,可以显著提高Hadoop集群的处理效率。 - **数据本地性**:Hadoop作业调度时优先选择与数据节点距离较近的任务执行器,可以减少...

    Hadoop常用命令

    其中`jobMainClass`是主类名,`jobArgs`是传递给主类的参数。 - **job -kill**: 终止正在运行的作业。 ```bash sh bin/hadoop job -kill job_201005310937_0053 ``` ### 命令总结 以上命令涵盖了Hadoop中最...

    运行hadoop jar

    4. **运行hadoop jar命令**:使用命令行输入`hadoop jar <jar_file> <main_class> [args...]`,其中`<jar_file>`是你创建的JAR文件,`<main_class>`是你的程序的主类,`[args...]`是传递给主类的参数。例如,如果你...

    完整版大数据云计算课程 Hadoop数据分析平台系列课程 Hadoop 05 Hadoop API开发 共32页.pptx

    在主类中,`Run`方法定义了任务的运行参数,而`Main`函数则是启动MapReduce任务的入口点。 【数据筛选示例】 课程中提供了一个具体的案例,即从路由日志中提取MAC地址和时间。Map函数将读取数据,根据需求进行处理...

    hadoop之map/reduce

    Reducer的目的是为了对Mapper的输出进行总结或聚合,通常用于计算总计、平均值或者找出最大最小值等。 在上述的项目结构中,MapReduce程序被分为三个模块:ebsdi-core、ebsdi-domain和ebsdi-apps。ebsdi-core包含...

    HadoopStreaming编程.doc

    总结,Hadoop Streaming为开发者提供了灵活的MapReduce编程模型,使非Java语言也能在Hadoop环境中发挥威力。通过理解其工作原理和使用技巧,开发者可以构建高效、适应性强的分布式应用。对于更多高级特性和优化技巧...

    Hadoop Map Reduce教程

    - **配置**:通过 `Configuration` 类来设置各种参数,如输入输出路径、Mapper 和 Reducer 类以及文件分割策略等。 - **自定义类**:用户可以自定义 `InputFormat` 和 `OutputFormat` 类来控制输入输出格式。 #### ...

    Hadoop Shell命令

    - `[args]`:传递给主类的参数。 **示例**: ``` hadoop jar /path/to/your/job.jar com.example.WordCount /input /output ``` **注意事项**:确保jar文件正确无误,并且输入输出路径不存在冲突。 ##### 5. `...

    基于Hadoop的云计算试验平台搭建研究.docx

    总结来说,基于Hadoop的云计算试验平台搭建研究涵盖了虚拟化技术、Linux操作系统、Java环境、Hadoop框架的安装配置以及故障恢复等多个方面,是大数据处理和云计算教学及研发的重要实践环节。通过这个平台,不仅可以...

    简单的MapReduce程序(Hadoop2.2.0)

    为了运行这个"MaxTemperature"程序,你需要配置Hadoop环境,包括设置HADOOP_HOME环境变量,配置hadoop-site.xml以指定HDFS和YARN的相关参数。然后,你可以使用Hadoop的`hadoop jar`命令提交Job,指定包含MapReduce...

    hadoop_kafka_2.11-0.11.0.0.rar linux用

    总结来说,这个压缩包提供了在Linux环境中搭建和使用Hadoop 2.11与Kafka 0.11.0.0的基础,涵盖了大数据处理和实时流处理的关键技术。学习这些内容不仅能够帮助你理解大数据基础设施的工作原理,还能提升你在大数据...

    大数据--Hadoop MapReduce

    - 输出的结果会被排序后传递给Reduce阶段。 2. **Reduce阶段**: - 对Map阶段产生的中间结果进行汇总,得到最终输出。 - Reduce函数同样接收键值对形式的输入,并将相同键的所有值合并处理。 - 减少输出数据量...

    Hadoop技术内幕:深入解析MapReduce架构设计i与实现原理

    每个键的所有值都会被传递给同一个Reduce函数,进行聚合或总结操作,从而得出最终结果。 5. **容错机制**:Hadoop的MapReduce框架具有强大的容错性。如果某个节点失败,其上的任务会被重新调度到其他节点执行,确保...

Global site tag (gtag.js) - Google Analytics