Можно ли отправить задание в кластер с помощью скрипта инициализации в Google Dataproc?

# #google-cloud-dataproc #dataproc

Вопрос:

Я использую Dataproc с 1 заданием на 1 кластере.

Я хотел бы приступить к своей работе, как только кластер будет создан. Я обнаружил, что лучший способ добиться этого-отправить задание с помощью сценария инициализации, как показано ниже.

 function submit_job() {
  echo "Submitting job..."
  gcloud dataproc jobs submit pyspark ...
}
export -f submit_job

function check_running() {
  echo "checking..."
  gcloud dataproc clusters list --region='asia-northeast1' --filter='clusterName = {{ cluster_name }}' |
  tail -n 1 |
  while read name platform worker_count preemptive_worker_count status others
  do
    if [ "$status" = "RUNNING" ]; then
      return 0
    fi
  done
}
export -f check_running

function after_initialization() {
  local role
  role=$(/usr/share/google/get_metadata_value attributes/dataproc-role)
  if [[ "${role}" == 'Master' ]]; then
    echo "monitoring the cluster..."
    while true; do
      if check_running; then
        submit_job
        break
      fi
      sleep 5
    done
  fi
}
export -f after_initialization

echo "start monitoring..."
bash -c after_initialization amp; disown -h
 

возможно ли это? Когда я запустил это в Dataproc, задание не было отправлено…

Спасибо!

Ответ №1:

Рассмотрите возможность использования рабочего процесса Dataproc, он предназначен для рабочих процессов, состоящих из нескольких этапов, создания кластера, отправки задания, удаления кластера. Это лучше, чем действия инициализации, потому что это первоклассная функция Dataproc, там будет ресурс задания Dataproc, и вы сможете просматривать историю.

Комментарии:

1. Спасибо вам за ваш совет! Как вы предлагаете, я счел, что лучше использовать рабочий процесс dataproc вместо действий инициализации.

Ответ №2:

Пожалуйста, подумайте об использовании cloud composer — тогда вы сможете написать один сценарий, который создает кластер, запускает задание и завершает кластер.

Комментарии:

1. Большое вам спасибо за ваш ответ, Дэвид. На самом деле, я не хочу использовать composer, так как он не является экономически эффективным.

Ответ №3:

Я нашел способ. Поместите сценарий оболочки с именем await_cluster_and_run_command.sh в GCS. Затем добавьте следующие коды в сценарий инициализации.

 gsutil cp gs://...../await_cluster_and_run_command.sh /usr/local/bin/
chmod 750 /usr/local/bin/await_cluster_and_run_command.sh
nohup /usr/local/bin/await_cluster_and_run_command.sh amp;>>/var/log/master-post-init.log amp;
 

ссылка: https://github.com/GoogleCloudDataproc/initialization-actions/blob/master/post-init/master-post-init.sh

Комментарии:

1. Рассматривали ли вы рабочий процесс Dataproc? cloud.google.com/dataproc/docs/concepts/workflows/overview

2. Спасибо вам за ваши комментарии. Я пропустил рабочий процесс Dataproc. Это кажется лучшим вариантом. Я попробую это сделать!