@Public
@Stable
A base class for file-based InputFormats.
FileInputFormat is the base class for all file-based InputFormats. This provides a generic implementation of getSplits(JobContext). Subclasses of FileInputFormat can also override the isSplitable(JobContext, Path) method to ensure input-files are not split-up and are processed as a whole by Mappers.
类定义public abstract class FileInputFormat<K, V> extends InputFormat<K, V>
核心方法getSplits
/**
* Generate the list of files and make them into FileSplits.
* @param job the job context
* @throws IOException
*/
public List<InputSplit> getSplits(JobContext job) throws IOException {
Stopwatch sw = new Stopwatch().start();
long minSize = Math.max(getFormatMinSplitSize(), getMinSplitSize(job));
long maxSize = getMaxSplitSize(job);
// generate splits
List<InputSplit> splits = new ArrayList<InputSplit>();
List<FileStatus> files = listStatus(job);
for (FileStatus file: files) {
Path path = file.getPath();
long length = file.getLen();
if (length != 0) {
BlockLocation[] blkLocations;
if (file instanceof LocatedFileStatus) {
blkLocations = ((LocatedFileStatus) file).getBlockLocations();
} else {
FileSystem fs = path.getFileSystem(job.getConfiguration());
blkLocations = fs.getFileBlockLocations(file, 0, length);
}
if (isSplitable(job, path)) {
long blockSize = file.getBlockSize();
long splitSize = computeSplitSize(blockSize, minSize, maxSize);
long bytesRemaining = length;
while (((double) bytesRemaining)/splitSize > SPLIT_SLOP) {
int blkIndex = getBlockIndex(blkLocations, length-bytesRemaining);
splits.add(makeSplit(path, length-bytesRemaining, splitSize,
blkLocations[blkIndex].getHosts(),
blkLocations[blkIndex].getCachedHosts()));
bytesRemaining -= splitSize;
}
if (bytesRemaining != 0) {
int blkIndex = getBlockIndex(blkLocations, length-bytesRemaining);
splits.add(makeSplit(path, length-bytesRemaining, bytesRemaining,
blkLocations[blkIndex].getHosts(),
blkLocations[blkIndex].getCachedHosts()));
}
} else { // not splitable
splits.add(makeSplit(path, 0, length, blkLocations[0].getHosts(),
blkLocations[0].getCachedHosts()));
}
} else {
//Create empty hosts array for zero length files
splits.add(makeSplit(path, 0, length, new String[0]));
}
}
// Save the number of input files for metrics/loadgen
job.getConfiguration().setLong(NUM_INPUT_FILES, files.size());
sw.stop();
if (LOG.isDebugEnabled()) {
LOG.debug("Total # of splits generated by getSplits: " + splits.size()
+ ", TimeTaken: " + sw.elapsedMillis());
}
return splits;
}
构建FileSplit对象
/**
* A factory that makes the split for this class. It can be overridden
* by sub-classes to make sub-types
*/
protected FileSplit makeSplit(Path file, long start, long length,
String[] hosts) {
return new FileSplit(file, start, length, hosts);
}
分享到:
相关推荐
1. **创建一个新的类**:首先,你需要创建一个继承自`org.apache.hadoop.mapreduce.InputFormat`的类。这个类将覆盖父类的方法来实现自定义的输入处理逻辑。 2. **实现`getSplits()`方法**:此方法用于将输入数据...
InputFormat是一个抽象类,它的主要职责是定义输入数据的分割方式和如何读取这些分割后的数据。每个具体的InputFormat实现都必须定义自己的getSplits()方法和RecordReader类。getSplits()方法负责将输入数据划分为多...
这通常涉及到创建两个类:RecordReader和InputFormat。RecordReader负责读取数据文件并按需拆分记录,而InputFormat负责初始化RecordReader并确定数据分片(Splits)。 4. **实例代码:按照空格拆分日志文件** ...
本文将深入讲解MapReduce的InputFormat,特别是默认的TextInputFormat以及几种常见的实现类。 FileInputFormat是所有输入格式的基类,它定义了如何将HDFS上的文件拆分成多个InputSplit,每个InputSplit进一步由...
自定义inputFormat&&outputFormat1
在输入阶段,InputFormat文件分割,读取。FileInputFormat从文件中读取数据。InputSplits定义了输入到单个Map任务的输入数据。RecordReader定义了如何从数据上转化为一个(key,value)对,从而输出到Mapper类中。 在...
Hadoop 代码使用方式 job.setInputFormatClass(SmallFileCombineTextInputFormat.class); 当前Maven提加如下依赖 讲无法从reposity中找到直接jar,需手动编译下载...-Dmapreduce.input.fileinputformat.split.maxsize=10
目前似乎没有任何可以支持多行 JSON 的 JSON InputFormat 类。 执照 Apache 许可。 用法 要开始,只需: 下载并运行ant 在您的环境中包含dist/lib/json-mapreduce-1.0.jar 使用MultiLineJsonInputFormat类作为您...
Apache Hive 的 InputFormat,在查询 SequenceFiles 时将返回 (Text) 键和 (Text) 值。 我需要在不拆分内容的情况下完整解析大量文本文件。 HDFS 在处理大型连续文件时提供最佳吞吐量,因此我使用 Apache Mahout 将...
在Java中实现这个功能,我们需要编写一个自定义的InputFormat,继承自Hadoop的FileInputFormat类。这个InputFormat的职责是重写`getSplits()`方法,以便将多个小文件视为一个split,而不是分别对待。同时,我们需要...
4. **数据读取**:TaskTracker上的Task进程通过InputFormat类解析输入数据,将其切分成多个逻辑记录,每个记录对应一个键值对(key-value pair)。 5. **映射阶段(map)**:map任务执行,map函数处理每个键值对,...
MapReduce提供了多种输入处理类,例如InputFormat、FileInputFormat等。这些类提供了不同的输入处理方式,例如读取文件、读取数据库等。 MapReduce序列化 MapReduce提供了序列化机制,可以将,v>对序列化为byte数组...
- **FileInputFormat**:所有基于文件的InputFormat的基础类,定义输入文件的位置。 - **TextInputFormat**:默认的InputFormat,键是行的字节偏移量,值是行内容。 - **KeyValueTextInputFormat**:键和值由特定...
##Couchbase InputFormat 提供什么? 在与 Couchbase Sqoop 连接器搏斗时,发现了一些错误,使其无法与 CDH3 版本正常工作。 从 Couchbase 中提取键/值的实际 InputFormat 存在于 Sqoop 连接器的基于代码中,但对 ...
- FileInputFormat:所有基于文件的InputFormat的基类,用于设置作业的输入文件位置。 - TextInputFormat:默认的InputFormat,key是行的字节偏移量,value是行内容(不包含行终止符)。 - KeyValueTextInputFormat...
例如,JAVA中MapReduce的API通常包括Mapper和Reducer两个主要的抽象类。用户可以通过继承这些类并重写相应的方法来实现自己的MapReduce逻辑。Mapper类处理输入数据并产生中间键值对,而Reducer类则对这些中间键值对...
使用 XML InputFormat 映射 Reduce。 这是一段代码,用于清理 Wiki XML 数据集并将其转换为带分隔符的文本。 从维基百科档案中提取电影数据进行分析。 提供了 Sample.xml。 如果您的 XML 结构发生变化,请查看 ...
OutputFormat 是一个抽象类,需要继承该类并实现其方法来实现自定义的输出格式。 在 Hadoop 中, OutputFormat 的实现类主要有两个:TextInputFormat 和 TextOutputFormat。 TextInputFormat 用于读取文本文件,而...
2. **接口和抽象类**:share包定义了许多接口和抽象类,比如`FileSystem`接口,它是所有Hadoop文件系统操作的基础,包括HDFS、本地文件系统和其他分布式文件系统。此外,还有`InputFormat`和`OutputFormat`接口,...
InputFormat是MapReduce框架基础类之一,负责读取输入数据,将其分割成小块,称为split。InputFormat的主要任务是将输入数据分割成小块,以便于后续的处理。 Split Split是InputFormat的输出结果,每个split包含...