mapreduce程序调用各个类的功能

转自:http://www.cnblogs.com/z1987/p/5052409.html

1、map类

  map类继承了库类中的Mapper,即Mapper<KEYIN, VALUEIN, KEYOUT, VALUEOUT>。通常map类中会重写map方法,map每次只接受一个key-value,然后对其进行预处理,再分发出处理后的数据。其map方法为:

protected void map(Object key, Value value, Context context)
        throws IOException, InterruptedException{
    context.write((KEYOUT) key, (VALUEOUT) value);
}

2、Reducer类

  Reducer类继承了类库中的Reducer,原型为Reducer<KEYIN, VALUEIN, KEYOUT, VALUEOUT>,reduce类除了reduce方法不一样外,其他跟map均一样,功能也相同。其reduce方法为:

protected void reduce(Text key, Interable<InterWrite> values, Context context)
        throws IOException, InterruptedException {
    for(Interable<IntWritable> value: values) {
        context.write(Text key, IntWritable value;
    }
}

3、mapreduce驱动

  简单来说就是Main函数中的代码,一般情况下包括:

        Configuration conf = new Configuration();
        //获取输入输出文件路径
        String[] otherArgs = new GenericOptionsParser(conf,args).getRemainingArgs();
        if(otherArgs.length != 2){
            System.err.println("Usage WordCount <int> <out>");
            System.exit(2);
        }
        Job job = new Job(conf,"Dedup");
        job.setJarByClass(Dedup.class);          //主类
        job.setMapperClass(Map.class);           //map类
        job.setCombinerClass(Reduce.class);  //job合成类
        job.setReducerClass(Reduce.class);    //reduce类
        job.setOutputKeyClass(Text.class);      //设置job输出数据的key类
        job.setOutputValueClass(Text.class);   //设置job输出数据的value类
        FileInputFormat.addInputPath(job, new Path(otherArgs[0]));     //文件输入
        FileOutputFormat.setOutputPath(job, new Path(otherArgs[1])); //文件输出
        System.exit(job.waitForCompletion(true) ? 0 : 1);
    }

其实这里还包括一个maprecude最小驱动即之调用MiniMapReduceDriver类,

        Job job = new Job(conf,"Dedup");
        job.setJarByClass(Dedup.class);
        FileInputFormat.addInputPath(job, new Path(otherArgs[0]));
        FileOutputFormat.setOutputPath(job, new Path(otherArgs[1]));
        System.exit(job.waitForCompletion(true) ? 0 : 1);

4、InputFormat接口

  InputFormat类的层次结构如下所示。TextInputFormat是InputFormat的默认实现方式,对输入数据中没有明确key-value时很有效,其返回的key表示这行数据的偏移量,value为行的内容。

5、InputSplit类

  默认情况下,FileInputFormat及其子类以64MB(建议Split大小与此相同)为基数拆分文件。通过以块形式处理文件,可以让多个Map任务并行地操作一个文件。对于大文件,就会极大提升性能。map的输入是一个个的输入分片,即为InputSplits。

  InputSplit的子类有FileSplit和CombineFileSplit。两者均包含文件路径、分片开始位置、分片大小、存储分片数据的host列表。但CombineFileSplit是针对小文件,其将很多小文件包在一个InputSplit内,这样就能处理很多小文件了。

  针对某些文件不可切分,则可通过两种方式完成,第一种为将文件最小分片大小设置为大于文件大小,第二种方法为使用FileInputFormat的子类,并重载isSplitable方法,把返回值设置为false。

6、RecordReader类

  InputSplit定义了如何切分工作,RecordReader类则定义了如何加载数据并转换为适合map方法读取的key-value对。其默认输入格式为TextInputFormat。

7、OutputFormat类

  与InputFormat相似,其大多数继承自FileOutFormat,但NullOutputFormat和DBOutputFormat除外。其默认格式为TextOutputFormat。OutputFormat提供了对RecordWriter的实现,从而指定如何序列化数据。RecordWriter类可以处理包含单个键值对的作业,并将结果写入OutputFormat已准备好的位子中。RecordWriter主要通过write和close两个函数实现。write函数从MapReduce作业中取出键值对,并将其字节写入磁盘。close函数会关闭hadoop到输出文件的数据流。

  OutputFormat的层次结构图如下:

8、RecordWriter类

  LineRecordWriter是默认使用的RecordWriter,写入内容包括:key的字节,一个用以定界的制表符,value的字节,一个换行符。

时间: 2024-08-01 18:58:58

mapreduce程序调用各个类的功能的相关文章

ReportServer中提供的程序调用的导出报告功能

