функция Google Cloud: Ошибка: превышен лимит памяти. Вызов функции был прерван, но он работает

#google-cloud-platform #google-cloud-functions

# #google-cloud-platform #google-cloud-функции

Вопрос:

Я создал новую функцию Google на python, которая планирует запрос в BigQuery каждые 10 минут, я тестирую ее, и она работает.

  • развертывание работает нормально
  • тестирование выдает эту ошибку: Ошибка: превышен лимит памяти. журналы недоступны (но я вижу, что запрос выполнялся так, как ожидалось в BigQuery)
  • используя http-триггер в облачном планировщике, я получил сбой с сообщением об ошибке статус: 503, но опять же, я вижу в консоли BigQuery, он работает, как ожидалось

редактировать: здесь код для функции

 from google.cloud import bigquery


    def load(request):
        client = bigquery.Client()
        dataset_id = 'yyyyyyyy'
        table_id='xxxxxxxxxxx'
        job_config = bigquery.QueryJobConfig()
        job_config.use_legacy_sql = False
        table_ref = client.dataset(dataset_id).table(table_id)
        job_config.destination = table_ref
        job_config.write_disposition = bigquery.WriteDisposition.WRITE_TRUNCATE
        sql = """
            SELECT * FROM `xxxxxx.datastudio.today_view`;
        """
    
        query_job = client.query(sql,location='asia-northeast1',job_config=job_config)
        query_job.result()
        print("Job finished.")
 

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

1. Можете ли вы добавить какой-нибудь пример кода этой облачной функции?

2. Я добавил код, пожалуйста, обратите внимание, что код работает

Ответ №1:

Задание BigQuery является асинхронным. Ваша облачная функция запускает его и ожидает завершения. Если функция не работает между ними, это не проблема, 2 службы не связаны.

Если вы делаете это с помощью API, при создании задания (запроса) вы сразу получаете JobID. Затем вам нужно регулярно опрашивать этот идентификатор задания, чтобы узнать его статус. Клиентская библиотека делает то же самое!

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

Но вы также можете не ждать окончания и немедленно выйти (пропустить строку query_job.result() ). Вы сэкономите время обработки облачных функций (бесполезное ожидание) и, следовательно, деньги!

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

1. Я использую тот же код в другой функции, и он работает просто отлично

2. Я получаю эту ошибку, когда удаляю query_job.result() <!DOCTYPE HTML PUBLIC «-//W3C // DTD HTML 3.2 Final//RU»> <заголовок> 500 Внутренняя ошибка сервера </title> <h1> Внутренняя ошибка сервера </h1> <p> Сервер столкнулсявнутренняя ошибка и не удалось выполнить ваш запрос. Либо сервер перегружен, либо в приложении ошибка.</p>

3. У вас нет возврата. добавьте return 'job running',200 в конце, чтобы завершить работу корректно. формат: return <response content>, <HTTP code>