Как настроить HTTP-источник для тестирования установки Flume?

Я новичок в Flume и Hadoop. Мы разрабатываем модуль BI, где мы можем хранить все журналы с разных серверов в HDFS.

Для этого я использую Flume. Я только начал проверять это. Успешно создан node, но теперь я готов настроить источник HTTP и приемник, который будет записывать входящие запросы через HTTP в локальный файл.

Любые предложения?

Спасибо в Advance/

Ответ 1

Надеюсь, это поможет вам начать работу. У меня возникли проблемы с тестированием этого на моей машине и у меня нет времени, чтобы полностью устранить его прямо сейчас, но я доберусь до этого...

Предполагая, что у вас есть Flume и работает прямо сейчас, это должно быть то, что ваш файл flume.conf должен выглядеть как использовать источник HTTP POST и локальный файловый приемник (обратите внимание: это касается локального файла, а не HDFS)

########## NEW AGENT ########## 
# flume-ng agent -f /etc/flume/conf/flume.httptest.conf -n httpagent
# 

# slagent = SysLogAgent
###############################
httpagent.sources = http-source
httpagent.sinks = local-file-sink
httpagent.channels = ch3

# Define / Configure Source (multiport seems to support newer "stuff")
###############################
httpagent.sources.http-source.type = org.apache.flume.source.http.HTTPSource
httpagent.sources.http-source.channels = ch3
httpagent.sources.http-source.port = 81


# Local File Sink
###############################
httpagent.sinks.local-file-sink.type = file_roll
httpagent.sinks.local-file-sink.channel = ch3
httpagent.sinks.local-file-sink.sink.directory = /root/Desktop/http_test
httpagent.sinks.local-file-sink.rollInterval = 5

# Channels
###############################
httpagent.channels.ch3.type = memory
httpagent.channels.ch3.capacity = 1000

Запустите Flume с помощью команды во второй строке. Подстройте его для ваших нужд (порт, sink.directory и rollInterval особенно). Это довольно простой минимальный файл конфигурации, есть больше доступных вариантов, ознакомьтесь с руководством пользователя Flume. Теперь, насколько это возможно, агент запускается и работает отлично для меня....

Вот что у меня нет времени на тестирование. Агент HTTP по умолчанию принимает данные в формате JSON. Вы должны проверить этот агент, отправив запрос cURL с формой примерно так:

curl -X POST -H 'Content-Type: application/json; charset=UTF-8' -d '{"username":"xyz","password":"123"}' http://yourdomain.com:81/

-X задает запрос POST, -H отправляет заголовки, -d отправляет данные (действительный json), а затем порт host:. Проблема для меня в том, что я получаю сообщение об ошибке:

WARN http.HTTPSource: Received bad request from client. org.apache.flume.source.http.HTTPBadRequestException: Request has invalid JSON Syntax.

в моем клиенте Flume, недействительный JSON? Так что что-то посылается неправильно. Тот факт, что ошибка появляется, показывает, что источник Flume получает данные. Независимо от того, что вы используете, POST должен работать до тех пор, пока он находится в допустимом формате.

Ответ 2

Немного сложно точно сказать, чего вы хотите от того, как формулируется вопрос, но я исхожу из предположения, что вы хотите отправить JSON в Flume с помощью HTTP POST-запросов, а затем сбросить Flume эти события JSON в HDFS (не локальная файловая система). Если это то, что вы хотите сделать, это то, что вам нужно сделать.

  • Убедитесь, что вы создали каталог в HDFS для Flume, чтобы сначала отправить события. Например, если вы хотите отправлять события в /user/flume/events в HDFS, вам, вероятно, придется запускать следующие команды:

    $ su - hdfs
    $ hdfs dfs -mkdir /user/flume
    $ hdfs dfs -mkdir /user/flume/events
    $ hdfs dfs -chmod -R 777 /user/flume
    $ hdfs dfs -chown -R flume /user/flume
    
  • Настройте Flume для использования источника HTTP и HDFS-раковины. Вы захотите добавить в перехватчики Host и Timestamp, иначе ваши события вызовут исключения в HDFS Sink, потому что этот приемник ожидает Host и Timestamp в заголовках событий. Также убедитесь, что вы открыли порт на сервере, который прослушивает HTTPSource Flute.

    Здесь пример конфигурации Flume, который работает для контейнера Clocker Quickstart Docker для CDH-5.7.0

# Please paste flume.conf here. Example:

# Sources, channels, and sinks are defined per # agent name, in this case 'tier1'.
tier1.sources  = source1
tier1.channels = channel1
tier1.sinks    = sink1
tier1.sources.source1.interceptors = i1 i2 
tier1.sources.source1.interceptors.i1.type = host
tier1.sources.source1.interceptors.i1.preserveExisting = false
tier1.sources.source1.interceptors.i1.hostHeader = host
tier1.sources.source1.interceptors.i2.type = timestamp

# For each source, channel, and sink, set # standard properties.
tier1.sources.source1.type     = http
tier1.sources.source1.bind     = 0.0.0.0
tier1.sources.source1.port     = 5140
# JSONHandler is the default for the httpsource # 
tier1.sources.source1.handler = org.apache.flume.source.http.JSONHandler
tier1.sources.source1.channels = channel1
tier1.channels.channel1.type   = memory
tier1.sinks.sink1.type         = hdfs
tier1.sinks.sink1.hdfs.path = /user/flume/events/%y-%m-%d/%H%M/%S
tier1.sinks.sink1.hdfs.filePrefix = event-file-prefix-
tier1.sinks.sink1.hdfs.round = false
tier1.sinks.sink1.channel      = channel1

# Other properties are specific to each type of # source, channel, or sink. In this case, we # specify the capacity of the memory channel.
tier1.channels.channel1.capacity = 1000
  1. Необходимо создать Flume Client, который может отправлять события JSON в Flume HTTP в ожидаемом формате (этот клиент может быть таким же простым, как запрос curl). Самое главное в этом формате состоит в том, что ключ JSON "body": должен иметь значение , которое является строкой. "body": не может быть объектом JSON. Если это так, то библиотека Gson, используемая Flume JSONHandler для разбора JSONEvents, будет генерировать исключения, потому что она не сможет проанализировать JSON - ожидается строка String.

    Это формат JSON, который вам нужен:

[
  {
    "headers": {
      "timestamp": "434324343",
      "host": "localhost",
    },
    "body": "No matter what, this must be a String, not a list or a JSON object",
  },
  { ... following events take the same format as the one above ...}
]

Устранение неполадок

  • Если Flume отправляет вашему клиенту (например, Curl) 200 OK сообщения о успехе, но вы не видите никаких файлов на HDFS, проверьте журналы потока. Проблема, с которой я столкнулся раньше, заключалась в том, что мой канал Flume не имел достаточной емкости и не мог получить никаких событий в результате. Если это произойдет, канал или HTTPSource будут генерировать исключения, которые вы сможете увидеть в журналах потоков (возможно, в /var/log/flume-ng/). Чтобы устранить эту проблему, увеличьте tier1.channels.channel1.capacity.
  • Если вы видите Исключения в журналах Flume, указывающие, что Flume не мог записывать в HDFS из-за разрешений или из-за невозможности найти целевой каталог, убедитесь, что вы создали целевой каталог в HDFS и открыли его разрешения, как описано в шаге 1 выше.

Ответ 3

Попробуйте следующее:

curl -X POST -H 'Content-Type: application/json; charset = UTF-8 '-d' [{ "username": "xrqwrqwryzas", "password": "12124sfsfsfas123" }] 'http://yourdomain.com:81/