fsck
Аналогично команде проверки файловой системы, команда fsck будет сканировать и, при необходимости, пытаться исправить проблемы с данными в таблице данных OpenTSDB. Команда fsck работает только с таблицей хранения tsdb, сканируя всю таблицу данных или любые строки данных, соответствующие заданному запросу. Fsck можно использовать для исправления ошибок и освобождения места путём уплотнения строк, которые не были уплотнены TSD, и кодирования данных точек данных из предыдущих версий OpenTSDB с использованием переменной длины.
По умолчанию, выполнение fsck будет только сообщать об обнаруженных ошибках. Никаких изменений в исходных данных не будет внесено, если вы не используете флаги --fix или --fix-all. В общем случае вы должны сначала запустить fsck без флага исправления и проверить обнаруженные проблемы в файле журнала. Если вы уверены в исправлениях, добавьте флаг исправления. Не все ошибки могут быть автоматически исправлены.
Предупреждение
Выполнение fsck с флагами --fix или --fix-all может удалить точки данных, столбцы или целые строки, и удалённые данные невозможно восстановить, если вы не восстановите их из резервной копии. (или выполните какие-то трюки с HBase для восстановления данных перед основной укладкой)
Примечание
Эта страница документирует утилиту fsck OpenTSDB 2.1. Для предыдущих версий доступен только флаг --fix, и fsck может быть применён только к данным в рамках запроса.
Параметры
fsck [flags] [START-DATE [END-DATE] query [queries...]]
| Имя | Тип данных | Описание | Значение по умолчанию | Пример |
|---|---|---|---|---|
| --fix | Флаг | Необязательный флаг, который попытается исправить ошибки. Сам по себе, флаг fix исправит только ошибки расширения знака, 8-байтовые числа с плавающей точкой и 4-байтовыми квалификаторами и отдельные точки данных VLE. Используйте его в сочетании с другими флагами для исправления большего количества проблем. | Не задано | --fix |
| --fix-all | Флаг | Устанавливает все флаги исправления, чтобы попытаться исправить все проблемы сразу. Используйте с осторожностью | Не задано | --fix |
| --compact | Флаг | Уплотняет неуплотнённые строки во время ремонта. | Не задано | --compact |
| --delete-bad-compacts | Флаг | Удаляет столбцы, которые, по-видимому, были уплотнены, но не прошли проверку синтаксиса. Если столбец проходит проверку синтаксиса, но последний байт значения не установлен в 0 или 1, столбец останется. | Не задано | --delete-bad-compacts |
| --delete-bad-rows | Флаг | Удаляет любую строку, которая не соответствует формату строки OpenTSDB, состоящей из идентификатора метрики, отслеживаемого идентификатора, метки и временной метки. | Не задано | --delete-bad-rows |
| --delete-bad-values | Флаг | Удаляет любые отдельные точки данных, которые не удалось исправить или которые не соответствуют спецификации OpenTSDB. | Не задано | --delete-bad-values |
| --delete-orphans | Флаг | Удаляет строки, где один или несколько идентификаторов не смогли быть связаны с именем. | Не задано | --delete-orphans |
| --delete-unknown_columns | Флаг | Удаляет любой столбец, который, похоже, не является уплотнённым столбцом, отдельной точкой данных или известным или будущим объектом OpenTSDB. | Не задано | --delete-unknown-columns |
| --resolve-duplicates | Флаг | Включает разрешение дублирующих точек данных путём удаления всех, кроме последней или самой старой точки данных. Также см. --last-write-wins. | Не задано | --resolve-duplicates |
| --last-write-wins | Флаг | При установке удаляет все, кроме последней написанной точки данных при разрешении дубликатов. Если значение конфигурации tsd.storage.fix_duplicates установлено в true, то последняя точка данных будет сохранена независимо от этого значения. | Не задано | --last-write-wins |
| --full-scan | Флаг | Сканирует всю таблицу данных. Примечание: Это может занять очень много времени. | Не задано | --full-scan |
| --threads | Целое число | Количество потоков, используемых при полном сканировании. По умолчанию используется в два раза больше, чем количество ядер процессора. | 2 x ядра процессора | --threads=16 |
| START-DATE | Строка или целое число | Начальное время для запроса. Это может быть абсолютное или относительное время. Подробнее см. Даты и время | 1 час назад | |
| END-DATE | Строка или целое число | Необязательное конечное время для запроса. Если не указано, используется текущее время. Это может быть абсолютное или относительное время. Подробнее см. Даты и время | Текущая метка времени | 2014/01/01-00:00:00 |
| query | Строка | Один или несколько командных запросов | sum tsd.hbase.rpcs type=put |
Примеры
Запрос
fsck --fix 1h-ago now sum tsd.hbase.rpcs type=put sum tsd.hbase.rpcs type=scan
Полная таблица
fsck --full-scan --threads=8 --fix --resolve-duplicates --compact
Полная таблица против запросов
Используя флаг --full-scan, будет просканирована вся таблица данных OpenTSDB tsdb. По умолчанию утилита запустит 2 x CPU core потоков для оптимальной производительности. Данные хранятся с идентификатором метрики в начале каждой строки ключа, поэтому утилита определит максимальный идентификатор метрики и равномерно распределит основную таблицу данных между потоками. Если ваши данные распределены по метрикам достаточно равномерно, каждый поток должен завершиться примерно за одинаковое время. Однако некоторые метрики обычно имеют больше данных или временных рядов, чем другие, поэтому эти потоки могут работать значительно дольше других. В будущих обновлениях OpenTSDB будет возможна более эффективная постановка задачи на выполнение.
В качестве альтернативы, вы можете указать командную строку запроса для fsck в течение более короткого временного интервала и просмотреть определённую метрику или временной ряд. Эти запросы почти всегда завершаются гораздо быстрее, чем полное сканирование, и выявляют аналогичные проблемы. Однако метрики-сироты не будут найдены, так как запрос будет работать только с известными временными рядами. Сироты, где имена или значения тегов были удалены, всё ещё будут найдены.
Независимо от используемого метода, fsck рассматривает только последнее значение столбца в HBase. Если таблица настроена на хранение нескольких версий, более старые версии столбца игнорируются.
Результаты
Результаты будут записаны в журнал с настройками в файле logback.xml. Для длительных fsck рекомендуется запускать их в фоновом режиме и настроить LogBack на достаточный объём места для записи данных. По завершении будут напечатаны статистические данные о выполнении. Пример выглядит так:
2014-07-07 13:09:15,610 INFO [main] Fsck: Starting full table scan 2014-07-07 13:09:15,619 INFO [main] Fsck: Max metric ID is [0] 2014-07-07 13:09:15,619 INFO [main] Fsck: Spooling up [1] worker threads 2014-07-07 13:09:16,358 INFO [main] Fsck: Thread [0] Finished 2014-07-07 13:09:16,358 INFO [main] Fsck: Key Values Processed: 301 2014-07-07 13:09:16,358 INFO [main] Fsck: Rows Processed: 1 2014-07-07 13:09:16,359 INFO [main] Fsck: Valid Datapoints: 300 2014-07-07 13:09:16,359 INFO [main] Fsck: Annotations: 1 2014-07-07 13:09:16,359 INFO [main] Fsck: Invalid Row Keys Found: 0 2014-07-07 13:09:16,360 INFO [main] Fsck: Invalid Rows Deleted: 0 2014-07-07 13:09:16,360 INFO [main] Fsck: Duplicate Datapoints: 0 2014-07-07 13:09:16,360 INFO [main] Fsck: Duplicate Datapoints Resolved: 0 2014-07-07 13:09:16,361 INFO [main] Fsck: Orphaned UID Rows: 0 2014-07-07 13:09:16,361 INFO [main] Fsck: Orphaned UID Rows Deleted: 0 2014-07-07 13:09:16,361 INFO [main] Fsck: Possible Future Objects: 0 2014-07-07 13:09:16,362 INFO [main] Fsck: Unknown Objects: 0 2014-07-07 13:09:16,362 INFO [main] Fsck: Unknown Objects Deleted: 0 2014-07-07 13:09:16,362 INFO [main] Fsck: Unparseable Datapoint Values: 0 2014-07-07 13:09:16,362 INFO [main] Fsck: Unparseable Datapoint Values Deleted: 0 2014-07-07 13:09:16,363 INFO [main] Fsck: Improperly Encoded Floating Point Values: 0 2014-07-07 13:09:16,363 INFO [main] Fsck: Improperly Encoded Floating Point Values Fixed: 0 2014-07-07 13:09:16,363 INFO [main] Fsck: Unparseable Compacted Columns: 0 2014-07-07 13:09:16,364 INFO [main] Fsck: Unparseable Compacted Columns Deleted: 0 2014-07-07 13:09:16,364 INFO [main] Fsck: Datapoints Qualified for VLE : 0 2014-07-07 13:09:16,364 INFO [main] Fsck: Datapoints Compressed with VLE: 0 2014-07-07 13:09:16,365 INFO [main] Fsck: Bytes Saved with VLE: 0 2014-07-07 13:09:16,365 INFO [main] Fsck: Total Errors: 0 2014-07-07 13:09:16,366 INFO [main] Fsck: Total Correctable Errors: 0 2014-07-07 13:09:16,366 INFO [main] Fsck: Total Errors Fixed: 0 2014-07-07 13:09:16,366 INFO [main] Fsck: Completed fsck in [1] seconds
В основном, эти статистические данные должны быть понятны. Key Values Processed указывает количество отдельных столбцов в HBase. VLE относится к variable length encoding.
Во время выполнения каждые 5 секунд будет выводиться информация о прогрессе, чтобы вы знали, что утилита всё ещё работает. Вы должны увидеть строки, похожие на следующие:
10:14:00.518 INFO [Fsck.run] - Processed 47689680000 rows, 449891670779 valid datapoints 10:14:01.518 INFO [Fsck.run] - Processed 47689730000 rows, 449892264237 valid datapoints 10:14:02.519 INFO [Fsck.run] - Processed 47689780000 rows, 449892880333 valid datapoints
Всякий раз, когда обнаруживается ошибка (и, возможно, она исправлена), журнал будет обновлён немедленно. Обычно в выводе указывается столбец, в котором была обнаружена ошибка. Массивы байтов представлены либо в формате Java-стиля со знаком, например [0, 1, -42], либо в формате строковых строк с кодировкой в шестнадцатеричном виде, например, 00000000000000040000000000000005. Краткая запись включает (k) для ключа строки, (q) для квалификатора и (v) для значения.
Типы ошибок и исправления
Ниже приведён список ошибок и/или исправлений, которые могут быть обнаружены или выполнены с помощью fsck.
Неправильные ключи строк
Если ключ строки не соответствует спецификации таблицы данных OpenTSDB <metric_UID><base_timestamp><tagk1_UID><tagv1_UID>[...<tagkn_UID><tagvn_UID>], вся строка считается недействительной.
2014-07-07 15:03:46,483 ERROR [Fsck #0] Fsck: Invalid row key.
Key: 000001
Исправление:
Если --delete-bad-rows установлено, вся строка будет удалена из HBase.
Сироты строк
Если ключ строки распознаётся как правильная строка OpenTSDB, тогда идентификаторы для идентификатора временного ряда (TSUID) строки связываются с их именами. Если какой-либо из идентификаторов не соответствует имени в таблице tsdb-uid, тогда строка считается сироткой. Это может произойти, если идентификатор был вручную удалён из таблицы идентификаторов или удаление не завершилось корректно.
2014-07-07 15:08:45,057 ERROR [Fsck #0] Fsck: Unable to resolve the metric from the row key.
Key: 00000150E22700000001000001
No such unique ID for 'metric': [0, 0, 1]
Исправление:
Если --delete-orphans установлено, вся строка будет удалена из HBase.
Уплотнённая строка
Хотя это не строго ошибка, fsck может использоваться для уплотнения строк в один столбец. Уплотнение строк экономит место, объединяя несколько столбцов в один. Это уменьшает нагрузку на HBase. Если TSD, настроенный на уплотнение столбцов, выходит из строя, некоторые строки могут быть пропущены и остаться в виде отдельных точек данных. Поскольку уплотнение может потреблять ресурсы, fsck можно использовать для уплотнения строк, когда нагрузка на кластер уменьшена.
Указание флага --compact вместе с --fix будет уплотнять любую строку, содержащую отдельные точки данных в пределах диапазона запроса. Во время уплотнения любые точки данных из старых версий OpenTSDB, подходящие для VLE, будут повторно закодированы.
Примечание
Если строка исправлена по какой-либо причине и содержит один или несколько уплотнённых столбцов, строка будет повторно уплотнена независимо от флага --compact.
Ошибка плохого уплотнённого столбца
Эти ошибки возникают, когда уплотнённый столбец не может быть разобран на отдельные точки данных. Это может произойти, если квалификатор кажется правильным, но количество байтов в массиве значений не соответствует длинам, закодированным в квалификаторе. Уплотнённые столбцы с неотсортированными точками данных не считаются плохими столбцами. Вместо этого столбец будет правильно отсортирован и перезаписан, если присутствуют флаги --fix или --fix-all.
2014-07-07 13:29:40,251 ERROR [Fsck #0] Fsck: Corrupted value: couldn't break down into individual values (consumed 20 bytes, but was expecting to consume 24): [k '00000150E22700000001000001' q '000700270033' v '00000000000000040000000000000005000000000000000600'], cells so far: [Cell([0, 7], [0, 0, 0, 0, 0, 0, 0, 4]), Cell([0, 39], [0, 0, 0, 0, 0, 0, 0, 5]), Cell([0, 51], [0, 0, 0, 0])]
Исправление:
Единственным исправлением этой ошибки является удаление столбца с помощью флага --delete-bad-compacts.
Ошибка последнего байта уплотнённого значения
Последний байт уплотнённого значения предназначен для хранения метаданных. Обычно он равен 0, если все точки данных закодированы в секундах или миллисекундах. Если есть смешение секунд и миллисекунд, будет установлено 1. Если значение иное, то оно может быть из будущей версии OpenTSDB, или столбец может быть недействительным.
18:13:35.979 [main] ERROR net.opentsdb.tools.Fsck - The last byte of a compacted should be 0 or 1. Either this value is corrupted or it was written by a future version of OpenTSDB.
[k '00000150E22700000001000001' q '00070027' v '00000000000000040000000000000005']
Исправление:
В настоящее время это не исправляется. Вы можете вручную установить последний байт в 0 или 1, чтобы предотвратить сбой. Флаг --delete-bad-compacts не будет удалять эти столбцы.
Значение слишком длинное или короткое
Это может произойти, если значение записано более чем на 8 байт для столбца с одним значением данных. Отдельные значения данных хранятся в 2 или 4 байтовых квалификаторах. Эта ошибка не может произойти для значения данных в сжатом столбце. Если он был сжат, столбец выбросит ошибку некорректного сжатого столбца, так как он не будет поддаваться разбору.
2014-07-07 14:50:44,022 ERROR [Fsck #0] Fsck: This floating point value must be encoded either on 4 or 8 bytes, but it's on 9 bytes.
[k '00000150E22700000001000001' q 'F000020B' v '000000000000000005']
Решение:
--delete-bad-values удалит столбец.
Плавающие числа старой версии
В ранних версиях OpenTSDB была ошибка в хранении значений с плавающей точкой, где первые 4 байта 8-байтового значения записывались со всеми битами, установленными в 1. Значение должно быть в последних четырех байтах, поскольку квалификатор кодирует длину как четыре байта. Однако если некорректные данные были сжаты, данные не могут быть правильно обработаны, и будет записана ошибка.
18:43:35.297 [main] ERROR net.opentsdb.tools.Fsck - Floating point value with 0xFF most significant bytes, probably caused by sign extension bug present in revisions [96908436..607256fc].
[k '00000150E22700000001000001' q '002B' v 'FFFFFFFF43FA6666']
Решение:
Флаг --fix исправит эти ошибки, перезаписав значение без первых четырех байт. Квалификатор остается без изменений.
4-байтовые числа с плавающей точкой со значением 8 байт OK
В некоторых версиях OpenTSDB могут быть закодированы значения с плавающей точкой в 8 байтах при установке длины квалификатора в 4 байта. Первые четыре байта должны быть 0. Если значение было сжато, сжатый столбец будет недействительным, так как разбор больше невозможен.
2014-07-07 14:33:34,498 WARN [Fsck #0] Fsck: Floating point value was marked as 4 bytes long but was actually 8 bytes long
[k '00000150E22700000001000001' q '000B' v '0000000040866666']
Решение:
Флаг --fix исправит эти ошибки, перезаписав значение без первых четырех байт. Квалификатор остается без изменений.
4-байтовые числа с плавающей точкой со значением 8 байт плохо
В этом случае значение было закодировано в 8 байтах, причём первые четыре байта установлены в ненулевое значение. Возможно, значение является 8-байтовым двойным, так как OpenTSDB никогда фактически не кодировал 8 байт; скорее всего, значение повреждено. Если значение было сжато, сжатый столбец будет недействительным, так как разбор больше невозможен.
2014-07-07 14:37:02,717 ERROR [Fsck #0] Fsck: Floating point value was marked as 4 bytes long but was actually 8 bytes long and the first four bytes were not zeroed
[k '00000150E22700000001000001' q '002B' v 'FB02F40F43FA6666']
Решение:
Флаг --delete-bad-values удалит столбец. Вы можете попробовать вручную разобрать значение как Double и посмотреть, выглядит ли оно допустимым; в противном случае, скорее всего, столбец повреждён.
Неизвестный объект
OpenTSDB 2.0 поддерживает объекты, такие как аннотации, в таблице данных. Если столбец не соответствует объекту OpenTSDB, сжатому столбцу или отдельному значению данных, он считается неизвестным объектом и, вероятно, может быть удален.
2014-07-07 14:55:03,019 ERROR [Fsck #0] Fsck: Unknown qualifier, must be 2, 3, 5 or an even number of bytes.
[k '00000150E22700000001000001' q '00270401010101' v '0000000000000005']
Решение:
Флаг --delete-unknown-columns удалит этот столбец из строки.
Объект будущего
Объекты закодированы в квалификаторах длиной 3 или 5 байт, а тип определяется префиксом. Если OpenTSDB не распознает префикс, то он сообщит об объекте, но не будет удалять его. Обратите внимание, что это может быть на самом деле неизвестный или повреждённый столбец, так как fsck проверяет только длину квалификатора и первый байт квалификатора. Если это так, вы можете безопасно удалить этот столбец вручную.
2014-07-07 14:57:15,858 WARN [Fsck #0] Fsck: Found an object possibly from a future version of OpenTSDB
[k '00000150E22700000001000001' q '042704' v '467574757265204F626A656374']
Решение:
Объекты будущего остаются неизменными во время fsck. Запрос данных с TSD, который не поддерживает объект, выбросит исключение, но версии, которые поддерживают объект, должны продолжать работу нормально.
Дублирующие метки времени
Из-за использования кодирования длины и типа для точек данных в квалификаторах, возможно, записать точку данных для одного и того же отметки времени с двумя разными квалификаторами. Например, если вы опубликуете целочисленное значение для времени 1 , а затем опубликуете значение с плавающей точкой для времени 1, будут созданы два разных столбца. Дубликаты также могут возникать, если строка была сжата, а TSD записывает новый отдельный столбец, который соответствует метке времени в сжатом столбце. При запросе будет выброшено исключение, так как TSD не знает, какое значение является правильным.
2014-07-07 15:22:43,231 ERROR [Fsck #0] Fsck: More than one column had a value for the same timestamp: (1356998400000) row key: (00000150E22700000001000001) write time: (1388534400000) compacted: (false) qualifier: [0, 7] <--- Keep oldest write time: (1388534400001) compacted: (false) qualifier: [0, 11] write time: (1388534400002) compacted: (false) qualifier: [0, 3] write time: (1388534400003) compacted: (false) qualifier: [0, 1]
Решение:
Если установлен --resolve-duplicates, все точки данных, кроме самого последнего или самого старого значения, будут удалены. Исправление применяется как к отдельным, так и к сжатым точкам данных. Если установлен флаг --last-write-wins, сохраняется последнее значение. Без флага --last-write-wins, сохраняется самое старое значение.
Примечание
Если значение конфигурации tsd.storage.fix_duplicates установлено в true, последнее значение будет сохранено независимо от --last-write-wins.
Примечание
При включённом сжатии возможно (хотя и маловероятно), что точка данных записывается во время сжатия строки. В этом случае, сжатый столбец будет иметь позже метку времени, чем точка данных, записанная во время сжатия. Поэтому по умолчанию результатом --resolve-duplicates будет сохранение отдельной точки данных или, если последние записи имеют приоритет, то сжатое значение.
Кодирование переменной длины
Ранние реализации OpenTSDB всегда кодировали целочисленные значения в 8 байтах. С версии 2.0 целые числа записываются в минимальном возможном количестве байт: 1, 2, 4 или 8. Во время fsck любые целочисленные значения, закодированные в 8 байтах, будут перезаписаны с помощью VLE, если указаны флаги --fix или --fix-all. Это относится к отдельным и сжатым значениям. В конце выполнения отображается количество сохранённых байтов с помощью VLE.
© 2010–2016 The OpenTSDB Authors
Licensed under the GNU LGPLv2.1+ and GPLv3+ licenses.
http://opentsdb.net/docs/build/html/user_guide/cli/fsck.html