Skip to content

Типичные ошибки в работе проверок

На этой странице описаны часто встречающиеся ошибки в работе DQ проверок.

Где доступны логи DQ

Для удобства поиска по логам DQ мы рекомендуем настроить отправку логов в OpenSearch или ELK. Для этого см. инструкцию

Интерфейс Возможности
DQ UI на странице с Run. Просмотр логов по каждому запуску (Run) в отдельности
Фильтрация по уровню логирования (levelname)
Поиск средствами браузера
OpenSearch или Kibana Расширенные возможности поиска и фильтрации логов
Файлы с логами на DQ worker Можно написать нам в чат поддержки,
если вам нужны логи за более длительный период,
чем они доступны в DQ UI или OBS

Как работать с логами DQ в OpenSearch

  1. Перейдите в OpenSearch UI

  2. Выберите ваш индекс

  3. Для поиска логов по вашим проверок нужно обязательно указать фильтр по run_id: alt text

  4. В списке Available Fields слева выберите поле message: alt text

  5. Теперь в интерфейсе OpenSearch отображается только сообщения от самого DQ - без дополнительных технических полей: alt text

Если DQ запускается из Airflow, эта ссылка с необходимыми фильтрами будет в логе таска DQRunner:

alt text

Если вы не используете Airflow для запуска DQ, run_id будет доступен в ответе метода /api/v4/run_group

Виды ошибок

Ошибки spark метрик

1) Ошибка в конфигурации метрики, самый частый кейс, ошибка имеет подобный вид. Решить проблему можно только исправив свою конфигурацию метрики. Текст ошибки содержит исполняемый SQL на источнике.

Развернуть исходный код
Exception on Spark Query: with q1 as ( select count(distinct device) cnt_raw, 1 as rn from raw.table where 1=1 and version_dt i= TO_DATE(CAST(UNIX_TIMESTAMP('2025-01-04', 'yyyy-MM-dd') AS TIMESTAMP)) ), q2 as ( select count(distinct device_key) cnt_dds, 1 as rn from ( select device_key from dds.table_name where reg = 'msk' ) ) select cnt_raw - cnt_dds from q1,q2 where q1.rn = q2.rn
 Traceback (most recent call last):
  File "/usr/hdp/.../spark2/python/pyspark/sql/utils.py", line 63, in deco
    return f(*a, **kw)
  File "/usr/hdp/.../spark2/python/lib/py4j-0.10.6-src.zip/py4j/protocol.py", line 320, in get_return_value
    format(target_id, ".", name), value)
py4j.protocol.Py4JJavaError: An error occurred while calling o2497.sql.
: org.apache.spark.sql.catalyst.parser.ParseException:
mismatched input 'i' expecting ')'(line 1, pos 137)

== SQL ==
with q1 as ( select count(distinct device) cnt_raw, 1 as rn from raw.table where 1=1 and version_dt i= TO_DATE(CAST(UNIX_TIMESTAMP('2025-11-04', 'yyyy-MM-dd') AS TIMESTAMP)) ), q2 as ( select count(distinct device_key) cnt_dds, 1 as rn from ( select device_key from dds.table_name where reg = 'frs_msk' ) ) select cnt_raw - cnt_dds from q1,q2 where q1.rn = q2.rn
-----------------------------------------------------------------------------------------------------------------------------------------^^^

2) Ошибка в Spark метриках связанная с нехваткой памяти на хосте с воркером DQ. Если вы часто сталкиваетесь с такой ошибкой, попробуйте разнести свои проверки по времени или уменьшите spark.driver.memory, чтобы снизить нагрузку на хост.

