Базовая практика обучения Flume

Основы Flume

1. Что такое Flume?

Flume - это фреймворк для сбора данных и сбора журналов, которые собираются распределенным образом (высокодоступный распределенный)

Суть: данные журналов можно эффективно собирать с различных веб-серверов и хранить в HDFS, hbase.

2. К каким источникам данных может подключаться Flume?

      Консоль 、 RPC 、 Текст 、 Хвост 、 Системный журнал 、 Exec 等

3. Каково место назначения вывода источника данных, принимаемого Flume?

      Диск, hdfs, hbase, kafka передаются по сети

data-> flume-> kafka-> потоковая передача искр / шторм / флинк -> hbase, mysql

4. Процесс развертывания агента на сервере, отвечающего за сбор данных журнала сервера.

5. Flume использует событие, чтобы использовать объект события в качестве формата передачи данных, который является основной единицей внутренней передачи данных.

Две части: состоящие из байтового массива перепечатанных данных + необязательный заголовок

6. Агент: Три важных компонента:

источник: указывает источник данных лотка

канал: пул хранения

файл: убедитесь, что данные не потеряны, а скорость относительно низкая.

память: данные могут быть потеряны, быстрее

Когда передача данных завершена, событие удаляется из канала - (надежность)

сток: передать событие на внешний носитель

 

• Функции:

- Поддержка настройки различных отправителей данных в системе журналов для сбора данных

- Flume предоставляет возможность просто обрабатывать данные и писать различным получателям данных (настраивается)

Особенности лотка

  • Flume - это распределенная, надежная и высокодоступная система массового сбора, агрегирования и передачи журналов.
  • Flume может собирать различные формы исходных данных, такие как файлы, пакеты сокетов, файлы, папки, кафка и т. Д.
  • Он также может выводить собранные данные во многие внешние системы хранения, такие как HDFS, hbase, hive, kafka и т. Д.
  • Общие требования к сбору могут быть выполнены за счет простой конфигурации лотка.
  •  Flume также имеет хорошие возможности настраиваемого расширения для особых сценариев , поэтому Flume можно применять к большинству сценариев ежедневного сбора данных.
  • Флюм труба на основе сделки , чтобы гарантировать , что данные в передаче и приеме по консистенции.
  • Flume поддерживает многопутевый трафик , трафик многоканального доступа, трафик многоканального доступа, контекстную маршрутизацию и т. Д.

Сердечник лотка

Событие Flume

Объект события - это основная единица передачи данных в Flume.

• Две части: событие состоит из байтового массива перепечатанных данных + необязательного заголовка.

• Событие состоит из нуля или более заголовков и тела

Заголовок имеет форму ключа / значения , который может использоваться для принятия решений о маршрутизации или передачи другой структурированной информации (например, метки времени события или имени хоста сервера, на котором возникло событие). Вы можете думать об этом как о предоставлении той же функции, что и HTTP-заголовок, через этот метод для передачи дополнительной информации за пределы тела.

Body - это массив байтов, который содержит фактическое содержимое.

заголовки (необязательно) -> ключ

тело (данные) -> значение

Агент Flume

Внутри Flume есть один или несколько агентов.

• Каждый агент - это независимый демон (JVM).

• Где получить коллекцию от клиента или от других агентов, а затем быстро передать полученные данные следующему агенту узла назначения.

• Агент в основном состоит из трех компонентов: источника, канала и приемника.

Источник агента

• Источник Flume

• Отвечает за внешний источник (генератор данных), например за события, доставленные ему веб-сервером.

• Внешний источник отправляет свои события в Flume в формате, который Flume может распознать.

• Когда источник Flume получает событие, он сохраняет событие через один или несколько каналов.

Канал агента

• Канал: в виде пассивного хранения , то канал будет кэшировать событие , пока событие не обрабатывается компонент мойки

• Таким образом, Channel - это краткосрочный контейнер хранения . Он кэширует данные формата событий, полученные от источника, до тех пор, пока они не будут использованы приемниками. Он действует как мост между источником и приемником, а канал является полным. Транзакция, это обеспечивает согласованность данных при отправке и получении. И это может быть связано с любым количеством источников и приемников.

• Максимальное количество событий может быть установлено параметрами

• Flume обычно выбирает FileChannel вместо Memory Channel.

