Повторяющиеся записи с .Run (ctx) в большом запросе при загрузке файлов из хранилища Google - PullRequest
0 голосов
/ 08 июня 2018

Для каждого раздела мы загружаем файлы в большие запросы каждые 3 минуты, и каждый файл имеет размер около 200 МБ.(.Gz).Иногда я получаю дублирование и не знаю почему.Я уже проверил, что входной файл содержит данные только один раз, и журналы доказывают, что файл был обработан только один раз.Какие могут быть возможные причины дублирования?Есть ли способы предотвратить это перед загрузкой в ​​bigquery?

client, err := bigquery.NewClient(ctx, loadJob.ProjectID, clientOption)
if err != nil {
    return nil, jobID, err
}
defer client.Close()
ref := bigquery.NewGCSReference(loadJob.URIs...)
if loadJob.Schema == nil {
    ref.AutoDetect = true
} else {
    ref.Schema = loadJob.Schema
}
ref.SourceFormat = bigquery.JSON
dataset := client.DatasetInProject(loadJob.ProjectID, loadJob.DatasetID)
if err := dataset.Create(ctx, nil); err != nil {
    // Create dataset if it does exist, otherwise ignore duplicate error
    if !strings.Contains(err.Error(), ErrorDuplicate) {
        return nil, jobID, err
    }
}
loader := dataset.Table(loadJob.TableID).LoaderFrom(ref)
loader.CreateDisposition = bigquery.CreateIfNeeded
loader.WriteDisposition = bigquery.WriteAppend
loader.JobID = jobID
job, err := loader.Run(ctx)
if err != nil {
    return nil, jobID, err
}
status, err := job.Wait(ctx)
return status, jobID, err

1 Ответ

0 голосов
/ 12 июня 2018

Задания загрузки BigQuery являются атомарными.Таким образом, если задание вернулось с успехом, то данные будут гарантированно загружены ровно один раз.

При этом возможно дублирование в случае повторных попыток выполнения задания на сервере как для оригинала, так и для повторной попытки.попытки.

Из фрагмента кода я не уверен, что повторная попытка произойдет в реализации клиента (некоторые клиенты повторяют ту же загрузку, если соединение разрывается. Обычный метод предотвращения дублирования - отправка заданий загрузки BigQuery стот же job_id для тех же данных. Интерфейсы BigQuery будут пытаться дедуплицировать повторные попытки, если исходная отправка все еще выполняется.

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