JobBuilder

   Hadoop学习有一段时间了,但是缺乏练手的项目,老是学了又忘。想想该整理一个学习笔记啥的,这年头打字比写字方便。果断开博客,咩哈哈~~

    开场白结束(木有文艺细胞)

    默认的MapReduce作业

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.conf.Configured;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapred.FileInputFormat;
import org.apache.hadoop.mapred.FileOutputFormat;
import org.apache.hadoop.mapred.JobClient;
import org.apache.hadoop.mapred.JobConf;
import org.apache.hadoop.mapred.MapRunner;
import org.apache.hadoop.mapred.TextInputFormat;
import org.apache.hadoop.mapred.lib.HashPartitioner;
import org.apache.hadoop.mapred.lib.IdentityMapper;
import org.apache.hadoop.mapred.lib.IdentityReducer;

import org.apache.hadoop.util.Tool;
import org.apache.hadoop.util.ToolRunner;

public class MinimalMapReducewithDefaults extends Configured implements Tool {

    @Override
    public int run(String[] arg0) throws Exception {
        JobConf conf = JobBuilder.parseInputAndOutput(this, getConf(), arg0);
        if (conf == null) {
            return -1;
        }
        conf.setInputFormat(TextInputFormat.class);
        conf.setNumMapTasks(1);
        conf.setMapperClass(IdentityMapper.class);
        conf.setMapRunnerClass(MapRunner.class);

        conf.setMapOutputKeyClass(LongWritable.class);
        conf.setMapOutputValueClass(Text.class);

        conf.setPartitionerClass(HashPartitioner.class);
        conf.setReducerClass(IdentityReducer.class);

        conf.setOutputKeyClass(LongWritable.class);
        conf.setOutputValueClass(Text.class);

        JobClient.runJob(conf);
        return 0;
    }

    /**
     * @param args
     */
    public static void main(String[] args) throws Exception {
        int exitCode = ToolRunner.run(new MinimalMapReducewithDefaults(), args);
        System.exit(exitCode);
        //http://192.168.174.128:9000/user/root/input/Temperature.txt http://192.168.174.128:9000/user/root/output/test00001
    }

    public static class JobBuilder {
        public static JobConf parseInputAndOutput(Tool tool,
                Configuration conf, String[] args) {
            if (args.length != 2) {
                printUsage(tool, "<inout> <output>");
                return null;
            }
            JobConf jobConf = new JobConf(conf, tool.getClass());
            FileInputFormat.addInputPath(jobConf, new Path(args[0]));
            FileOutputFormat.setOutputPath(jobConf, new Path(args[1]));

            return jobConf;
        }

        public static void printUsage(Tool tool, String extraArgsUsage) {
            System.err.printf("Usage: % [genericOptions] %s\n\n", tool
                    .getClass().getSimpleName(), extraArgsUsage);
        }
    }
}

       这些个默认设置都不需要显式的设置,但是需要知道默认设置的是啥,贴出来省的忘记了。要注意的是:

       1) conf.setInputFormat(TextInputFormat.class);  默认的输入格式;

       2) conf.setMapOutputKeyClass(LongWritable.class); conf.setMapOutputValueClass(Text.class); 默认的map输出格式,其实就是将原样输出而已;

       3) conf.setPartitionerClass(HashPartitioner.class); 默认的分区函数,没有特殊操作都会使用这个了。具体算法是:return (key.hashCode()&Integer.Max_VALUE)%numPartitions;

       4) conf.setOutputKeyClass(LongWritable.class); conf.setOutputValueClass(Text.class);还是原样输出的格式。

      输入分片

      一个输入分片(split)是指由单个map处理的输入块,每个map操作之处理一个输入分片。

     包含一个一字节为单位的长度和一组存储位置(即一组主机名)。

     inputsplit由inputformat创建。inputformat负责产生输入分片并将它们分割成记录。

      FileInputFormat类

    所有使用文件作为其数据源的inputformat实现的基类。

     提供两个功能:  1)定义哪些文件包含在一个作业的输入中;

                           2)未输入文件生成分片的实现。

    输入分片大小: 由最小分片大小、最大分片大小、块大小决定。分片大小在[最小分片大小,最大分片大小]区间内,且取最接近块大小的值。

    FileInputFormat的子类:TextInputFormat(默认类型,键是LongWritable类型,值为Text类型,key为当前行在文件中的偏移量,value为当前行本身);

                                     KeyValueTextInputFormat(适合文件自带key,value的情况,只要指定分隔符即可,比较实用);

                                     NLineInputFormat(key为当前行在文件中的偏移量,value为当前行本身,和TextInputFormat不同的是这个类型会为每个mapper指定固定行数的输入分片,N为每个mapper收到的输入行数,

                                     mapred.line.input.format.linespermap属性控制N的值);

                                     SequenceFileInputFormat(使用sequencefile作为map的输入)。

     DBInputFormat类

     数据库输入,在map中使用jdbc操作数据库,由于多个map将并发操作,故最好用于加载小量的数据集。操作数据库一般使用sqoop。

    TextOutputFormat类

    把每条记录写为文本行,每个键值使用制表符分割,(当然也可以使用mapred.textoutputformat.separator属性改变默认的分隔符)与TextOutputFormat对应的输入格式是keyValueTextInputFormat。可以用NullWritable来省略输出的键或者值(或者两个都省略,即相当于

    NullOutputFormat)

    SequenceFileOutputFormat类

    即以SequenceFile的格式输出,如果输出需要作为后续MapReduce作业的输入,这是一种很好的输出格式。格式紧凑,容易被压缩

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值