Как настроить 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
-
Необходимо создать 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/