описание проблемы
На работе мне нужно использовать pyspark для чтения данных в Hive, но я обнаружил, что хранилище метаданных можно получить, данные внешней таблицы можно прочитать, а информация об ошибках некоторых таблиц данных внутренней таблицы:
AnalysisException: org.apache.hadoop.hive.ql.metadata.HiveException: Unable to fetch table tb_name. Your client does not appear to support insert-only tables. To skip capability checks, please set metastore.client.capability.check to false. This setting can be set globally, or on the client for the current metastore session. Note that this may lead to incorrect results, data loss, undefined behavior, etc. if your client is actually incompatible. You can also specify custom client capabilities via get_table_req API.
Некоторые таблицы не имеют сообщения об ошибке, но считанные данные пусты.
Предварительно установлено, что у Spark нет проблем с чтением конфигурации среды Hive, но это вызвано различными типами таблиц Hive.
Проанализируйте причины
проблема вызывает:
HDP3.0 интегрирует hive 3.0 и spark 2.3, но spark не может прочитать данные таблицы hive, а точнее данные внутренней таблицы.
После версии hive 3.0 функция ACID включена по умолчанию, а создание таблицы по умолчанию — это таблица транзакций с использованием ACID. В настоящее время Spark не поддерживает функцию ACID куста, поэтому он не может читать данные таблицы ACID.
Кроме того, чтение не сообщает об ошибке, но таблица данных не может быть прочитанаINPUTFORMAT=org.apache.hadoop.hive.ql.io.orc.OrcInputFormat
;
сообщить об ошибкеinsert-onlyТаблицаINPUTFORMAT = org.apache.hadoop.mapred.TextInputFormat
.
Что такое таблица транзакций
концепция
ACID — это четыре характеристики общих транзакций базы данных: атомарность (атомарность), Consistency (непротиворечивость), Isolation (изоляция), Durability (долговечность).
Поскольку HDFS поддерживает только добавление и удаление файлов, а не модификацию, Hive изначально не поддерживает атомарную модификацию на уровне строк.
Таблицы Hive, поддерживающие атомарные операции обновления, становятся транзакционными таблицами.
Разница между таблицей транзакций и обычной внутренней таблицей
Видно, что существует два типа таблиц транзакций, один из которых представляет собой формат ORC, который может полностью поддерживать операции CRUD (CRUD), один из них — обычный формат файла TextFile, который соответствует только функции «только вставка».
Типы таблиц и функции ACID, поддерживаемые в Hive, показаны на следующем рисунке:
Где управляемые таблицы — это внутренние таблицы Hive.
Для просмотра свойств таблицы команда:desc formatted tb_name
некислотныйповерхность:
| Table Type: | MANAGED_TABLE | NULL |
| Table Parameters: | NULL | NULL |
| | COLUMN_STATS_ACCURATE | {\"BASIC_STATS\":\"true\"} |
| | numFiles | 36554 |
| | numPartitions | 4582 |
| | numRows | 656353471 |
| | rawDataSize | 3687190343914 |
| | totalSize | 191558565757 |
| | transient_lastDdlTime | 1626229162 |
ACIDповерхность:
| Table Type: | MANAGED_TABLE | NULL |
| Table Parameters: | NULL | NULL |
| | bucketing_version | 2 |
| | comment | 交易日志表 |
| | numFiles | 2131 |
| | numPartitions | 2131 |
| | numRows | 1303371497 |
| | rawDataSize | 0 |
| | totalSize | 669842162666 |
| | transactional | true |
| | transactional_properties | insert_only |
| | transient_lastDdlTime | 1613705157 |
в:
- transactional=true, помечен как транзакционная таблица
- transactional_properties=insert_only
Связанная конфигурация
в кластереHive-site.xml
Измените следующие параметры, чтобы вновь созданная таблица не была таблицей кислот по умолчанию.
hive.strict.managed.tables=false
hive.create.as.insert.only=false
metastore.create.as.acid=false
Применимые сценарии для таблиц транзакций
Для частого обновления и удаления данных на уровне строк в хранилище данных вы можете рассмотреть возможность использования таблицы транзакций.
Однако не рекомендуется использовать транзакционные таблицы для обычных таблиц кустов. Поскольку существует множество ограничений для таблиц транзакций, а также из-за характеристик таблиц кустов трудно реализовать сценарии с высокой степенью параллелизма.
Кроме того, при слишком большом количестве таблиц транзакций и большом количестве операций обновления поток слияния, запущенный в фоновом режиме хранилища метаданных, будет периодически отправлять задания MapReduce, что также в определенной степени увеличит нагрузку на кластер.
**Вывод: **Если нет крайней необходимости в обновлении на уровне строк и это может быть сделано только с таблицами куста, необходимо рассмотреть таблицы транзакций.
Меры предосторожности
- Такие операторы, как BEGIN, COMMIT, ROLLBACK, не поддерживаются, все операторы фиксируются автоматически.
- Поддерживается только формат ORC
Принцип проектирования и реализация
формат управления файлами
Сама HDFS не поддерживает прямое изменение файлов и не может гарантировать согласованность чтения, когда кто-то добавляет контент.
Поэтому для поддержки функции ACID Hive может использовать только метод, обычно используемый в других хранилищах данных, то есть инкрементно записывать обновления и удаления (также известный как обновление при чтении).
Данные, хранящиеся в таблицах транзакций, делятся на два типа файлов:
- базовый файл, используемый для хранения обычных данных
- Дельта-файл используется для хранения новых, обновленных и удаленных данных. В результате обработки данных каждой транзакции будет создана отдельная дельта-папка для хранения данных.
Когда пользователь хочет прочитать данные этой таблицы, и базовый файл, и дельта-файл будут считаны в память, а затем объединены (то есть для определения того, какие записи были изменены, какие записи были удалены и т. д.) .
Файловая структура таблицы ACID:${Hive_path}/db/table_name/base_{id}/file
.
Found 2 items |
| -rw-rw----+ 3 hdfs hadoop 1091048351 2021-07-13 15:00 /warehouse/tablespace/managed/hive/db_name.db/tb_name/date=2021-06-30/base_0002252/000000_0
| -rw-rw----+ 3 hdfs hadoop 1091048351 2021-07-13 15:00 /warehouse/tablespace/managed/hive/db_name.db/tb_name/date=2021-06-30/delta_0000023_0000023_0000/000000_0
в0000023
Идентифицирует идентификатор транзакции, а порядковый номер представляет собой 0000. Из приведенной выше таблицы видно, что данные одной транзакции не были объединены в базу.
Таблицы без ACID, импорт данных через другие таблицы, каталог файлов:
+----------------------------------------------------+
| DFS Output |
+----------------------------------------------------+
| 2.6 M 7.9 M /warehouse/tablespace/managed/hive/db_name.db/tb_name/day=2021-07-18/-ext-10000/000000_0 |
+----------------------------------------------------+
Обычный внутренний каталог файлов таблиц:
+----------------------------------------------------+
| DFS Output |
+----------------------------------------------------+
| 7.4 M 22.1 M /warehouse/tablespace/managed/hive/db_name.db/tb_name/day=2021-07-18/000000_0 |
+----------------------------------------------------+
- Для каждой операции записи Hive создает добавочный каталог, в который диспетчер транзакций будет записывать файлы данных;
- Hive записывает все данные в дельта-файл, указанный идентификатором записи, и сопоставляется с идентификатором транзакции, представляющим атомарную операцию. В случае сбоя транзакция будет помечена как прерванная, но она атомарна;
- Hive украшает каждую строку идентификатором строки.
Справочный блог
- Подробное объяснение поддержки Hive ACID и таблиц транзакций — столбец u013332124 — Блог CSDN
- Принцип добавления, удаления, модификации и проверки Hive ACID и описание сцены - Блог Lara1111 - Блог CSDN
- Hive Official Manual Translation — Hive Transactions — Fan Zhenyong — Blog Park (cnblogs.com)
- Spark не может прочитать табличные данные куста 3.x — ищется программист
- Spark Issues Hive ACID