Hadoop中MapReduce的一些关键词理解
Map-Reduce几个输入格式的理解:
1 当执行hadoop任务的时候FileInputFormat会得到一个文件夹的路径(需要分析的文件在这个路径中,hadoop默认不会读取子目录)
2 把这些文件进行分片(input split),分片的个数决定Map执行对象的个数,Map越多消耗资源越多
(文件越大,速度越快原因:hdfs有个默认的块大小,一个文件小于默认值,则分为一片如果,文件大小大于默认值,根据块大小进行分块)
3 setInputFormat 设定输入文件内容的分隔格式。
4 几种文件内容格式分隔
输入格式 | 描述 | 键 | 值 |
TextInputFormat | 默认格式,读取文件的行 | 行的字节偏移量 | 行的内容 |
KeyValueInputFormat | 把行解析为键值对 | 第一个tab字符前的所有字符 | 行剩下的内容 |
SequenceFileInputFormat | Hadoop定义的高性能二进制格式 | 用户自定义 | 用户自定义 |
SequenceFileAsTextInputFormat | 是SequenceFileInputFormat的变体,它将键和值转换为Text对象。转换的时候会调用键和值的toString方法。这个格式可以是顺序文件作为流操作的输入。 | ||
SequenceFileAsBinaryInputFormat | SequenceFileAsBinaryInputFormat是SequenceFileInputFormat的另一种变体,它将顺序文件的键和值作为二进制对象,它们被封装为BytesWritable对象,因而应用程序可以任意地将这些字节数组解释为他们想要的类型。 | ||
DBInputForma | DBInputForma是一个使用JDBC并且从关系数据库中读取数据的一种输入格式。由于它没有任何碎片技术,所以在访问数据库的时候必须非常小心,太多的mapper可能会事数据库受不了。因此DBInputFormat最好在加载小量数据集的时候用。 |
二 、几个关键字的理解
1 输入块(inputSplit): 即2中提到的分片 ,它决定了执行速度
2 记录读取器(RecordReader):定义了如何加载数据,并把数据转换为Mapper能够使用的key/value值,它会根据FileInputFormat将数据进行分隔然后传到Map中
3 Mapper :每个Mapper实例在单独的进程中执行并初始化,不同map之间不能通信,使得mapper不受其他maper任务影响。
4 combiner :将相同的key进行合并,value整合成集合,传送给reduce
5 partition& shuffle
shuffle: 将map数据输出到reduce的过程
partition:是reduce的输入分片,相同的key包含一个集合的值,这个key和value在什么位置是有这个决定的,默认的分类器是基于哈希的
6 排序和规约(还不知道具体作用)
7 输出:
part-nnnnn,nnnnn是关联到某个reduce任务的partition的id
输出格式 | 描述 |
TextOutputFormat | 默认的输出格式, 以 "key \t value" 的方式输出行 |
SequenceFileOutputFormat | 输出二进制文件,适合于读取为子MapReduce作业的输入 |
NullOutputFormat | 忽略收到的数据,即不做输出 |
SequenceFileAsBinaryOutputFormat | 与SequenceFileAsBinaryInputFormat相对应,它将键/值对当作二进制数据写入一个顺序文件 |
MapFileOutputFormat | MapFileOutputFormat将结果写入一个MapFile中。MapFile中的键必须是排序的,所以在reducer中必须保证输出的键有序。 |
7 Hadoop提供了一些OutputFormat实例用于写入文件,基本的(默认的)实例是TextOutputFormat,它会以一行一个键值对的方式把数据写入一个文本文件里。这样后面的MapReduce任务就可以通过KeyValueInputFormat类简单的重新读取所需的输入数据了,而且也适合于人的阅读。还有一个更适合于在MapReduce作业间使用的中间格式,那就是SequenceFileOutputFormat,它可以快速的序列化任意的数据类型到文件中,而对应SequenceFileInputFormat则会把文件反序列化为相同的类型并提交为下一个Mapper的输入数据,方式和前一个Reducer的生成方式一样。NullOutputFormat不会生成输出文件并丢弃任何通过OutputCollector传递给它的键值对,如果你在要reduce()方法中显式的写你自己的输出文件并且不想Hadoop框架输出额外的空输出文件,那这个类是很有用的。
RecordWriter:这个跟InputFormat中通过RecordReader读取单个记录的实现很相似,OutputFormat类是RecordWriter对象的工厂方法,用来把单个的记录写到文件中,就像是OuputFormat直接写入的一样。
Reducer输出的文件会留在HDFS上供你的其它应用使用,比如另外一个MapReduce作业,或一个给人工检查的单独程序。