- Канал памяти : транзакции с памятью, пропускная способность очень высока, но есть риск потери данных

- Файловый канал : режим реализации транзакции на локальном диске, чтобы гарантировать, что данные не будут потеряны (реализация WAL), журнал упреждающей записи (журнал упреждающей записи на диск)

Агент Раковина

• Sink удалит событие из канала и поместит событие на внешний носитель данных.

- Например: через канал Flume HDFS Sink для помещения данных в HDFS или размещение рядом с исходным потоком Flume до следующей обработки Flume.

- Для событий, кэшированных в канале, Source и Sink обрабатываются асинхронно.

• После того, как Sink успешно удалит событие, удалите событие из канала.

• Раковина должна воздействовать на точный канал.

Различные типы моек:

- Сохранить событие в конечном терминале назначения : HDFS, Hbase

- Автоматическое потребление: Null Sink

- Используется для связи между агентами: Avro

Агент Интерцепто

• Перехватчик - это набор перехватчиков для источника, который фильтрует и настраивает события в соответствии с заданным порядком и при необходимости.

Реализация логики обработки

• Между приложением (журналом приложения) и источником журнал приложения перехватывается. То есть ввести в журнал

Перед источником выполните некоторые действия, такие как упаковка, обновление и фильтрация журналов.

• Официально предоставленными существующими перехватчиками являются:

- Timestamp Interceptor: добавьте ключ в заголовок события с именем: timestamp, value - текущая временная метка.

- Host Interceptor: добавьте ключ в заголовок события с именем: host, значение - это имя хоста или IP-адрес текущего компьютера.

- Статический перехватчик: вы можете добавить пользовательский ключ и значение в заголовок события.

- Regex Extractor Interceptor: добавьте указанный ключ в заголовок с помощью регулярных выражений, и значение будет частью регулярного сопоставления

• Перехватчик Flume также выполнен в виде цепочки.Вы можете указать несколько перехватчиков для источника и обрабатывать их последовательно.

Селектор агентов

• Существует два типа переключателей каналов:

Селектор репликации каналов (по умолчанию): отправка событий из источника на все каналы

Multiplexing Channel Selector: Мультиплексирование можно выбрать на волосы , на какой канал

• Очевидно, что для выборочного выбора источников данных необходимо использовать мультиплексирование в качестве метода распределения.

• Проблема: при мультиплексировании необходимо определить значение ключа, указанного в заголовке, чтобы решить распространить его по конкретному каналу . 1. Если demo и demo2 работают на одном сервере в одно и то же время, если они работают на разных серверах, мы может добавить его в перехватчик хоста source1 A, чтобы вы могли определить, в какой канал событие должно быть передано хостом в заголовке. Это на том же сервере. Хост не может различить источник журнала. Мы должны найти способ добавить единицу к ключу заголовка, чтобы отличить источник журнала

Это можно решить, настроив разные источники в апстриме.

 

надежность:

• Flume гарантирует надежность одиночного прыжка : событие будет удалено из канала после завершения передачи.

• Flume использует транзакционный метод для обеспечения надежности взаимодействия событий.

• В течение всего процесса, если шаг был принудительно завершен из-за прерывания сети или по другим причинам, данные будут повторно переданы в следующий раз.

• Надежность Flume также отражается во временном хранении данных.Когда цель недоступна, данные будут временно сохранены в канале.После того, как цель станет доступной, данные будут временно сохранены.

Выполнить повторную передачу контрольной точки Taildir

• Источник и приемник инкапсулированы в хранилище и извлечение транзакции, то есть размещение или предоставление событий обеспечивается отдельно транзакцией через канал. Эта гарантия

Для обеспечения надежной сквозной доставки наборов событий в потоке .

- Sink запускает транзакцию

- Sink получает данные из канала

- Sink отправляет данные источнику другого агента Flume

-Источник открывает транзакцию

- Источник передает данные в канал

-Источник закрывает транзакцию

- Sink закрывает сделку

Практика лотка:

Переименуйте агента: a1

источники : r1

раковины: k1

каналы: c1

] # vim flume.conf

Запустите flume-ng

./bin/flume-ng agent --conf conf --conf-file ./conf/flume.conf -name a1 -Dflume.root.logger = DEBUG, console

Требование 1. Используйте netcat как источник и приемник как регистратор

