#scala #apache-spark #jdbc #apache-spark-sql
Вопрос:
Ниже приведена моя постановка проблемы,в поисках предложений
1)У меня есть 4-5 кадров данных, которые позволяют считывать данные из источника teradata с помощью API чтения spark jdbc. 2)Эти 4-5 кадров данных объединяются в окончательный кадр данных FinalDF, который использует раздел в случайном порядке 1000
3)Объем моих данных действительно высок ,в настоящее время каждая из задач обрабатывает > 2 ГБ данных
4)Наконец, я записываю FinalDF в файл ORC в HDFS. 5)Запросы,которые я заполняю в фреймы данных с помощью jdbc, я использую предикаты в api jdbc для диапазонов дат.
Мои вопросы, как показано ниже :
1)В то время как он пишет DF как ORC,он внутренне работает как foreachpartition.Например, действие вызывается для каждого раздела, когда он пытается извлечь данные из источника с помощью вызова JDBC?
2)Как я могу повысить производительность процесса с точки зрения,в настоящее время некоторые из моих задач исчезают из-за больших объемов данных в RDDs, и мои этапы приводят к утечке памяти
3)У меня есть ограничение,открывающее слишком много сеансов для источника teradata, так как в исходной базе данных установлен лимит, это останавливает меня при запуске нескольких исполнителей, так как я мог удерживать только 300 одновременных сеансов.
Комментарии:
1. Возможно, вы сможете перераспределить данные (увеличив количество разделов) после их извлечения из БД .
2. Уже используя раздел в случайном порядке 1000,так что мои фреймы данных будут иметь 1000 разделов,если я поднимусь выше, я достигну порога одновременных подключений из источника teradata, следовательно, придерживался 1000
3. возможно, вы можете создать промежуточный этап, записав целые наборы данных в какое-нибудь хранилище объектов, а затем прочитать и перераспределить их в соответствии с вашими требованиями