Проблема:
- При чтении из хранилища Azure производительность чтения паркета в Drill, по-видимому, в 5–10 раз ниже, что делает его непригодным для больших рабочих нагрузок.
- Появляетсябыть только проблемой при чтении паркетов.Чтение CSV, с другой стороны, проходит нормально.
Давайте иметь:
- учетная запись хранилища BLOB-объектов Azure с ~ 1 ГБ source.csv и паркетами с теми же данными.
- Azure Premium Файловое хранилище с теми же файлами
- Локальная папка на диске, содержащая те же файлы
- Дрель, работающая на виртуальной машине Azure в одиночном режиме
Конфигурация детализации:
- Плагин хранилища BLOB-объектов Azure, работающий в качестве пространства имен
blob
- Файлы Azure, смонтированные с SMB в / data / dfs, используемые в качестве пространства имен
dfs
- Папка локального диска, используемая в качестве пространства имен
local
ВМ
- Стандартный E4s v3 (4 vcpus, память 32 ГиБ)
- 256 ГБ SSD
- NIC 2 Гбит / с
- 6400 IOPS / 96 МБ / с
Общий доступ к файлам Azure Premium
- 1000 ГБ
- 1000 IOPS base / 3000 IOPS Burst * Пропускная способность 1054 *
- 120 МБ / с
Тесты хранилища
- Измерено с
dd
, 1 ГБ данных, различные размеры блоков, conv = fdatasync - Кэш FS сбрасывается перед каждым тестом чтения (
sudo sh -c "echo 3 > /proc/sys/vm/drop_caches"
)
Локальный диск
+-------+------------+--------+
| Mode | Block size | Speed |
+-------+------------+--------+
| Write | 1024 | 37MB/s |
| Write | 64 | 16MBs |
| Read | 1024 | 70MB/s |
| Read | 64 | 44MB/s |
+-------+------------+--------+
СХД Azure Premium для хранения файлов SMB
+-------+------------+---------+
| Mode | Block size | Speed |
+-------+------------+---------+
| Write | 1024 | 100MB/s |
| Write | 64 | 23MBs |
| Read | 1024 | 88MB/s |
| Read | 64 | 40MB/s |
+-------+------------+---------+
BLOB-объект Azure
Максимальная известная пропускная способность BLOB-объектов Azure составляет 60 МБ / с.Скорость загрузки / выгрузки привязана к целевой скорости чтения / записи в хранилище.
Тесты детализации
- Кэш файловой системы очищался перед каждым тестом чтения.
- Производительность ввода-вывода, наблюдаемая при
iotop
- Запросы были выбраны просто только для демонстрации.Увеличение времени выполнения для более сложных запросов является линейным.
Примеры запросов:
-- Query A: Reading parquet
select sum(`Price`) as test from namespace.`Parquet/**/*.parquet`;
-- Query B: Reading CSV
select sum(CAST(`Price` as DOUBLE)) as test from namespace.`sales.csv`;
Результаты
+-------------+--------------------+----------+-----------------+
| Query | Source (namespace) | Duration | Disk read usage |
+-------------+--------------------+----------+-----------------+
| A (Parquet) | dfs(smb) | 14.8s | 2.8 - 3.5 MB/s |
| A (Parquet) | blob | 24.5s | N/A |
| A (Parquet) | local | 1.7s | 40 - 80 MB/s |
| --- | --- | --- | --- |
| B (CSV) | dfs(smb) | 22s | 30 - 60 MB/s |
| B (CSV) | blob | 29s | N/A |
| B (CSV) | local | 18s | 68 MB/s |
+-------------+--------------------+----------+-----------------+
Наблюдения
- При чтении паркета будет создано больше потоков, но только процесс
cisfd
отнимает производительность ввода-вывода. - Попытка настроить производительность считывателя паркета, как описано здесь , но без каких-либо существенных результатов.
- Существует большой пик выходных данных во время запроса паркетов из хранилища Azure, который в несколько раз превышает размер паркетных данных.Паркет имеет размер ~ 300 МБ, но выходной пик для одного запроса на чтение составляет около 2,5 ГБ.
Заключение
- Чтение паркетов из файлов Azure предназначено длянекоторые причины замедлились до невероятных скоростей.
- Чтение паркетов из BLOB-объекта Azure даже немного медленнее.
- Чтение паркетов из локальной файловой системы довольно быстрое, но не подходит для реального использования.
- Чтение CSV из любого источника обычно использует пропускную способность хранилища, поэтому я предполагаю некоторую проблему / неправильную конфигурацию считывателя паркета.
Вопросы
- По каким причинам производительность чтения паркета из хранилища Azure так резко снижается?
- Есть ли способ оптимизировать его?