public static void generateDAGVizFile()

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);
    }
  }