http://192.168.1.246/ReportServer/ReportExecution2005.asmx 192.168.1.246是报表地址,要先引用这个webservice using System; using System.Collections.Generic; using System.Linq; using System.Configuration; //using System.Windows.Forms; using System.IO; namespace TSD

记录使用微信小程序的NFC和蓝牙功能读取15693芯片的开发历程

开发目标: (1) 对于Android手机,直接通过微信小程序调用手机的NFC功能,对15693协议的芯片进行读写操作: (2)对于苹果手机(及没有NFC模块的手机),通过微信小程序的蓝牙功能连接到蓝牙/NFC读写器,然后通过蓝牙发送指令操作读写器对15693协议的芯片进行读写操作. DAY #1 上午开了半天会,下午开始开发. 先开发简单的:直接通过Android手机的NFC模块读写芯片.开发思路如下: 1. 首先调用 wx.getHCEState(OBJECT), 判断设备是否支持NFC,如

经测试稳定可用的蓝牙链接通信Demo,记录过程中遇到的问题的思考和解决办法,并整理后给出一个Utils类可以简单调用来实现蓝牙功能

说明:这是本人在蓝牙开发过程中遇到过的问题记录和分析,以及解决办法. 在研究过程中,许多的前人给出的解决方案和思路指导对我相当有帮助,但并非都是可采取的解决方法, 经过本人对这些方法的测试和使用过后,给出自己的理解和解决方案,不一定是正确的,但这些方法的确可以解决问题. 如果有人遇到同样的问题,并且看到我的文章解决,那是我的荣幸. !!!!!!但特别需要说明的是,看的越多,不明白的越多,我的看法可能是完全错误的,这些方法只是暂时解决了我的问题, !!!!!!如果有人发现了我的错误,请私信或评论告

C#1(.net和C#的关系、VS与.net的对应关系、VS2012常用的几种应用程序、C#定义一个类的方法、类页面内容的解释、定义Person的类、调用Person类的方法、命名规范、数值类型)

1..net和C#的关系 .net是一个开发平台,C#是应用在.net平台上的一种语言.   2.VS与.net的对应关系  3.VS2012常用的几种应用程序 第一种是Windows窗体应用程序,也即是我们常用的C/S端的应用软件: 第二种是控制台应用程序,主要是用来学习调试C#代码的(老师上课应用的模式): 第三种是空Web应用程序,建立空的网页模式,B/S模式: 第四种是Web 窗体应用程序,建立后会生成一些常用的网页组件和功能,例如JS.image等,也是B/S模式. 4.C#定义一个类

C#程序调用CodeSoft预先设计好的标签模块实现打印功能

if (this.tbSetLabel.Text.Trim() == "") { MessageBox.Show("请先 Enter 选择标签模板文件!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Error); this.tbSetLabel.Focus(); return; } int VarTag = 0; if (tbVar0.Text.Trim() != "") { Va

程序启动 - 类调用的方法

1.当程序启动时,就会加载项目中所有的类和分类,而且加载后会调用每个类和分类的+load方法.只会调用一次. 2.当第一次使用某个类时,就会调用当前类的+initialize方法 3.先加载父类,再加载子类(先调用父类的+load方法,再调用子类的+load方法) 先初始化父类,再初始化子类(先调用父类的+initialize方法,再调用子类的+initialize方法) 利用Class 创建  Person类对象 利用 Person类对象 创建 Person类型的对象

温故知新之:反射:加载程序集中的类,动态调用

1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Reflection; 5 using System.Text; 6 7 //Net Reflector(收费)官方网址:http://www.red-gate.com/products/dotnet-development/reflector/ 8 //ILSpy/dnSpy [免费]官方网址:http://ilspy.

通过异步程序调用(APC)实现的定时功能

定时器是一个在特定时间或者规则间隔被激发的内核对象.结合定时器的异步程序调用可以允许回调函数在任何定时器被激发的时候执行.本文的例子代码显示了如何实现. 使用本定时器时,你需要把常量_WIN32_WINNT定义为0x0400,并且此常量应该在包之前定义,以确保声明合适的定时器原型函数. 通过调用CreateWaitableTimer()可以创建一个定时器,此函数返回一个指向内核对象的句柄.若定时器已经存在,你可以通过使用 OpenWaitableTimer()获得一个进程相关的句柄.无论是通过C

Windows平台开发Mapreduce程序远程调用运行在Hadoop集群—Yarn调度引擎异常

共享原因:虽然用一篇博文写问题感觉有点奢侈,但是搜索百度,相关文章太少了,苦苦探寻日志才找到解决方案. 遇到问题:在windows平台上开发的mapreduce程序,运行迟迟没有结果. Mapreduce程序 public class Test { public static void main(String [] args) throws Exception{ Configuration conf = new Configuration(); conf.set("fs.defaultFS&qu