Запрограммируйте Google Apps Script на выдачу ошибки, когда BigQuery «Ресурсы превышены во время выполнения запроса» - PullRequest
1 голос
/ 31 мая 2019

Я использую сценарии для запуска представлений и использую результаты запроса для обновления таблиц в BigQuery. Затем я использую эти таблицы в Data Studio для таблиц / визуализаций.

Проблема, которую я заметил, заключается в том, что иногда мои представления внезапно выдают ошибку «Ресурсы превышены во время выполнения запроса». Однако мой сценарий Google Apps будет успешно выполнен, но таблица останется неизменной, поскольку представление не может быть выполнено. В результате данные в моих визуализациях и таблицах Data Studio будут устаревшими. И у меня не будет возможности узнать это, если я не отредактирую представление и не увижу, что оно выдает ошибку.

Есть ли способ добавить что-то в мой скрипт, чтобы скрипт не работал или уведомил меня, когда Bigquery выдает ошибку «Ресурсы превышены во время выполнения запроса»? Таким образом, у меня не будет бессознательно устаревших данных из-за ошибки.

  var configuration = {
    "query": {
    "useQueryCache": false,
    "destinationTable": {
          "projectId": "abc-123",
          "datasetId": "report_tables",
          "tableId": "dashboard_1"
        },
    "writeDisposition": "WRITE_TRUNCATE",
    "createDisposition": "CREATE_IF_NEEDED",
    "allowLargeResults": true,
    "useLegacySql": false,
    "query": "SELECT * FROM `abc-123.report_tables.dashboard_1_view`"
    }
  };

  var job = {
    "configuration": configuration
  };

  var jobResult = BigQuery.Jobs.insert(job, "abc-123");
  Logger.log(jobResult);
}

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

Спасибо за помощь!

1 Ответ

4 голосов
/ 02 июня 2019

Ваша функция выполняется успешно, потому что все задания / запросы в BigQuery являются асинхронными. Строка var jobResult = BigQuery.Jobs.insert(job, "abc-123"); only отправляет задание / запрос в службу BigQuery, чтобы начать выполнение. Тогда ваша функция возвращает.

Итак, вам нужно подождать и опросить status задания во время его выполнения, а затем устранить любые ошибки, если в результате произойдет сбой с чем-то вроде этого:

  [..]
  var job = BigQuery.Jobs.insert(job, "abc-123");
  Logger.log(job.status.state);
  var jobId = job.jobReference.jobId;

  // Check on status of the Query Job.
  var sleepTimeMs = 500;
  while (job.status.state !== "DONE") {
    Utilities.sleep(sleepTimeMs);
    job = BigQuery.Jobs.get("abc-123", jobId);
    Logger.log(job.status.state);
  }
  if(job.status.errors != null && job.status.errors.length > 0) {
     Logger.log("FAILED:" + job.status.errors);
  } else {
     Logger.log("SUCCEEDED")
  }
  [..]

Пример вывода (сбой):

[19-06-03 19:54:48:557 AEST] RUNNING
[19-06-03 19:54:49:161 AEST] RUNNING
[19-06-03 19:54:49:789 AEST] RUNNING
[19-06-03 19:54:50:368 AEST] RUNNING
[19-06-03 19:54:51:147 AEST] RUNNING
[19-06-03 19:54:51:783 AEST] RUNNING
[19-06-03 19:54:52:356 AEST] RUNNING
[19-06-03 19:54:52:957 AEST] RUNNING
[19-06-03 19:54:53:564 AEST] RUNNING
[19-06-03 19:54:54:151 AEST] RUNNING
[19-06-03 19:54:54:748 AEST] RUNNING
[19-06-03 19:54:55:338 AEST] RUNNING
[19-06-03 19:54:55:954 AEST] RUNNING
[19-06-03 19:54:56:539 AEST] RUNNING
[19-06-03 19:54:57:107 AEST] RUNNING
[19-06-03 19:54:57:724 AEST] RUNNING
[19-06-03 19:54:58:513 AEST] RUNNING
[19-06-03 19:54:59:524 AEST] RUNNING
[19-06-03 19:55:00:144 AEST] RUNNING
[19-06-03 19:55:00:993 AEST] RUNNING
[19-06-03 19:55:01:613 AEST] RUNNING
[19-06-03 19:55:02:219 AEST] RUNNING
[19-06-03 19:55:02:989 AEST] RUNNING
[19-06-03 19:55:03:557 AEST] RUNNING
[19-06-03 19:55:04:123 AEST] RUNNING
[19-06-03 19:55:04:684 AEST] RUNNING
[19-06-03 19:55:05:408 AEST] RUNNING
[19-06-03 19:55:06:018 AEST] RUNNING
[19-06-03 19:55:06:603 AEST] RUNNING
[19-06-03 19:55:07:215 AEST] RUNNING
[19-06-03 19:55:07:789 AEST] RUNNING
[19-06-03 19:55:08:424 AEST] RUNNING
[19-06-03 19:55:08:985 AEST] RUNNING
[19-06-03 19:55:09:580 AEST] RUNNING
[19-06-03 19:55:10:184 AEST] RUNNING
[19-06-03 19:55:10:802 AEST] RUNNING
[19-06-03 19:55:11:391 AEST] RUNNING
[19-06-03 19:55:11:984 AEST] RUNNING
[19-06-03 19:55:12:564 AEST] RUNNING
[19-06-03 19:55:13:154 AEST] RUNNING
[19-06-03 19:55:13:752 AEST] RUNNING
[19-06-03 19:55:14:372 AEST] RUNNING
[19-06-03 19:55:14:974 AEST] RUNNING
[19-06-03 19:55:15:661 AEST] RUNNING
[19-06-03 19:55:16:227 AEST] RUNNING
[19-06-03 19:55:16:815 AEST] RUNNING
[19-06-03 19:55:17:416 AEST] RUNNING
[19-06-03 19:55:18:002 AEST] DONE
[19-06-03 19:55:18:003 AEST] FAILED:{"reason":"resourcesExceeded","message":"Resources exceeded during query execution: The query could not be executed in the allotted memory. Peak usage: 121% of limit.\nTop memory consumer(s):\n  ORDER BY operations: 99%\n  other/unattributed: 1%\n"}

Пример вывода (успех):

[19-06-03 19:59:48:206 AEST] RUNNING
[19-06-03 19:59:48:820 AEST] RUNNING
[19-06-03 19:59:49:433 AEST] RUNNING
[19-06-03 19:59:50:015 AEST] DONE
[19-06-03 19:59:50:016 AEST] SUCCEEDED

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...