Changes between Version 3 and Version 4 of adanalytics


Ignore:
Timestamp:
11/27/2012 11:38:36 AM (13 years ago)
Author:
liaojiaohe
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • adanalytics

    v3 v4  
    11比较完整的Hadoop应用jar包,包括入口程序,任务和帮助类3部分就够了 
    22 
    3 1. 我们在项目的包的顶级放一个入口程序[[BR]] 
     3'''1. 我们在项目的包的顶级放一个入口程序[[BR]]''' 
    44如 cn.pconline.ad.analytics3.Analyser,入口程序里面有一个ProgramDriver,把任务类加在里面就可以通过命令'' hadoop jar Analyser3.0.jar SumPvClick'' 执行 
    55 
     
    1616}}} 
    1717 
    18 2. hadoop任务是程序包的核心,借用网上两张图说明一下map和reduce的流程[[BR]] 
     18'''2. hadoop任务是程序包的核心'''[[BR]] 
    1919我们的做法是写一个实现Tool接口的基类,其他的任务继承这个基类,有些公共的方法就不用每个重复 
    2020{{{ 
    2121public abstract class JobBase implements Tool 
     22 
    2223}}} 
     24 
     25在每个job里增加main函数,使用 ToolRunner.run 方法调用,这样有些系统的参数如map数量,系统就会先保存到conf里面[[BR]] 
     26传给run的arg都是经过GenericOptionsParser过虑的,在run的方法里面我们可以配置任务各部分需要的类 
     27{{{ 
     28 
     29    public static int main(String[] args) throws Exception { 
     30        return ToolRunner.run(new Configuration(), new RefererUniq(), args); 
     31    } 
     32 
     33@Override   
     34public int run(String[] args) throws Exception {   
     35        Job job = new Job(conf); 
     36        job.setJarByClass(this.getClass()); 
     37        job.setJobName(jobName); 
     38 
     39        job.setOutputKeyClass(Text.class); 
     40        job.setOutputValueClass(IntWritable.class); 
     41        。。。。 
     42 
     43        FileOutputFormat.setOutputPath(job, new Path(userArgs[ARGNAME.WORK.ordinal()])); 
     44 
     45        job.setMapperClass(MyMapper.class); 
     46        job.setCombinerClass(IntSumReducer.class); 
     47        job.setReducerClass(IntSumReducer.class); 
     48        boolean success = job.waitForCompletion(true); 
     49} 
     50}}} 
     51提醒一下新的hadoop mapreduce类在包 org.apache.hadoop.mapreduce.*下[[BR]] 
     52 
    2353 
    2454每个任务的核心是map和reduce,有些类可以使用系统现有的,有些可以项目公用,不过更多的需要每个job里面自己定制,借网上的两张图说明一下map和reduce的流程 
    2555[[Image(map.jpg)]] 
    2656[[Image(reduce.jpg)]] 
     57 
     58InputFormat做Map前的预处理,主要负责以下工作: 
     59验证输入的格式是否符合Configuration的输入定义,这个在实现Map和构建Conf的时候就会知道,不定义可以是Writable的任意子类。[[BR]] 
     60 
     61将input的文件切分为逻辑上的输入InputSplit,其实这就是在上面提到的在分布式文件系统中blocksize是有大小限制的,因此大文件会被划分为多个block。 
     62通过RecordReader来再次处理inputsplit为一组records,输出给Map。[[BR]] 
     63RecordReader处理后的结果作为Map的输入,Map执行定义的Map逻辑,输出处理后的key和value对应到临时中间文件。[[BR]] 
     64更多的输入输例子可以看[/wiki/inputouput/ Hadoop常用输入输出][[BR]] 
     65 
     66 
     67Combiner可选择配置,主要作用是在每一个Map执行完分析以后,在本地优先作Reduce的工作,减少在Reduce过程中的数据传输量。[[BR]] 
     68我们在广告统计pv的时候使用了,这样可以减少总体排序的数量和网络上数据传输量[[BR]] 
     69CombinerClass可以和reduce类相同也可以不同 
     70{{{ 
     71        job.setMapperClass(MyMapper.class); 
     72        job.setCombinerClass(IntSumReducer.class); 
     73        job.setReducerClass(IntSumReducer.class); 
     74}}} 
     75 
     76 
     77Partitioner可选择配置,主要作用是在多个Reduce的情况下,指定Map的结果由某一个Reduce处理,每一个Reduce都会有单独的输出文件。[[BR]] 
     78主要使用场景是想一次读文件,得到多样的结果,比如读广告的原始文件,希望一次得到所有唯一的ip和唯一的uv可以使用这种[[BR]] 
     79但如果搞得太复杂会影响程序的可读性,增加判断肯定会影响job的速度,有时候我宁愿多读一次输入。[[BR]] 
     80 
     81 
     82Reduce执行具体的业务逻辑,并且将处理结果输出给OutputFormat。[[BR]] 
     83一个简单的reduce里面,要注意的是reduce的迭代器只能读取一次Iterable<IntWritable> values,如果你要遍历所有values,要注意会不会OOM。 
     84{{{ 
     85    /** 
     86     * 累计value的reducer类 
     87     * @param <K>  
     88     */ 
     89    public static class IntSumReducer<K> 
     90            extends Reducer<K, IntWritable, K, IntWritable> { 
     91 
     92        private IntWritable result = new IntWritable(); 
     93 
     94        @Override 
     95        public void reduce(K key, Iterable<IntWritable> values, 
     96                Context context) throws IOException, InterruptedException { 
     97            int sum = 0; 
     98            for (IntWritable val : values) { 
     99                sum += val.get(); 
     100            } 
     101            result.set(sum); 
     102            context.write(key, result); 
     103        } 
     104    } 
     105}}} 
     106 
     107 
     108OutputFormat的职责是,验证输出目录是否已经存在,同时验证输出结果类型是否如Config中配置,最后输出Reduce汇总后的结果。[[BR]] 
     109除非你要改变hadoop的输出规则,否则建议不需要自己写这部分,使用系统的就可以了,我们曾经试图把输出写到同一个文件上,这样hadoop只能使用单个的reduce 
     110完成job的时间也是极慢的。 
     111更多的输入输例子可以看[/wiki/inputouput/ Hadoop常用输入输出][[BR]]