彩神大发排列五_神彩大发排列五官方 - 彩神大发排列五,神彩大发排列五官方是新浪网最重要的频道之一,24小时滚动报道国内、国际及社会新闻。每日编发新闻数以万计。

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

  • 时间:
  • 浏览:1

这俩 是Reduce任务的实现,就让将Map任务的输出原样写入到HDFS中。

这俩 类实现比较简单,继承自FileInputFormat不都能不能 实现createRecordReader()方式,返回用来读文件记录的RecordReader,直接使用前面实现的WholeFileRecordReader创建就让实例,但会 调用initialize()方式进行初始化。

这是是守护进程的入口,主就让对MapReduce任务进行配置,只不能设置好对应的配置即可。我们我们我们我们我们我们设置了一个Reduce任务,最终会三个白输出结果文件。

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

运行守护进程

输入的键值对类型,对小文件,每个文件对应就让InputSplit,我们我们我们我们我们我们读取这俩 InputSplit实际上就让具有就让Block的整个文件的内容,将整个文件的内容读取到BytesWritable,也就让就让字节数组。

编程实现

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

现在,看一下我们我们我们我们我们我们不能实现哪此内容:

不能看得人,Reducer阶段生成了一个文件,我们我们我们我们我们我们都不 将小文件合并后的得到的大文件,将会不能对哪此文件进行一些防止,不能再实现满足实际防止的Mapper,将输入路径指定的前面Reducer的输出路径即可。就让一来,对于絮状小文件的防止,转加在了数个大文件的防止,就不能充分利用Hadoop MapReduce计算集群的优势。

一般来说,基于Hadoop的MapReduce框架来防止数据,主就让面向海量大数据,对于类式数据,Hadoop不能使其真正发挥其能力。对于海量小文件,都不 说没法使用Hadoop来防止,只不过直接进行防止数率不要再高,但会 海量的小文件对于HDFS的下发来说,会占用NameNode絮状的内存来保存文件的元数据(Bookkeeping)。另外,将会文件比较小,我们我们我们我们我们我们是指远远小于HDFS默认Block大小(64M),比如1k~2M,都很小了,在进行运算的之前 ,将会无法最大限度地充分Locality特性带来的优势,原因分析分析絮状的数据在集群中传输,开销很大。

但会 ,实际应用中,也存在类式的场景,海量的小文件的防止需求也絮状存在。没法,我们我们我们我们我们我们在使用Hadoop进行计算的之前 ,不能考虑将小数据转加在大数据,比如通过合并压缩等方式,不能使其在一定程度上,不能提高使用Hadoop集群计算方式的适应性。Hadoop也内置了一些防止方式,但会 提供的API,不能很方便地实现。

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

基本思路描述如下:

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

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

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

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