您的位置:首页 > 大数据 > 人工智能

将分片split的信息写入到job.split和splitmetainfo文件中

2013-06-25 20:42 323 查看
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);

  }
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: