import java.io.DataOutput;
import java.io.IOException;
 
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.conf.Configured;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.io.Writable;
import org.apache.hadoop.mapreduce.InputSplit;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.RecordReader;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.Reducer.Context;
import org.apache.hadoop.mapreduce.TaskAttemptContext;
import org.apache.hadoop.mapreduce.lib.input.CombineFileInputFormat;
import org.apache.hadoop.mapreduce.lib.input.CombineFileRecordReader;
import org.apache.hadoop.mapreduce.lib.input.CombineFileSplit;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.input.FileSplit;
import org.apache.hadoop.mapreduce.lib.input.LineRecordReader;
import org.apache.hadoop.mapreduce.lib.input.SequenceFileRecordReader;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import org.apache.hadoop.util.ReflectionUtils;
import org.apache.hadoop.util.Tool;
import org.apache.hadoop.util.ToolRunner;
 
public class TestCombine extends Configured implements Tool {
    private static class ProvinceMapper extends
            Mapper<Object, Text, Text, Text> {
        @Override
        protected void map(Object key, Text value, Context context)
                throws IOException, InterruptedException {
            System.out.println("value : " + value + " Context " + context);
            context.write(value, value);
        }
    }
 
    private static class ProvinceReducer extends
            Reducer<Text, Text, Text, Text> {
        @Override
        protected void reduce(Text key, Iterable<Text> values, Context context)
                throws IOException, InterruptedException {
            for (Text va : values) {
                System.out.println("reduce " + key);
                context.write(key, key);
            }
        }
    }
     
    public static class CombineSequenceFileInputFormat<K, V> extends CombineFileInputFormat<K, V> { 
        @SuppressWarnings({ "unchecked", "rawtypes" }) 
        @Override 
        public RecordReader<K, V> createRecordReader(InputSplit split, TaskAttemptContext context) throws IOException { 
            return new CombineFileRecordReader((CombineFileSplit)split, context, CombineLineRecordReader.class); 
        } 
    } 
     
    public static class CombineLineRecordReader<K, V> extends RecordReader<K, V> { 
        private CombineFileSplit split; 
        private TaskAttemptContext context; 
        private int index; 
        private RecordReader<K, V> rr; 
       
        @SuppressWarnings("unchecked") 
        public CombineLineRecordReader(CombineFileSplit split, TaskAttemptContext context, Integer index) throws IOException, InterruptedException { 
            this.index = index;
            this.split = (CombineFileSplit) split; 
            this.context = context; 
       
            this.rr = (RecordReader<K, V>) ReflectionUtils.newInstance(LineRecordReader.class, context.getConfiguration()); 
        } 
       
        @SuppressWarnings("unchecked") 
        @Override 
        public void initialize(InputSplit curSplit, TaskAttemptContext curContext) throws IOException, InterruptedException { 
            this.split = (CombineFileSplit) curSplit; 
            this.context = curContext; 
       
            if (null == rr) { 
                rr = ReflectionUtils.newInstance(SequenceFileRecordReader.class, context.getConfiguration()); 
            } 
       
            FileSplit fileSplit = new FileSplit(this.split.getPath(index), 
                    this.split.getOffset(index), this.split.getLength(index), 
                    this.split.getLocations()); 
               
            this.rr.initialize(fileSplit, this.context); 
        } 
       
        @Override 
        public float getProgress() throws IOException, InterruptedException { 
            return rr.getProgress(); 
        } 
       
        @Override 
        public void close() throws IOException { 
            if (null != rr) { 
                rr.close(); 
                rr = null; 
            } 
        } 
       
        @Override 
        public K getCurrentKey() 
        throws IOException, InterruptedException { 
            return rr.getCurrentKey(); 
        } 
       
        @Override 
        public V getCurrentValue() 
        throws IOException, InterruptedException { 
            return rr.getCurrentValue(); 
        } 
       
        @Override 
        public boolean nextKeyValue() throws IOException, InterruptedException { 
            return rr.nextKeyValue(); 
        } 
    } 
 
     
    public int run(String[] args) throws Exception {
        Configuration conf = new Configuration();
         
        Job job = new Job(conf);
        job.setJobName("TestCombine");
        job.setJarByClass(TestCombine.class);
 
        job.setMapperClass(ProvinceMapper.class);
        job.setReducerClass(ProvinceReducer.class);
         
        job.setInputFormatClass(CombineSequenceFileInputFormat.class);
         
        job.setOutputKeyClass(Text.class);
        job.setOutputValueClass(Text.class);
         
        String inpath = "/home/hadoop/tmp/combine";
        String outpath = "/home/hadoop/tmp/combineout";
        Path p = new Path(outpath);
         
        FileSystem fs = FileSystem.get(conf);
        if (fs.exists(p)){
            fs.delete(p);
        }
        FileInputFormat.addInputPaths(job, inpath);
        FileOutputFormat.setOutputPath(job, p);
 
        return job.waitForCompletion(true) ? 0 : 1;
    }
 
