У меня есть набор 1 млн. XML-файлов, каждый из которых имеет размер ~ 14 КБ в хранилище BLOB-объектов Azure, смонтированных в блоке данных Azure, и я пытаюсь использовать CREATE TABLE
,с ожиданием одной записи для каждого файла.
Эксперимент
Структура содержимого файлов изображена ниже.Для простоты и производительности все содержимое файлов, кроме элемента <ID>
, остается идентичным.
<OBSERVATION>
<HEADER>...</HEADER>
<RESULT>
<ID>...</ID>
<VALUES>...</VALUES>
</RESULT>
</OBSERVATION>
Для анализа / десериализации я использую spark-xml от Databricks.В настоящий момент я ожидаю записи с двумя столбцами HEADER
и RESULT
, что я и получаю.
CREATE TABLE Observations
USING XML
OPTIONS (
path "/mnt/blobstorage/records/*.xml",
rowTag "RESULT",
rootTag "OBSERVATION",
excludeAttribute True
)
Проблема
Оператор CREATE TABLE
выполняется в течение 5,5 часов (SQL-запрос с именем sql at SQLDriverLocal.scala:87
в пользовательском интерфейсе Spark), из которых только 1 час тратится в заданиях Spark (на вкладке Заданияинтерфейса Spark).
Я заметил, что ячейка с командой CREATE TABLE
остается застрявшей на Listing files at "/mnt/blobstorage/records/*.xml"
в течение большей части времени.Сначала я подумал, что это проблема масштабирования в разъеме хранения.Однако я могу запустить команду для ~ 500K файлов JSON аналогичного размера в ~ 25 с ( Проблема с XML против JSON? ).
Я также знаю, что spark-xml
читает все файлы для вывода схемы, что может быть узким местом.Чтобы исключить эту возможность, я попытался:
- предопределить схему (только из первого XML-файла)
- в качестве открытого текста без анализа (с использованием провайдера
TEXT
).Одна и та же проблема сохраняется в обоих случаях.
Один и тот же оператор выполняется в 20 с для 10K записей и в 30 мин для 200K записей.При линейном масштабировании (что, очевидно, не происходит), 1 миллион записей были бы сделаны за ~ 33 минуты .
Мой кластер Databricks имеет 1 рабочий узел и 3 узла драйвера, каждый из которых имеет 256 ГБ ОЗУ и 64 ядер, поэтому не должно быть узкого места в кэшировании.Я успешно воспроизвел проблему в нескольких прогонах в течение 4 дней.
Вопрос
Что я здесь не так делаю?Если есть какие-то разделы / кластеры, которые я могу сделать во время CREATE TABLE
, как мне это сделать?