Коллеги, всем доброго времени суток.
Подскажите плиз теорию. И насколько плохо может быть кластеру от моих клешен)
Задача: Ежедневное выкачивание цен из HANA. Знаем что меняться может только дата действия цены "по". Поэтому было решено партиционировать таблицу по "дата по". И ежедневно сравнивая HANA с HIVE перевыкачивать такие партиции.
Ньюансы:
1. Куча партиций по 1 строке. Когда кто-то делает цену по "2238-12-31" и тому подобное.
2. Партиция в 400млн строк с датой "9999-12-31" (так ведут все активные цены.
Насколько это плохо?
Вопрос по Спарку: Подключаясь по jdbc к HANE и качая партицию в 400млн, я вижу что в HANA "отъедаю" всего 3-4GB памяти. Есть подозрение что Спарк как то качает батчами и в один поток? Что бы можно было покрутить, чтобы ускорить выкачивание? (и не убить ХАНУ)
Я остаюсь при своём мнении, что спарк как некий аналог CDC - не лучший выбор. Слишком много усилий требуется, чтобы вывести на промышленный уровень: сбалансировать производительность, нагрузку на источник и целостность данных.
Если нужно одну таблицу или её часть затянуть на кластер и сразу же работать с этим датасетом, то супер, спарк как раз для этого! Но в остальных случая придётся кастомизировать очень много.
Возвращаясь к вопросу, забирать по партициям - отличная идея, но описанные проблемы наводят на мысль, что партиции надо организовать вовсе не по полю "дата по". С ходу советую делать партиции по времени или дате изменения цены. Возможно, для этого придётся добавить поле со значением sysdate. Если поле добавить нельзя (и это плохо), то выходить на scn/ČSN или что там есть ещё! В этом случае гораздо проще настроить фильтр для дельты, нужно просто брать все, что больше максимального значения этого поля, полученного в ходе предыдущей загрузки. И при ежедневной загрузке нужно будет забирать одну партицию. Или пару-тройку партиций, если был перерыв в загрузке.
Забираемые данные уже можно побить для равномерно загрузки экзекуторов через numPartitions или предикаты. Предикаты гораздо более гибкие, можно указывать почти любые условия, главное - не допустить потери или дублирования записей. Перегруженный метод sparkSession.read.jdbc вам в помощь)
Через опции в этот метод можно передать sessionInitStatement, пригодится, если нужна какая-то подготовка, установка параметров сессии, например, для ретроспективного запроса. И fetchsize там же, в опциях увеличить.