С помощью gpfdist возможно выполнять трансформацию данных – для этого необходимо написать спецификацию трансформаций с использованием любого подходящего инструмента, создать YAML-файл с конфигурацией и передать его в параметрах утилиты. Это позволяет работать такими форматами данных, как, например, JSON или XML.
При чтении сжатых файлов с расширениями .gz, .bz2 или .zst файлы распаковываются "на лету". Однако необходимо отметить, что работа со сжатыми файлами не поддерживается на платформах Windows.
С параметрами утилиты можно ознакомиться в документации по ссылке https://docs.vmware.com/en/VMware-Greenplum/6/greenplum-database/utility_guide-ref-gpfdist.html
Gploadgpload является скриптом на python для автоматизации ETL-задач c использованием gpfdist и внешних таблиц.
Так как gpload, по сути своей, является оберткой для gpfdist, не будем уделять ему слишком много внимания в рамках данной статьи и лишь отметим основные моменты.
С помощью gpload автоматизируются следующие шаги:
1) Запуск процессов gpfdist
2) Создание временной внешней таблицы на основании данных в файле-источнике и формата, указанного в управляющем файле.
3) Произведение операций INSERT, UPDATE или MERGE для обновления данных в целевой таблице
4) Удаление временной внешней таблицы
5) Завершение процессов gpfdist.
Все действия gpload проходят в рамках одной транзакции.
Для запуска gpload необходимо написать управляющий файл в формате YAML 1.1.
Структура управляющего файла и описание параметров предоставлены в документации по ссылке: https://gpdb.docs.pivotal.io/6-3/utility_guide/ref/gpload.html
Best PracticesДля повышения производительности загрузки и последующих запросов существуют некоторые рекомендации:
- Удаляйте индексы перед загрузкой. Создание индекса быстрее, чем постепенное обновление при добавлении строк. При необходимости можно увеличить значение параметра конфигурации maintenance_work_mem на время построения индекса. Однако, это может повлиять на скорость загрузки. Удалять и создавать индексы стоит только тогда, когда с системой не работают конечные пользователи.
- Если загрузка производилась в хип-таблицу, используйте VACUUM. Также VACUUM следует использовать на системных таблицах. Обязательно используйте ANALYZE на обновленной таблице. Актуальная статистика позволяет оптимизатору принимать наилучшие решения, что оказывает серьезное влияние на производительность запросов.
- Если при загрузке произошла ошибка, воспользуйтесь VACUUM для освобождения места на диске.
- Отключите автоматический сбор статистики на время загрузки, установив значение параметра конфигурации gp_autostats_mode в NONE.
- Распределяйте данные между хостами и запущенными на них инстансами gpfdist максимально равномерно, чтобы не допустить падения производительности из-за одного перегруженного элемента.
Пример загрузкиПредположим, есть таблица fact_example c индексом fact_example_id_idx. В нее необходимо загрузить данные из двух текстовых файлов, example_new_1.txt и example_new_2.txt, оба файла находятся на одном хосте с адресом 192.168.1.10.
Файлы имеют заголовочную строку, NULL-значения представлены пустой строкой ' ', разделителем является знак '|', для перевода строки используется последовательность CR+LF, а кодировкой является UTF-8.
Шаги для загрузки будут такими:
1) Располагаем файлы в различных директориях, например, example_new_1.txt будет располагаться в /var/load_1, а example_new_2.txt в /var/load_2
2) Запускаем в каждой директории на различных портах по инстансу gpfdist.
gpfdist -d /var/load_1 -p 8081
gpfdist -d /var/load_2 -p 8082
3) Создаем внешнюю таблицу