摘要: 1.Writable接口 Hadoop并没有使用JAVA的序列化,而是引入了自己实的序列化系统,packageorg.apache.hadoop.io这个包中定义了大量的可序列化对象,这些对象都实现了Writable接口,Writable接口是序列化对象的一个通用接口.我们来看下Writable接口的定义。publicinterfaceWritable{ voidwrite(DataOutputout)throwsIOException; voidreadFields(DataInputin)throwsIOException;} Writable接口抽象了两个序列化的方法Write和... 阅读全文
posted @ 2014-03-05 23:31 随风888 阅读(210) 评论(0) 推荐(0) 编辑
摘要: 由于Hadoop的MapReduce和HDFS都有通信的需求,需要对通信的对象进行序列化。Hadoop并没有采用Java的序列化(因为Java序列化比较复杂,且不能深度控制),而是引入了它自己的系统。org.apache.hadoop.io中定义了大量的可序列化对象,他们都实现了Writable接口。实现了Writable接口的一个典型例子如下:123456789101112131415161718192021public class MyWritable implements Writable { // Some data private int counter; private long 阅读全文
posted @ 2014-03-05 23:30 随风888 阅读(143) 评论(0) 推荐(0) 编辑
摘要: SequeceFile是Hadoop API提供的一种二进制文件支持。这种二进制文件直接将对序列化到文件中。一般对小文件可以使用这种文件合并,即将文件名作为key,文件内容作为value序列化到大文件中。这种文件格式 有以下好处:1)支持压缩,且可定制为基于Record或Block压缩(Block级压缩性能较优) 2)本地化任务支持:因为文件可以被切分,因此MapReduce任务时数据的本地化情况应该是非常好的。 3)难度低:因为是Hadoop框架提供的API,业务逻辑侧的修改比较简单。坏处是需要一个合并文件的过程,且合并后的文件将不方便查看。SequenceFile 是一个由二进制序列化过的 阅读全文
posted @ 2014-03-05 23:29 随风888 阅读(229) 评论(0) 推荐(0) 编辑
摘要: 转自:http://www.cnblogs.com/lucius/p/3449959.htmlMapTask类继承于Task类,它最主要的方法就是run(),用来执行这个Map任务。 run()首先设置一个TaskReporter并启动,然后调用JobConf的getUseNewAPI()判断是否使用New API,使用New API的设置在前面[Hadoop源码解读](三)MapReduce篇之Job类讲 到过,再调用Task继承来的initialize()方法初始化这个task,接着根据需要执行runJobCleanupTask()、 runJobSetupTask()、runTaskCl 阅读全文
posted @ 2014-03-05 23:26 随风888 阅读(197) 评论(0) 推荐(0) 编辑
摘要: 转自:http://www.cnblogs.com/lucius/p/3449944.html 前面讲了InputFormat,就顺便讲一下Writable的东西吧,本来应当是放在HDFS中的。 当要在进程间传递对象或持久化对象的时候,就需要序列化对象成字节流,反之当要将接收到或从磁盘读取的字节流转换为对象,就要进行反序列化。Writable是Hadoop的序列化格式,Hadoop定义了这样一个Writable接口。1 public interface Writable {2 void write(DataOutput out) throws IOException;3 void re... 阅读全文
posted @ 2014-03-05 23:23 随风888 阅读(239) 评论(0) 推荐(0) 编辑
摘要: 转自:http://www.cnblogs.com/lucius/p/3449922.html 当我们定义一个Counter时,我们首先要定义一枚举类型:1 public static enum MY_COUNTER{2 CORRUPTED_DATA_COUNTER,3 NORMAL_DATA_COUNTER4 };然后,我们就可以在mapper或reducer里面增加它的值:context.getCounter(MY_COUNTER.CORRUPTED_DATA_COUNTER).increment(1);我们在第(一)篇讲InputFormat时,我们有看到Ma... 阅读全文
posted @ 2014-03-05 23:22 随风888 阅读(311) 评论(0) 推荐(0) 编辑
摘要: 转自:http://www.cnblogs.com/lucius/p/3449914.html下面,我们只涉及MapReduce 1,而不涉及YARN。 当我们在写MapReduce程序的时候,通常,在main函数里,我们会像下面这样做。建立一个Job对象,设置它的JobName,然后配置输入输出 路径,设置我们的Mapper类和Reducer类,设置InputFormat和正确的输出类型等等。然后我们会使用 job.waitForCompletion()提交到JobTracker,等待job运行并返回,这就是一般的Job设置过程。JobTracker ... 阅读全文
posted @ 2014-03-05 23:20 随风888 阅读(166) 评论(0) 推荐(0) 编辑
摘要: 转自:http://www.cnblogs.com/lucius/p/3449912.html前面在讲InputFormat的时候,讲到了Mapper类是如何利用RecordReader来读取InputSplit中的K-V对的。 这一篇里,开始对Mapper.class的子类进行解读。 先回忆一下。Mapper有setup(),map(),cleanup()和run()四个方法。其中setup()一般是用来进行一些map()前的 准备工作,map()则一般承担主要的处理工作,cleanup()则是收尾工作如关闭文件或者执行map()后的K-V分发等。run()方法提供了 setup->m 阅读全文
posted @ 2014-03-05 23:14 随风888 阅读(155) 评论(0) 推荐(0) 编辑
摘要: 本文来源于:http://www.cnblogs.com/lucius/p/3449902.html平时我们写MapReduce程序的时候,在设置输入格式的时候,总会调用形如 job.setInputFormatClass(KeyValueTextInputFormat.class);来保证输入文件按照我们想要的格式被 读取。所有的输入格式都继承于InputFormat,这是一个抽象类,其子类有专门用于读取普通文件的FileInputFormat,用来读取数据库 的DBInputFormat等等。 其实,一个输入格式InputFormat,主要无非就是要解决如何将数据分割成分片[比如多少行为一 阅读全文
posted @ 2014-03-05 23:00 随风888 阅读(183) 评论(0) 推荐(0) 编辑