Автор: Дзен и искусство компьютерного программирования
1. Введение
Apache Flume — это распределенный и надежный сборщик журналов с открытым исходным кодом, предоставляемый Cloudera. Он широко используется в таких сценариях, как ведение журнала, сбор событий и потоковая передача данных. Он может очень хорошо обрабатывать большие объемы данных журналов и эффективно обеспечивать целостность, актуальность и своевременность данных журналов. Серверная часть хранилища данных Flume поддерживает HDFS, HBase, Kafka и другие системы хранения. Flume также может выполнять операции предварительной обработки, такие как сегментация, сжатие и шифрование данных, для дальнейшего повышения безопасности, доступности, производительности и т. д. данных. В этой статье мы реализуем простое приложение для сбора журналов на языке Python, чтобы имитировать процесс сбора, агрегации и анализа данных журналов в сценариях с высоким уровнем параллелизма. Поскольку Flume и Python тесно интегрированы, эта статья также посвящена их интеграции. Я считаю, что, прочитав эту статью, читатели смогут понять, как использовать Flume для агрегирования данных из нескольких источников и как использовать Python для очистки, расчета и анализа собранных логов.
2. Объяснение основных понятий и терминов
2.1 Знакомство с Flume
Apache Flume (сокращенно Flume) — это распределенный, надежный и отказоустойчивый сервис для сбора, агрегирования и перемещения больших объемов файлов журналов. Его основные особенности включают в себя:
Надежность: Flume гарантирует, что данные не будут потеряны. Даже если сам Flume или источник журнала выйдет из строя, целостность данных не будет затронута;
Целостность данных: Flume использует простой и удобный в использовании механизм транзакций, гарантирующий, что данные не будут уничтожены или повреждены;
Эффективность: Flume может пакетно обрабатывать и быстро передавать журналы, обеспечивая при этом низкую задержку, высокую пропускную способность и высокую отказоустойчивость;
Поддержка нескольких серверов хранения: Flume поддерживает несколько серверов хранения, таких как HDFS, HBase, Kakfa и т. д. Вы можете выбрать различные серверы хранения в соответствии с вашими потребностями;
Поддержка предварительной обработки данных: Flume поддерживает операции предварительной обработки, такие как сегментация, сжатие и шифрование данных, для дальнейшего повышения безопасности, доступности, производительности и т. д.
2.2 Введение в Python
Python — это бесплатный кроссплатформенный язык программирования с открытым исходным кодом. Его философия дизайна подчеркивает читаемость кода, простоту, переносимость и многие другие преимущества. Первоначально Python был разработан Гвидо ван Россумом, а первая версия была выпущена в 1991 году. Последняя версия Python — 3.7.0 по состоянию на июль 2019 года. Python имеет множество библиотек и модулей для поддержки веб-разработки, научных вычислений, интеллектуального анализа данных, машинного обучения и других областей и стал очень популярным языком программирования.
2.3 Журнал
Журналы — это текстовая информация, в которой фиксируется рабочее состояние и поток обработки приложения. Обычно они содержат такую информацию, как отметка времени, уровень, идентификатор потока, категория, сообщение и т. д. В реальных производственных средах журналы являются очень важным источником информации. В больших программных системах часто генерируется большой объем данных журнала. Помимо помощи разработчикам в обнаружении проблем, данные журналов также можно использовать для выполнения некоторых задач статистики, мониторинга и других задач. Поэтому технические знания и инструменты, необходимые для сбора, обработки, анализа, поиска и составления отчетов, также очень важны.
3. Основные принципы алгоритма и конкретные этапы работы.
3.1 Модель данных журнала
Модель данных журнала относится к тому, как данные журнала организованы и структурированы, чтобы облегчить их извлечение, анализ и понимание. Как правило, модель данных журнала включает имя журнала, поля, метки, категории, уровни и т. д. На следующем рисунке показана наиболее распространенная модель данных журнала — четырехфакторная модель:
В четырехэлементной модели четырьмя элементами журнала являются:
Имя журнала : Имя журнала относится к идентификатору имени журнала. Обычно имя журнала генерируется приложением и указывает на системный процесс или службу, которому принадлежит журнал.
Поля журнала : Поля журнала относятся ко всей соответствующей информации в журнале. Он состоит из разных полей, каждое из которых может иметь свое имя, значение и тип. Например, журнал может содержать такие поля, как «Идентификатор пользователя», «Время доступа», «Параметры запроса» и т. д.
Тег журнала : Тег журнала относится к дополнительной информации, описывающей журнал. Это может быть любая информация, которая облегчает извлечение журналов, их анализ и составление отчетов, например имя хоста, IP-адрес, информация о среде и т. д.
Уровень журнала : Уровень журнала относится к классификации важности журнала. Вообще говоря, уровни журнала делятся на семь уровней (от низкого к высокому): DEBUG, INFO, WARN, ERROR, FATAL, TRACE и ALL. Среди них DEBUG имеет самый низкий уровень, а FATAL — самый высокий.
3.2 Базовая конфигурация лотка
Установить
Flume можно установить через пакет исходного кода или загрузив скомпилированный двоичный пакет. Конкретные методы можно найти в инструкциях по установке на официальном веб-сайте.
Конфигурация
Файл конфигурации Flume называется flume.conf и по умолчанию хранится в каталоге /etc/flume. Файлы конфигурации Flume состоят из трех основных частей:
- агент
- источники
- каналы
- тонет
Агент: агент определяет основные свойства Flume, такие как интервал проверки конфигурации, возможность запуска независимо, режим работы и т. д. source:sources определяет источник данных журнала. Flume поддерживает множество источников данных, включая AvroSource, ExecSource, SpoolDirectorySource и т. д. Здесь мы используем ExecSource только для имитации сбора журналов. каналы: каналы — один из наиболее важных компонентов Flume, отвечающих за хранение, кэширование и передачу данных журнала. Он поддерживает несколько стратегий буферизации, включая память, локальный диск, Thrift, MySQL и т. д. Здесь мы используем только кэш памяти. приемники: приемники определяют место назначения вывода журнала. Flume поддерживает различные цели вывода, включая HDFS, Hive, LoggerSink, SolrJ, FileChannel, KafkaSink и т. д. Здесь мы используем LoggerSink только для вывода логов на консоль. Конкретные примеры конфигурации следующие:
#agent name
agent.name=quickstart-agent
#sources
source.exec = exec
.command = tail -F /var/logs/*.log
.filegroups = logs
.batchSize = 1000
.batchTimeout = 30 seconds
#channels
channel.memory.type = memory
channel.memory.capacity = 10000
#sinks
sink.console.type = logger
sink.console.loggerClassName = org.apache.flume.sink.ConsoleLogger
sink.console.logFormat = "%-4r %d{ISO8601} %-5p %c{1.}:%L - %m%n"
Среди них .command
— команда выполнения, укажите tail -F
команду для мониторинга /var/logs/*.log
всех файлов журналов в папке. .filegroups
Укажите группу файлов журнала, здесь только одна группа logs
. .batchSize
Установите размер пакетной передачи, здесь он установлен на 1000. .batchTimeout
Установите таймаут пакетной передачи, здесь он установлен на 30 секунд.
Затем запустите Flume, путь к файлу конфигурации — /etc/flume/flume.conf
, а команда — flume-ng agent --config conf -f flume.conf -n quickstart-agent -Dflume.root.logger=INFO,console
. Затем подождите, пока Flume запустится нормально, и вы увидите, что данные журнала начнут выводиться на консоль.
3.3 Сбор данных
Сбор данных — это самое основное звено в данных журнала. Данные журнала обычно проходят следующие этапы:
Сбор: чтение файлов журналов, получение журналов с сервера журналов и т. д., а также чтение данных журналов на компьютер, на котором расположен Flume.
Разделить: Если файл журнала слишком велик, вам необходимо разделить файл журнала. Flume предоставляет несколько плагинов для полной сегментации файлов журналов, например разделители SpoolDirArchive и TaildirNewLineEscaped.
Анализ: Flume поддерживает несколько анализаторов форматов журналов, таких как RegexParser, Log4jEventDeserializer и т. д. После анализа данных журнала они будут сохранены в кэше памяти в соответствии с указанным форматом.
Маршрутизация: Flume отправляет проверенные данные журнала в указанные каналы, настраивая правила фильтрации.
Потребление: когда данные журнала поступают в каналы, Flume будет использовать их по порядку и записывать в указанное место назначения (например, HDFS, HBase, MySQL и т. д.).
Очистка: Flume поддерживает различные методы очистки данных журналов, такие как удаление специальных символов, преобразование IP-адресов, дедупликация и т. д.
Конкретные шаги:
Чтение данных журнала из источника журнала. Вы можете использовать ExecSource или SpoolDirectorySource в качестве источника данных для записи данных журнала в канал кэша Flume.
Анализ и очистка данных: Flume поддерживает несколько анализаторов форматов журналов, таких как RegexParser, Log4jEventDeserializer и т. д. Вы также можете писать собственные анализаторы. В то же время Flume поддерживает различные методы очистки данных журналов, такие как удаление специальных символов, преобразование IP-адресов, дедупликация и т. д.
Отправляйте данные в каналы в соответствии с правилами маршрутизации: Flume поддерживает правила маршрутизации, основанные на регулярных выражениях, типах событий, временных метках, хостах и т. д.
Храните данные в каналах: Flume поддерживает несколько типов каналов, включая каналы памяти, файловые каналы, каналы базы данных и т. д. Различные типы каналов можно гибко настроить с помощью файлов конфигурации.
Запись данных в место назначения: Flume поддерживает несколько мест назначения, включая HDFS, HBase, MySQL и т. д., и может быть гибко настроен с помощью файлов конфигурации.
3.4 Обработка данных
Обработка данных — это следующий шаг после сбора данных журнала. Основными задачами являются:
Анализ данных: анализируйте данные журналов, кэшированные Flume, в соответствии с потребностями бизнеса для формирования показателей или данных, связанных с бизнесом.
Оценка качества журнала: оценивайте точность, полноту, работоспособность и другие параметры данных журнала, кэшированных Flume, обнаруживайте аномальные данные и обрабатывайте их соответствующим образом.
Отчет о данных: суммирование, подсчет, запрос и другие операции с данными журнала, кэшированными Flume, для формирования отчета с данными и представления его персоналу, связанному с бизнесом.
Хранение данных: храните данные журнала, кэшированные Flume, на различных устройствах хранения, таких как HDFS, MySQL и т. д.
Конвейерная обработка данных. В процессе сбора, обработки и хранения журналов можно спроектировать конвейер обработки данных, позволяющий передавать данные журналов между различными ссылками.
Конкретные шаги:
Используйте платформы обработки больших данных, такие как MapReduce или Spark, для анализа и обработки данных журналов, кэшированных Flume.
Запросите кэшированные данные журнала Flume через механизмы SQL, такие как Hive, Impala и Drill.
Используйте HTTP Post Sink, предоставляемый Flume, для синхронизации данных с внешними системами, такими как Elasticsearch, Kafka и т. д.
Используйте Sqoop Source и Sqoop Connector, предоставленные Flume, для импорта данных в кластер Hadoop.
Используйте канал JDBC, предоставленный Flume, для импорта данных в реляционную базу данных.
Используйте JMS Sink, предоставленный Flume, для синхронизации данных с внешними системами.