class_docstr: Hook for Google ML Engine APIs.
  
  All the methods in the hook where project_id is used must be called with
  keyword arguments rather than positional.
class_docstr_tok: ["Hook","for","Google","ML","Engine","APIs",".","All","the","methods","in","the","hook","where","project_id","is","used","must","be","called","with","keyword","arguments","rather","than","positional","."]
docstr: Gets a MLEngine job based on the job id.
  
  :param project_id: The project in which the Job is located. If set to None or missing, the default
      project_id from the Google Cloud connection is used. (templated)
  :param job_id: A unique id for the Google MLEngine job. (templated)
  :return: MLEngine job object if succeed.
  :raises: googleapiclient.errors.HttpError
docstr_tok: ["Gets","a","MLEngine","job","based","on","the","job","id",".",":","param","project_id",":","The","project","in","which","the","Job","is","located",".","If","set","to","None","or","missing",",","the","default","project_id","from","the","Google","Cloud","connection","is","used",".","(","templated",")",":","param","job_id",":","A","unique","id","for","the","Google","MLEngine","job",".","(","templated",")",":","return",":","MLEngine","job","object","if","succeed",".",":","raises",":","googleapiclient.errors.HttpError"]
code: def get_job(self, project_id: str, job_id: str) -> dict:
      """
      Gets a MLEngine job based on the job id.
  
      :param project_id: The project in which the Job is located. If set to None or missing, the default
          project_id from the Google Cloud connection is used. (templated)
      :param job_id: A unique id for the Google MLEngine job. (templated)
      :return: MLEngine job object if succeed.
      :raises: googleapiclient.errors.HttpError
      """
      hook = self.get_conn()
      job_name = f"projects/{project_id}/jobs/{job_id}"
      request = hook.projects().jobs().get(name=job_name)
      while True:
          try:
              return request.execute(num_retries=self.num_retries)
          except HttpError as e:
              if e.resp.status == 429:
                  # polling after 30 seconds when quota failure occurs
                  time.sleep(30)
              else:
                  self.log.error("Failed to get MLEngine job: %s", e)
                  raise
  
imports: from __future__ import annotations
  import contextlib
  import logging
  import random
  import time
  from typing import TYPE_CHECKING, Callable
  from aiohttp import ClientSession
  from gcloud.aio.auth import AioSession, Token
  from googleapiclient.discovery import Resource, build
  from googleapiclient.errors import HttpError
  from airflow.exceptions import AirflowException
  from airflow.providers.google.common.hooks.base_google import GoogleBaseAsyncHook, GoogleBaseHook
  from airflow.version import version
label_desc: Use image node_id 6 for calling the MLEngineHook obj's underlying member method code with example usage: obj.get_job(project_id, job_id) and returns: request