in tez-dag/src/main/java/org/apache/tez/Utils.java [120:227]
public static void generateDAGVizFile(final DAG dag,
final DAGProtos.DAGPlan dagPB,
final String[] logDirs, final @Nullable DAGScheduler scheduler) {
TezDAGID dagId = dag.getID();
HashMap<String, Vertex> nameToVertex = null;
if (scheduler != null) {
nameToVertex = new HashMap<>(dag.getVertices().size());
for (Vertex v: dag.getVertices().values()) {
nameToVertex.put(v.getName(), v);
}
}
Graph graph = new Graph(sanitizeLabelForViz(dagPB.getName()));
for (DAGProtos.VertexPlan vertexPlan : dagPB.getVertexList()) {
StringBuilder nodeLabel = new StringBuilder(
sanitizeLabelForViz(vertexPlan.getName())
+ "[" + getShortClassName(
vertexPlan.getProcessorDescriptor().getClassName()));
if (scheduler != null) {
Vertex vertex = nameToVertex.get(vertexPlan.getName());
if (vertex != null) {
try {
int priority = (scheduler.getPriorityLowLimit(dag, vertex)
+ scheduler.getPriorityHighLimit(dag,vertex)) / 2;
nodeLabel.append(", priority=").append(priority).append("]");
} catch (UnsupportedOperationException e) {
LOG.info("The DAG graphviz file with priorities will not"
+ " be generate since the scheduler "
+ scheduler.getClass().getSimpleName() + " doesn't"
+ " override the methods to get the priorities");
return;
}
}
}
Graph.Node n = graph.newNode(sanitizeLabelForViz(vertexPlan.getName()),
nodeLabel.toString());
for (DAGProtos.RootInputLeafOutputProto input
: vertexPlan.getInputsList()) {
Graph.Node inputNode = graph.getNode(
sanitizeLabelForViz(vertexPlan.getName())
+ "_" + sanitizeLabelForViz(input.getName()));
inputNode.setLabel(sanitizeLabelForViz(vertexPlan.getName())
+ "[" + sanitizeLabelForViz(input.getName()) + "]");
inputNode.setShape("box");
inputNode.addEdge(n, "Input"
+ " [inputClass=" + getShortClassName(
input.getIODescriptor().getClassName())
+ ", initializer=" + getShortClassName(
input.getControllerDescriptor().getClassName()) + "]");
}
for (DAGProtos.RootInputLeafOutputProto output
: vertexPlan.getOutputsList()) {
Graph.Node outputNode = graph.getNode(sanitizeLabelForViz(
vertexPlan.getName())
+ "_" + sanitizeLabelForViz(output.getName()));
outputNode.setLabel(sanitizeLabelForViz(vertexPlan.getName())
+ "[" + sanitizeLabelForViz(output.getName()) + "]");
outputNode.setShape("box");
n.addEdge(outputNode, "Output"
+ " [outputClass=" + getShortClassName(
output.getIODescriptor().getClassName())
+ ", committer=" + getShortClassName(
output.getControllerDescriptor().getClassName()) + "]");
}
}
for (DAGProtos.EdgePlan e : dagPB.getEdgeList()) {
Graph.Node n = graph.getNode(sanitizeLabelForViz(
e.getInputVertexName()));
n.addEdge(graph.getNode(sanitizeLabelForViz(
e.getOutputVertexName())),
"["
+ "input=" + getShortClassName(e.getEdgeSource().getClassName())
+ ", output=" + getShortClassName(
e.getEdgeDestination().getClassName())
+ ", dataMovement=" + e.getDataMovementType().name().trim()
+ ", schedulingType="
+ e.getSchedulingType().name().trim() + "]");
}
String outputFile = "";
if (logDirs != null && logDirs.length != 0) {
outputFile += logDirs[0];
outputFile += File.separator;
} else {
LOG.warn("DAGVizFile will be created under current (.) directory: {},"
+ " which is not expected and recommended", new File(".").getAbsolutePath());
}
outputFile += dagId.toString();
// Means we have set the priorities
if (scheduler != null) {
outputFile += "_priority";
}
outputFile += ".dot";
try {
LOG.info("Generating DAG graphviz file"
+ ", dagId=" + dagId.toString()
+ ", filePath=" + outputFile);
graph.save(outputFile);
} catch (Exception e) {
LOG.warn("Error occurred when trying to save graph structure"
+ " for dag " + dagId.toString(), e);
}
}