Развернуть исходный код
Exception on connection to Spark with spark_conf_parameters {'spark.executor.memory': '16g', 'spark.driver.memory': '16g', 'spark.executor.instances': '4', 'spark.executor.cores': '4', 'spark.yarn.queue': 'core_data_lake_dq', 'spark.app.name': 'DQ_group_name_217488', 'spark.driver.port': 4500, 'spark.fileserver.port': 4600, 'spark.replClassServer.port': 4700, 'spark.blockManager.port': 4800, 'spark.ui.port': 4900, 'spark.driver.bindAddress': '0.0.0.0', 'spark.port.maxRetries': 100, 'spark.sql.orc.filterPushdown': 'true', 'spark.sql.tungsten.enabled': 'true'}: Traceback (most recent call last):
  File "/dq-service/core/source_connectors/spark_connection.py", line 54, in create_connection
    session = SparkSession.builder.config(conf=conf).enableHiveSupport().getOrCreate()
  File "/usr/hdp/.../spark2/python/pyspark/sql/session.py", line 173, in getOrCreate
    sc = SparkContext.getOrCreate(sparkConf)
  File "/usr/hdp/.../spark2/python/pyspark/context.py", line 340, in getOrCreate
    SparkContext(conf=conf or SparkConf())
  File "/usr/hdp/.../spark2/python/pyspark/context.py", line 119, in __init__
    conf, jsc, profiler_cls)
  File "/usr/hdp/.../spark2/python/pyspark/context.py", line 181, in _do_init
    self._jsc = jsc or self._initialize_context(self._conf._jconf)
  File "/usr/hdp/.../spark2/python/pyspark/context.py", line 279, in _initialize_context
    return self._jvm.JavaSparkContext(jconf)
  File "/usr/hdp/.../spark2/python/lib/py4j-0.10.6-src.zip/py4j/java_gateway.py", line 1428, in __call__
    answer, self._gateway_client, None, self._fqn)
  File "/usr/hdp/.../spark2/python/pyspark/sql/utils.py", line 63, in deco
    return f(*a, **kw)
  File "/usr/hdp/.../spark2/python/lib/py4j-0.10.6-src.zip/py4j/protocol.py", line 320, in get_return_value
    format(target_id, ".", name), value)
py4j.protocol.Py4JJavaError: An error occurred while calling None.org.apache.spark.api.java.JavaSparkContext.
: java.lang.OutOfMemoryError: Java heap space

Результат метрики, посчитанной через DQ, незначительно отличается значения, если посчитать напрямую в БД

1) Результат метрики, посчитанной через DQ, незначительно отличается значения, если посчитать напрямую в БД, меньше чем на 1%.

Если в метрике есть фильтр по дате, скорее всего это связано с расхождением в часовых поясах. По-умолчанию, спарк метрики DQ считаются в таймзоне UTC.

Решение - поменять часовой пояс в параметрах группы проверок. См. Переопределение таймзоны в spark сессии

Развернуть исходный код
groups:
- name: my_group
  source_parameters:
    - source_name_1:
        spark_conf_parameters:
          spark.sql.session.timeZone: "Europe/Moscow"
          spark.yarn.am.extraJavaOptions: "-Dhdp.version=... -Duser.timezone=Europe/Moscow"
          spark.driver.extraJavaOptions: "-Dhdp.version=... -Duser.timezone=Europe/Moscow"

Результат проверки = "Отсутствует эталонное значение", метрика не посчиталась

Метрика не посчиталась (нет результата в grafana), у проверки статус 0 (Отсутствует эталонное значение) и в логах нет ошибок.

Скорее всего конфиг составлен таким образом, что DQ не знает, за какую дату запускать метрику.

Это возможно, если метрика не используется в проверках, либо если используется только как reference_metric

Пример такой конфигурации:

Развернуть исходный код
metrics:
...
  - name: sum_rows_total
    type: custom_sql
    check_object: active_projects_information.source_name
    check_object_link: metric_result_view
    parameters:
     sql: "..."
...

compares:
...
  - name: percent_delta_count_download_rows_archive_and_count_download_rows_archive_prev
    type: percent_delta
    metric: count_download_rows_archive
    parameters:
      min_value: 0
      max_value: 100
      reference_metric: sum_rows_total
      date_reference: PREV 
    description: "Количество активных записей превышет сумму записей (archive+active) загрузки ранее" 
...

groups:   

  - name: check_socrat_tech_sol
    compares:
      ...
      - percent_delta_count_download_rows_archive_and_count_download_rows_archive_prev
      ...

Здесь метрика sum_rows_total используется в одной проверке, в качестве reference_metric. При этом стоит date_reference = PREV (т.е. мы берем для сравнения значение этой метрики, посчитанное за любую предыдующую дату)

В данном случае мы не можем определить, за какую дату нужно посчитать эту метрику.

Решение: явно добавить метрику в группу:

Развернуть исходный код
 ...
groups:   

  - name: check_socrat_tech_sol
    compares:
      ...
      - percent_delta_count_download_rows_archive_and_count_download_rows_archive_prev
      ...
    metrics:
      - sum_rows_total

Теперь метрика всегда будет вычисляться за дату запуска.

Ошибки на этапе подключения к источнику

Возможные причины:

  1. В vault указан неверные креды для подключения к источнику или неверный путь в credentials. См. Конфигурация Source

  2. Запрещены подключения к источнику с адреса DQ воркера. Необходимо прописать разрешения на стороне источника.