./bin/flume-ng agent --conf conf --conf-file ./conf/example.conf -name a1 -Dflume.root.logger = INFO, консоль

Требование 2: использование netcat в качестве источника и приемника в качестве регистратора, теперь я забочусь о буквах и отфильтровываю числа

./bin/flume-ng agent --conf conf --conf-file ./conf/example.conf -name a1 -Dflume.root.logger = INFO, консоль

Требование 3: используйте netcat в качестве источника и приемника для записи в hdfs

./bin/flume-ng agent --conf conf --conf-file ./conf/example.conf -name a1 -Dflume.root.logger = INFO, консоль

Как настроить лоток, чтобы не было слишком много маленьких файлов?

а. Ограничьте размер файловых данных в файле.

a1.sinks.k1.hdfs.rollSize = 200 * 1024 * 1024

б. Ограничьте количество событий, которые может хранить файл.

a1.sinks.k1.hdfs.rollCount = 10000

Требование 4: запись в регистратор через HTTP в качестве источника и приемника

./bin/flume-ng agent --conf conf --conf-file ./conf/header_test.conf -name a1 -Dflume.root.logger = INFO, консоль

curl -X POST -d '[{"заголовки": {"отметка времени": "434324343", "хост": "random_host.example.com"}, "body": "random_body"}, {"заголовки": { "namenode": "namenode.example.com", "datanode": "random_datanode.example.com"}, "body": "badou, badou"}] 'master: 50020

Здесь вы также можете получить к нему доступ через slave1

Требование 5: Подключите агент последовательно агент-> агент

1 、 раб2:

./bin/flume-ng агент -c conf -f conf / pull.conf -n a2 -Dflume.root.logger = INFO, консоль

2 、 мастер:

./bin/flume-ng agent -c conf -f conf / push.conf -n a1 -Dflume.root.logger = INFO, консоль

3. Выполнить на мастере

telnet localhost 44444

 

Требование 5. Отслеживайте изменения файла журнала через поток, а затем, наконец, погрузитесь в регистратор, чтобы получить файл формата json.

python flume_data_write.py

./bin/flume-ng agent --conf conf --conf-file ./conf/flume_kafka.conf -name a1 -Dflume.root.logger = INFO, console

 

 

Требование 6: лоток + кафка

1. Сначала запустите zookeeper

./zkServer.sh start

Конфигурация Zookeeper: 1. vim zoo.cfg 2. vim data / myid - это номер записанного числа

 

2. Мастер запускает кафку (порт 9092)

./bin/kafka-server-start.sh config / server.properties & (Фоновый запуск)

Три способа проверить, нормально ли начался процесс :

jobs -l: просмотр фоновых процессов

ps -ef | grep 32918: просмотр фоновых процессов.

netstat -anp | grep 9092: Просмотр номера порта

 

 

- Просмотр темы кафки

bin / kafka-topics.sh --list --zookeeper localhost: 2181

- Создать тему

bin / kafka-topics.sh --create --zookeeper localhost: 2181 - коэффициент репликации 1 --partitions 1 --topic badou_for_20

- Расход по теме badou_for_20

./bin/kafka-console-consumer.sh --zookeeper master: 2181 --topic badou_for_20 --from-begin

3. Запустить лоток

./bin/flume-ng agent --conf conf --conf-file ./conf/flume_kafka.conf -name a1 -Dflume.root.logger = INFO, console

4. Очистите файл журнала.

эхо ''> flume_exec_test.txt

5. Запустите python flume_data_write.py, чтобы имитировать запись внутреннего журнала в файл журнала.

# -*- coding: utf-8 -*-

import random

import time

import pandas as pd

import json

writeFileName="/usr/local/src/badou_code/flume/data/flume_exec_test.txt"

cols = ["order_id","user_id","eval_set","order_number","order_dow","hour","day"]

df1 = pd.read_csv('/usr/local/src/badou_code/hive/data/orders.csv')

df1.columns = cols

df = df1.fillna(0)

with open(writeFileName,'a+')as wf:

for idx,row in df.iterrows():

d = {}

for col in cols:

d[col]=row[col]

js = json.dumps(d)

wf.write(js+'\n')

# rand_num = random.random()

# time.sleep(rand_num)

рекомендация

отblog.csdn.net/qq_36816848/article/details/113633737