/* * The Alluxio Open Foundation licenses this work under the Apache License, version 2.0 * (the "License"). You may not use this work except in compliance with the License, which is * available at www.apache.org/licenses/LICENSE-2.0 * * This software is distributed on an "AS IS" basis, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, * either express or implied, as more fully set forth in the License. * * See the NOTICE file distributed with this work for information regarding copyright ownership. */ package alluxio.master.lineage.meta; import alluxio.job.CommandLineJob; import alluxio.job.Job; import alluxio.job.JobConf; import alluxio.master.journal.JournalEntryRepresentable; import alluxio.proto.journal.Journal.JournalEntry; import alluxio.proto.journal.Lineage.LineageEntry; import com.google.common.base.Objects; import com.google.common.base.Preconditions; import java.util.ArrayList; import java.util.Collections; import java.util.List; import javax.annotation.concurrent.NotThreadSafe; /** * A lineage tracks the dependencies imposed by a job, including the input files the job depends on, * and the output files the job generates. */ @NotThreadSafe public final class Lineage implements JournalEntryRepresentable { private final long mId; private final List<Long> mInputFiles; private final List<Long> mOutputFiles; private final Job mJob; private final long mCreationTimeMs; /** * Creates a new instance of {@link Lineage}. * * @param id the lineage id * @param inputFiles the input file ids * @param outputFiles the output file ids * @param job the job */ public Lineage(long id, List<Long> inputFiles, List<Long> outputFiles, Job job) { this(id, inputFiles, outputFiles, job, System.currentTimeMillis()); } /** * Creates a new instance of {@link Lineage}. * * This method should only used by lineage. TODO(yupeng): hide this method * * @param id the lineage id * @param inputFiles the input files * @param outputFiles the output files * @param job the job * @param creationTimeMs the creation time */ public Lineage(long id, List<Long> inputFiles, List<Long> outputFiles, Job job, long creationTimeMs) { mInputFiles = Preconditions.checkNotNull(inputFiles); mOutputFiles = Preconditions.checkNotNull(outputFiles); mJob = Preconditions.checkNotNull(job); mId = id; mCreationTimeMs = creationTimeMs; } /** * @return the input file ids */ public synchronized List<Long> getInputFiles() { return Collections.unmodifiableList(mInputFiles); } /** * @return the output file ids */ public synchronized List<Long> getOutputFiles() { return Collections.unmodifiableList(mOutputFiles); } /** * @return the job */ public Job getJob() { return mJob; } /** * @return the lineage id */ public long getId() { return mId; } /** * @return the creation time */ public long getCreationTime() { return mCreationTimeMs; } /** * Converts the entry to a {@link Lineage}. * * @param entry the entry to convert * @return the {@link Lineage} representation */ public static Lineage fromJournalEntry(LineageEntry entry) { List<Long> inputFiles = new ArrayList<>(entry.getInputFilesList()); List<Long> outputFiles = new ArrayList<>(entry.getOutputFileIdsList()); Job job = new CommandLineJob(entry.getJobCommand(), new JobConf(entry.getJobOutputPath())); return new Lineage(entry.getId(), inputFiles, outputFiles, job, entry.getCreationTimeMs()); } @Override public synchronized JournalEntry toJournalEntry() { List<Long> inputFileIds = new ArrayList<>(mInputFiles); List<Long> outputFileIds = new ArrayList<>(mOutputFiles); Preconditions.checkState(mJob instanceof CommandLineJob); CommandLineJob commandLineJob = (CommandLineJob) mJob; String jobCommand = commandLineJob.getCommand(); String jobOutputPath = commandLineJob.getJobConf().getOutputFilePath(); LineageEntry lineage = LineageEntry.newBuilder() .setId(mId) .addAllInputFiles(inputFileIds) .addAllOutputFileIds(outputFileIds) .setJobCommand(jobCommand) .setJobOutputPath(jobOutputPath) .setCreationTimeMs(mCreationTimeMs) .build(); return JournalEntry.newBuilder().setLineage(lineage).build(); } @Override public String toString() { return Objects.toStringHelper(this).add("inputFiles", mInputFiles) .add("outputFiles", mOutputFiles).add("job", mJob).add("id", mId) .add("creationTimeMs", mCreationTimeMs).toString(); } }