Как заставить инкрементное задание Foundry Transforms создавать неинкрементно, не нарушая семантическую версию?

Как я могу заставить конкретный набор данных строиться без инкремента без изменения семантической версии в репозитории преобразований?

Подробная информация о нашем конкретном случае использования:

У нас есть около 50 наборов данных, определенных одним инкрементным питоном с помощью ручной регистрации и цикла for. Входными данными для этого преобразования могут быть от 100 до 10000 небольших файлов gzip, поэтому, когда запускается более крупный набор данных, он в конечном итоге разделяет все это на несколько файлов паркета хорошего размера, что идеально подходит для наших последующих задач. Однако после того, как это задание выполнялось инкрементно в течение нескольких месяцев (с файлами, поступающими каждый час), в выходных данных также будет большое количество небольших файлов паркета. Мы хотели бы иметь возможность форсировать сборку моментального снимка этого единственного набора данных без необходимости изменять семантическую версию преобразования, которая запускала бы сборку моментальных снимков для всех 50 наборов данных. Это возможно?

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


person Adil B    schedule 24.09.2020    source источник


Ответы (4)


Зафиксируйте пустую транзакцию добавления в выходной набор данных.

person Parker Stone    schedule 24.09.2020

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

Для этого я использую оболочку при объявлении своих преобразований (в моем случае преобразований java, но это применимо аналогично python), которая добавляет дополнительный вход к моему преобразованию.

Допустим, вы начинаете с преобразования, которое считывает наборы данных A и B и создает набор данных C. Оболочка вставит в качестве входных данных дополнительный набор данных с именем CSnapshotDataset, а также сгенерирует преобразование, которое создаст этот (пустой) набор данных.

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

Чтобы затем сделать снимок вашего конвейера с заданной точки и далее, например, из набора данных C включительно, вы просто выбираете набор данных моментального снимка Cs (в данном случае CSnapshotDataset) и создаете его. Следующий (запланированный) запуск конвейера сделает снимок C и всего, что находится ниже по течению.

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

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

Хотя это немного больше предварительной работы, чтобы настроить это, основными преимуществами этого являются:

  • Это один щелчок, чтобы запустить моментальный снимок и несколько щелчков, чтобы настроить запланированный снимок, вместо того, чтобы делать несколько curl вызовов
  • Он сохраняет историю транзакций входных и выходных наборов данных в чистоте.
  • Это происходит полностью на платформе, без необходимости извлечения токена, использования командной строки, jenkins или чего-то подобного.
person Jonathan Ringstad    schedule 12.10.2020

Я думаю, ты мог бы

для ввода: input = input.dataframe('current')

для вывода: output.set_mode('replace')

person pietro    schedule 25.09.2020
comment
Пожалуйста, добавьте более подробную информацию о своем ответе и добавьте описание пошаговых вопросов. - person sorosh_sabz; 25.09.2020

Я думаю, вы просто решаете во время выполнения, использовать ли TransformOutput.set_mode() в своем выводе для replace или modify. Таким образом, вы можете решить, основываясь на размере ваших входных данных, хотите ли вы перезаписать или добавить к выходным данным.

person amy.bananagrams    schedule 25.09.2020