class_docstr: Task to instruct execution of a node in the pipeline.
  
  Attributes:
    node_uid: Uid of the node to be executed.
    execution_id: Id of the MLMD execution associated with the current node.
    contexts: List of contexts associated with the execution.
    exec_properties: Execution properties of the execution.
    input_artifacts: Input artifacts dict.
    output_artifacts: Output artifacts dict.
    executor_output_uri: URI for the executor output.
    stateful_working_dir: Working directory for the node execution.
    tmp_dir: Temporary directory for the node execution.
    pipeline: The pipeline IR proto containing the node to be executed.
    cancel_type: Indicates whether this is a cancelled execution, and the type
      of the cancellation. The task scheduler is expected to gracefully exit
      after doing any necessary cleanup.
code: def get_node(self) -> node_proto_view.NodeProtoView:
      for pipeline_or_node in self.pipeline.nodes:
          view = node_proto_view.get_view(pipeline_or_node)
          if view.node_info.id == self.node_uid.node_id:
              return view
      raise ValueError(
          f"Node not found in pipeline IR; node uid: {self.node_uid}"
      )
  
imports: import abc
  import enum
  from typing import Dict, Hashable, List, Optional, Sequence, Type, TypeVar
  import attr
  from tfx import types
  from tfx.orchestration import node_proto_view
  from tfx.orchestration.experimental.core import env
  from tfx.proto.orchestration import pipeline_pb2
  from tfx.utils import status
  from ml_metadata.proto import metadata_store_pb2
label_desc: Use image node_id 2 for calling the ExecNodeTask obj's underlying member method code with example usage: obj.get_node() and returns: view