    public static void main(String[] args) throws Exception {
        int ret = ToolRunner.run(new TestCombine(), args);
        System.exit(ret);
    }
}

简单 实现CombineFileInputFormat的更多相关文章

  1. 简单实现CombineFileInputFormat

    import java.io.DataOutput; import java.io.IOException; import org.apache.hadoop.conf.Configuration; ...

  2. Hadoop CombineFileInputFormat实现原理及源码分析

    Hadoop适用于少量的大文件场景,而不是大量的小文件场景(这里的小文件通常指文件大小显著小于HDFS Block Size的文件),其主要原因是因为FileInputFormat在为这些小文件生成切 ...

  3. hadoop old API CombineFileInputFormat

    来自:http://f.dataguru.cn/thread-271645-1-1.html 简介 本文主要介绍下面4个方面 1.为什么要使用CombineFileInputFormat 2.Comb ...

  4. 【造轮子】打造一个简单的万能Excel读写工具

    大家工作或者平时是不是经常遇到要读写一些简单格式的Excel? shit!~很蛋疼,因为之前吹牛,就搞了个这东西,还算是挺实用,和大家分享下. 厌烦了每次搞简单类型的Excel读写?不怕~来,喜欢流式 ...

  5. Fabio 安装和简单使用

    Fabio(Go 语言):https://github.com/eBay/fabio Fabio 是一个快速.现代.zero-conf 负载均衡 HTTP(S) 路由器,用于部署 Consul 管理的 ...

  6. node.js学习(三)简单的node程序&&模块简单使用&&commonJS规范&&深入理解模块原理

    一.一个简单的node程序 1.新建一个txt文件 2.修改后缀 修改之后会弹出这个,点击"是" 3.运行test.js 源文件 使用node.js运行之后的. 如果该路径下没有该 ...

  7. 哪种缓存效果高?开源一个简单的缓存组件j2cache

    背景 现在的web系统已经越来越多的应用缓存技术,而且缓存技术确实是能实足的增强系统性能的.我在项目中也开始接触一些缓存的需求. 开始简单的就用jvm(java托管内存)来做缓存,这样对于单个应用服务 ...

  8. 在Openfire上弄一个简单的推送系统

    推送系统 说是推送系统有点大,其实就是一个消息广播功能吧.作用其实也就是由服务端接收到消息然后推送到订阅的客户端. 思路 对于推送最关键的是服务端向客户端发送数据,客户端向服务端订阅自己想要的消息.这 ...

  9. 我的MYSQL学习心得(一) 简单语法

    我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据类型 我的MYSQL学习心得(五) 运 ...

随机推荐

  1. 给table加边框的两种方法

    <!DOCTYPE html><html><head><style>.a { border-spacing: 1px; background-color ...

  2. MySQL数据表中内容大小写区分的设置

    MYSQL在默认的情况下查询是不区分大小写的,例如:    ? 1 2 3 4 5 6 7 mysql> create table t1( -> name varchar(10)); Qu ...

  3. eclipse安卓引入库项目的正确方法

    之前清单文件里theme主题老是改不成库项目里定义好的主题@style/Theme.AppCompat.Light,只能用默认主题@style/AppTheme <application and ...

  4. dip2px

    package com.itheima.zhbj.utils; import android.content.Context; public class DensityUtils { public s ...

  5. mongodb常见问题

    1.count统计结果错误 这是由于分布式集群正在迁移数据,它导致count结果值错误,需要使用aggregate pipeline来得到正确统计结果,例如: db.collection.aggreg ...

  6. hibernate ——联合主键

    接上一篇博客:http://www.cnblogs.com/tengpan-cn/p/5551323.html 主键类不需要写任何注解,表对象类使用@IdClass注解 在表对象类前面加@IdClas ...

  7. J2EE判断重复的数据

    import java.util.ArrayList; import java.util.List; import org.junit.Test; /** * 判断重复的数据 * @author Ya ...

  8. Windows任务管理器中内存使用、虚拟内存区别及与页面文件的关系

    原文地址:Windows任务管理器中内存使用.虚拟内存区别及与页面文件的关系 虚拟内存(VirtualMemory)是Windows管理所有可用内存的方式.对于32位Windows系统,每个进程所用到 ...

  9. Struts2实现国际化

    public class I18nAction extends ActionSupport { private static final long serialVersionUID = -693330 ...

  10. Swift POP+MVVM

    Swift2.0中引入了协议扩展的特性,并且建议开发者一切从协议(Protocol)出发,经过几个月的学习探索,博主发现Swift作为一门面向协议编程(POP)的语言非常适合时下火热的MVVM架构.M ...