Я пытаюсь понять взаимодействие между Spark и Hive metastore. Я начал с того, что посмотрел, когда и какие вызовы делаются из Spark в хранилище метаданных Hive. Я мог видеть кучу get_table
вызовов для spark.read.table
операций, и если таблица разбита на разделы, пару вызовов get_partitions
, когда DataFrame материализуется путем вызова действий. Еще я заметил, что Spark не кэширует определение таблицы. Каждый раз, когда в таблице Hive вызывается действие, определение и соответствующие разделы снова считываются из базового хранилища метаданных !. Я смирился с этим, учитывая, что Spark предоставляет вам другие возможности для go оптимизации для подобных ситуаций, вы можете сохранить DataFrame. Я заметил нечто странное, когда взглянул на шаблон вызова API для операции saveAsTable
. Были вызовы API для создания таблицы и создания разделов, как и ожидалось, но вместе с этим было сделано около 30 get_table
вызовов в хранилище метаданных Hive. Мне действительно странно и трудно понять цель этих звонков.
Я ищу ответы на следующие вопросы.
- Почему Spark не кэширует информацию о таблицах и разделах после их чтения из хранилища метаданных?
- В чем причина такого количества вызовов
get_table
при создании таблицы Hive? - Является ли количество вызовов
get_table
, сделанных при чтении или записи таблицы, функцией количества исполнителей? - Есть ли какие-то улучшения, ожидаем ли мы значительного улучшения производительности за счет оптимизации количества вызовов, сделанных в метастор?