Большой запрос делает быстрое резервное копирование со многими таблицами - PullRequest
0 голосов
/ 28 мая 2019

В настоящее время я копирую таблицы с чем-то вроде этого:

#!/bin/sh
export SOURCE_DATASET="BQPROJECTID:BQSOURCEDATASET"
export DEST_PREFIX="TARGETBQPROJECTID:TARGETBQDATASET._YOUR_PREFIX"
for f in `bq ls -n TOTAL_NUMBER_OF_TABLES $SOURCE_DATASET |grep TABLE | awk '{print $1}'`
do
  export CLONE_CMD="bq --nosync cp $SOURCE_DATASET.$f $DEST_PREFIX$f"
  echo $CLONE_CMD
  echo `$CLONE_CMD`
done

(скрипт из здесь ), но это занимает ~ 20 минут (из-за ~ 600 таблиц). Может быть, есть другой способ (желательно быстрее), чтобы сделать резервную копию?

1 Ответ

0 голосов
/ 29 мая 2019

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

Но помните, что время резервного копирования будет зависеть от размера ваших таблиц.

Что ж, из-заВы упомянули, что Планирование запросов не вариант для вас, другой вариант, который вы можете попробовать, это запустить вашу команду cp в фоновом режиме, потому что вы работаете с циклом for и выожидая завершения каждого процесса, вместо этого вы можете запустить несколько процессов в фоновом режиме, чтобы повысить производительность.Я сделал простой скрипт для проверки, и он работает!Сначала я провел тест без фонового процесса:

#!/bin/bash
start_global=$(date +'%s');
for ((i=0;i<100;i++))
do
    start=$(date +'%s');
    bq --location=US cp -a -f -n [SOURCE_PROJECT_ID]:[DATASET].[TABLE] 
    [TARGET_PROJECT_ID]:[DATASET].[TABLE] 
    echo "It took  $(($(date +'%s') - $start)) seconds to iteration umber: 
    $i"
done
echo "It took $(($(date +'%s') - $start_global)) seconds to the entire 
process"

У меня уходит около 5 секунд на каждую скопированную таблицу (примерно 160 МБ), поэтому я потратил на этот процесс более менее 10 минут, поэтому я изменил сценарий, чтобы использовать егофоновый процесс:

#!/bin/bash
start_global=$(date +'%s');
for ((i=0;i<100;i++))
do
    bq --location=US cp -a -f -n [SOURCE_PROJECT_ID]:[DATASET].[TABLE] 
    [TARGET_PROJECT_ID]:[DATASET].[TABLE]  &
    pid_1=$!  # Get background process id
done
if  wait $pid_1
then
    echo -e "Processes termination successful"
else
    echo -e "Error"
fi
echo "It took $(($(date +'%s') - $start_global)) seconds to the entire 
process"

Таким образом, я трачу всего 3 минуты, чтобы завершить выполнение.

Вы можете адаптировать эту идею к своей реализации, просто рассмотрите квоты для Заданий копирования, вы можете проверить это здесь .

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