int writeNewSplits(JobContext job, Path jobSubmitDir) throws IOException,
InterruptedException, ClassNotFoundException {
Configuration conf = job.getConfiguration();
InputFormat<?, ?> input =
ReflectionUtils.newInstance(job.getInputFormatClass(), conf);
List<InputSplit> splits = input.getSplits(job);//获得分片InputSplit
T[] array = (T[]) splits.toArray(new InputSplit[splits.size()]);
// sort the splits into order based on size, so that the biggest
// go first
Arrays.sort(array, new SplitComparator());
JobSplitWriter.createSplitFiles(jobSubmitDir, conf,
jobSubmitDir.getFileSystem(conf), array);
return array.length;
}
该函数的作用是将所有分片(InputSplit)的信息写入到两个文件,job.split
和job.splitmetainfo文件中。由createSplitFiles函数完成核心功能。
所以writeNewSplits这个函数名称的含义是说将分片信息写入到持久存储的文件中,
而所写内容实际上包括分片的原始数据和分片的元数据两部分,分别写到两个文件中
public static <T extends InputSplit> void createSplitFiles(Path jobSubmitDir,
Configuration conf, FileSystem fs, T[] splits)
throws IOException, InterruptedException {
//创建job.split文件,并以流的方式打开该文件
FSDataOutputStream out = createFile(fs,
JobSubmissionFiles.getJobSplitFile(jobSubmitDir), conf);
//将所有分片(InputSplit的实例)的信息都写入job.split文件中
//同时会返回各个分片的原数据信息,放入info数组中
SplitMetaInfo[] info = writeNewSplits(conf, splits, out);
//关闭job.split文件
out.close();
//将info中的split元数据信息写入到job.splitmetainfo文件中
writeJobSplitMetaInfo(fs,JobSubmissionFiles.getJobSplitMetaFile(jobSubmitDir),
new FsPermission(JobSubmissionFiles.JOB_FILE_PERMISSION), splitVersion,
info);
}
InterruptedException, ClassNotFoundException {
Configuration conf = job.getConfiguration();
InputFormat<?, ?> input =
ReflectionUtils.newInstance(job.getInputFormatClass(), conf);
List<InputSplit> splits = input.getSplits(job);//获得分片InputSplit
T[] array = (T[]) splits.toArray(new InputSplit[splits.size()]);
// sort the splits into order based on size, so that the biggest
// go first
Arrays.sort(array, new SplitComparator());
JobSplitWriter.createSplitFiles(jobSubmitDir, conf,
jobSubmitDir.getFileSystem(conf), array);
return array.length;
}
该函数的作用是将所有分片(InputSplit)的信息写入到两个文件,job.split
和job.splitmetainfo文件中。由createSplitFiles函数完成核心功能。
所以writeNewSplits这个函数名称的含义是说将分片信息写入到持久存储的文件中,
而所写内容实际上包括分片的原始数据和分片的元数据两部分,分别写到两个文件中
public static <T extends InputSplit> void createSplitFiles(Path jobSubmitDir,
Configuration conf, FileSystem fs, T[] splits)
throws IOException, InterruptedException {
//创建job.split文件,并以流的方式打开该文件
FSDataOutputStream out = createFile(fs,
JobSubmissionFiles.getJobSplitFile(jobSubmitDir), conf);
//将所有分片(InputSplit的实例)的信息都写入job.split文件中
//同时会返回各个分片的原数据信息,放入info数组中
SplitMetaInfo[] info = writeNewSplits(conf, splits, out);
//关闭job.split文件
out.close();
//将info中的split元数据信息写入到job.splitmetainfo文件中
writeJobSplitMetaInfo(fs,JobSubmissionFiles.getJobSplitMetaFile(jobSubmitDir),
new FsPermission(JobSubmissionFiles.JOB_FILE_PERMISSION), splitVersion,
info);
}
该博客详细介绍了Hadoop中`writeNewSplits`函数的工作原理,该函数将InputSplit分片信息写入到`job.split`和`job.splitmetainfo`文件。首先,通过`InputFormat`获取分片列表并排序,然后使用`createSplitFiles`函数将分片数据写入`job.split`,元数据写入`job.splitmetainfo`。此过程涉及对分片的大小排序、文件创建及信息写入等操作。
1012

被折叠的 条评论
为什么被折叠?



