Перейти к основному содержимому
Версия: 2.0.x

FAQ по Datalake

FAQ по Data Lake

Эта тема описывает некоторые часто задаваемые вопросы (FAQ) о Data Lake и предоставляет решения этих проблем. Некоторые метрики, упомянутые в этой теме, могут быть получены только из профилей SQL-запросов. Чтобы получить профили SQL-запросов, необходимо указать set enable_profile=true.

Медленные HDFS DataNode

Описание проблемы

При доступе к файлам данных, хранящимся в вашем HDFS cluster, вы можете обнаружить большую разницу между значениями метрик __MAX_OF_FSIOTime и __MIN_OF_FSIOTime в профилях выполняемых SQL-запросов. Это указывает на то, что некоторые DataNode в HDFS cluster работают медленно. Следующий пример является типичным профилем, указывающим на проблему медленных HDFS DataNode:

 - InputStream: 0
- AppIOBytesRead: 22.72 GB
- __MAX_OF_AppIOBytesRead: 187.99 MB
- __MIN_OF_AppIOBytesRead: 64.00 KB
- AppIOCounter: 964.862K (964862)
- __MAX_OF_AppIOCounter: 7.795K (7795)
- __MIN_OF_AppIOCounter: 1
- AppIOTime: 1s372ms
- __MAX_OF_AppIOTime: 4s358ms
- __MIN_OF_AppIOTime: 1.539ms
- FSBytesRead: 15.40 GB
- __MAX_OF_FSBytesRead: 127.41 MB
- __MIN_OF_FSBytesRead: 64.00 KB
- FSIOCounter: 1.637K (1637)
- __MAX_OF_FSIOCounter: 12
- __MIN_OF_FSIOCounter: 1
- FSIOTime: 9s357ms
- __MAX_OF_FSIOTime: 60s335ms
- __MIN_OF_FSIOTime: 1.536ms

Решение

Вы можете использовать одно из следующих решений для устранения этой проблемы:

  • [Рекомендуется] Включите функцию Data Cache, которая устраняет влияние медленных HDFS DataNode на запросы путём автоматического кэширования данных из внешних систем хранения на BE или CN вашего Selena cluster.
  • [Рекомендуется] Сократите время ожидания между HDFS-клиентом и DataNode. Это решение подходит, когда Data Cache не помогает решить проблему медленных HDFS DataNode.
  • Включите функцию Hedged Read. При включении этой функции, если чтение из блока происходит медленно, Selena запускает новое чтение, которое выполняется параллельно с исходным чтением, для чтения из другой replica блока. Как только одно из двух чтений возвращается, другое отменяется. Функция Hedged Read может помочь ускорить чтение, но она также значительно увеличивает потребление heap-памяти на виртуальных машинах Java (JVM). Поэтому, если ваши физические машины имеют небольшой объём памяти, мы рекомендуем не включать функцию Hedged Read.

[Рекомендуется] Data Cache

См. раздел Data Cache.

[Рекомендуется] Сокращение времени ожидания между HDFS-клиентом и DataNode

Настройте свойство dfs.client.socket-timeout в файле hdfs-site.xml, чтобы сократить время ожидания между HDFS-клиентом и DataNode. (Время ожидания по умолчанию составляет 60 секунд, что довольно много.) Таким образом, когда Selena сталкивается с медленным DataNode, запрос на подключение от него может истечь за очень короткий период времени, а затем быть перенаправлен на другой DataNode. Следующий пример устанавливает время ожидания в 5 секунд:

<configuration>
<property>
<name>dfs.client.socket-timeout</name>
<value>5000</value>
</property>
</configuration>

Hedged Read

Используйте следующие параметры (поддерживаются с версии v1.5.2) в файле конфигурации BE или CN be.conf для включения и настройки функции Hedged Read в вашем HDFS cluster.

ПараметрЗначение по умолчаниюОписание
hdfs_client_enable_hedged_readfalseУказывает, следует ли включить функцию Hedged Read.
hdfs_client_hedged_read_threadpool_size128Указывает размер пула потоков Hedged Read на вашем HDFS-клиенте. Размер пула потоков ограничивает количество потоков, выделенных для выполнения hedged-чтений в вашем HDFS-клиенте. Этот параметр эквивалентен параметру dfs.client.hedged.read.threadpool.size в файле hdfs-site.xml вашего HDFS cluster.
hdfs_client_hedged_read_threshold_millis2500Указывает количество миллисекунд ожидания перед запуском hedged-чтения. Например, вы установили этот параметр в 30. В этой ситуации, если чтение из блока не вернулось в течение 30 миллисекунд, ваш HDFS-клиент немедленно запускает hedged-чтение из другой replica блока. Этот параметр эквивалентен параметру dfs.client.hedged.read.threshold.millis в файле hdfs-site.xml вашего HDFS cluster.

Если значение любой из следующих метрик в профилях ваших запросов превышает 0, функция Hedged Read включена.

МетрикаОписание
TotalHedgedReadOpsКоличество запущенных hedged-чтений.
TotalHedgedReadOpsInCurThreadКоличество раз, когда Selena пришлось запустить hedged-чтение в текущем потоке вместо нового потока, потому что пул потоков Hedged Read достиг максимального размера, указанного параметром hdfs_client_hedged_read_threadpool_size.
TotalHedgedReadOpsWinКоличество раз, когда hedged-чтение опередило исходное чтение.

Как решить ошибку "ERROR 1064 (HY000): Type mismatches on column [is_refund], JDBC result type is Integer, please set the type to one of tinyint,smallint,int,bigint" при запросе таблицы в Hive Catalog?

Эта проблема вызвана неправильной конфигурацией JDBC-подключения. Добавьте параметр tinyInt1isBit=false в ваш JDBC URI для предотвращения этой проблемы:

"jdbc_uri" = "jdbc:mysql://xxx:3306?database=yl_spmibill&tinyInt1isBit=false"

Почему я не могу запросить последние обновлённые данные в Iceberg Catalog (даже после обновления или пересоздания catalog), и как это устранить?

Сначала проверьте, не вызвана ли проблема включённым Data Cache. Выполните следующие шаги для проверки:

  1. Сравните сканируемые файлы данных между Selena и Spark:

    • В Selena: select file_path, spec_id from db.table_name$files;
    • В Spark: select file_path, spec_id from db.table_name.files;
  2. Если результаты совпадают, продолжите устранение неполадок, отключив Data Cache и выполнив запрос снова, чтобы проверить, сохраняется ли проблема.

Причина: Обновление данных таблицы Iceberg означает перезапись старых файлов, что повреждает исторические данные Iceberg. Правильное поведение — генерировать новые имена файлов при записи обновлений. Data Cache в Selena использует имя файла, размер файла и время модификации для определения, действительны ли кэшированные данные. Поскольку Iceberg не перезаписывает файлы, а время модификации всегда равно 0, Selena ошибочно считает файлы неизменёнными и читает из кэша, что приводит к устаревшим результатам запросов.

FE постоянно падает после запросов к таблицам во внешнем catalog, интегрированном с JuiceFS. Как это решить?

Чтобы решить эту проблему, перезапустите FE после добавления следующих параметров конфигурации в fe.conf:

proc_profile_mem_enable=false
proc_profile_cpu_enable=false