Hadoop MapReduce处理海量小文件:自定义InputFormat和RecordReader

  • 时间:
  • 浏览:0
  • 来源:大发5分排列5_极速5分排列3

之类类实现比较简单,继承自FileInputFormat后需要实现createRecordReader()法子,返回用来读文件记录的RecordReader,直接使用前面实现的WholeFileRecordReader创建另有另一个实例,否则调用initialize()法子进行初始化。

实现RecordReader接口,最核心的可是解决好迭代多行文本的内容的逻辑,每次迭代通过调用nextKeyValue()法子来判断是与非 还有可读的文本行,直接设置当前的Key和Value,分别在法子getCurrentKey()和getCurrentValue()中返回对应的值。

另外,亲们设置了”map.input.file”的值是文件名称,以便在Map任务中取出并将文件名称作为键写入到输出。

之类是Reduce任务的实现,可是将Map任务的输出原样写入到HDFS中。

亲们实现另有另一个WholeFileInputFormat,用来控制Mapper的输入规格,其中对于输入过程中解决文本行的读取使用的是自定义的WholeFileRecordReader。当Map任务执行完成后,亲们直接将Map的输出原样输出到HDFS中,使用了另有另一个最简单的IdentityReducer。

现在,看一下亲们需要实现哪些内容:

可需要看了,Reducer阶段生成了另一个文件,亲们需要将小文件合并后的得到的大文件,否则需要对哪些文件进行之类解决,可需要再实现满足实际解决的Mapper,将输入路径指定的前面Reducer的输出路径即可。从前一来,对于极少量小文件的解决,转加进去了数个大文件的解决,就不要都上能充分利用Hadoop MapReduce计算集群的优势。

接下来,删改描述上端的几点内容。

编程实现

运行线程运行

这是是线程运行的入口,主可是对MapReduce任务进行配置,只需要设置好对应的配置即可。亲们设置了另一个Reduce任务,最终会有另一个输出结果文件。

这里,亲们的Reduce任务执行的输出格式为SequenceFileOutputFormat定义的,可是SequenceFile,二进制文件。

一般来说,基于Hadoop的MapReduce框架来解决数据,主可是面向海量大数据,对于之类数据,Hadoop不要都上能使其真正发挥其能力。对于海量小文件,需要说如此 使用Hadoop来解决,只不过直接进行解决速率不要高,否则海量的小文件对于HDFS的采集来说,会占用NameNode极少量的内存来保存文件的元数据(Bookkeeping)。另外,否则文件比较小,亲们是指远远小于HDFS默认Block大小(64M),比如1k~2M,都很小了,在进行运算的前一天,否则无法最大限度地充分Locality形状带来的优势,原因极少量的数据在集群中传输,开销很大。

否则,实际应用中,也处在之类的场景,海量的小文件的解决需求也极少量处在。如此 ,亲们在使用Hadoop进行计算的前一天,需要考虑将小数据转加进去大数据,比如通过合并压缩等法子,可需要使其在一定程度上,不要都上能提高使用Hadoop集群计算法子的适应性。Hadoop也内置了之类解决法子,否则提供的API,可需要很方便地实现。

下面,亲们通过自定义InputFormat和RecordReader来实现对海量小文件的并行解决。

基本思路描述如下:

在Mapper中将小文件合并,输出结果的文件中每行由两主次组成,一主次是小文件名称,另一主次是该小文件的内容。

输入的键值对类型,对小文件,每个文件对应另有另一个InputSplit,亲们读取之类InputSplit实际上可是具另有另一个Block的整个文件的内容,将整个文件的内容读取到BytesWritable,也可是另有另一个字节数组。