Проверьте, поддерживает ли система команду msg . Функционал этой команды во многом аналогичен функционалу неиспользуемой команды net send . Но эта команда работает только в профессиональной и корпоративной версиях Windows. Если вы работаете в Windows Домашняя, обновите систему до версии Профессиональная или Корпоративная, чтобы получить возможность пользоваться командой msg .

  • Чтобы узнать версию Windows, нажмите ⊞ Win + Pause или щелкните правой кнопкой мыши по «Компьютер» и выберите «Свойства». Версия Windows отобразится в разделе «Издание Windows».

Откройте командную строку. Как и net send , команда msg запускается из командной строки. Командная строка запускается разными способами (в зависимости от версии Windows), или просто нажмите ⊞ Win и введите cmd.

  • Windows Vista/7: откройте командную строку из меню «Пуск».
  • Windows 8.1/10: щелкните правой кнопкой мыши по кнопке «Пуск» и выберите «Командная строка».
  • Windows 8: нажмите ⊞ Win + X и выберите «Командная строка».
  • Введите команду. Введите msg и нажмите Пробел . Далее нужно ввести информацию, которая содержит текст и направление сообщения.

  • Определите получателя сообщения. По сравнению с net send , команда msg обладает дополнительными опциями.

    • msg имя пользователя – введите имя конкретного пользователя.
    • msg сеанс – введите имя конкретного сеанса.
    • msg ID сеанса – введите идентификатор конкретного сеанса.
    • msg @ filename – введите имя файла, который содержит список имен пользователей, сеансов и/или идентификаторов сеансов. Полезно для отправки сообщений сотрудникам отделов.
    • msg * – сообщение будет отправлено всем пользователям, которые подключены к серверу.
  • Укажите сервер, пользователям которого нужно отправить сообщение (если хотите). Если нужно отправить сообщение пользователю, который подключен к другому серверу, после информации о получателе введите информацию о сервере. Если сервер не указан, сообщение будет отправлено на текущий сервер.

    • msg * /server: имя сервера
  • Задайте ограничение по времени (если хотите). Можно задать ограничение по времени, чтобы указать интервал ожидания подтверждения от получателя. Временной модификатор вводится после информации о сервере (если она есть).

    • msg * /time: секунды (например, 300 секунд для пятиминутного интервала)
  • Введите текст сообщения. После ввода различных параметров введите текст сообщения. Или нажмите ↵ Enter , и система предложит ввести текст сообщения в отдельной строке.

    • Например: msg @salesteam /server:EASTBRANCH /time:600 Поздравляю с увеличением продаж в этом квартале!
  • Отправьте сообщение. Для этого нажмите ↵ Enter . Адресат получит его немедленно.

    • Команда msg предназначена для отправки сообщений пользователям терминалов, а не только разным компьютерам, подключенным к одной сети.
  • Устраните неполадки. При работе с msg можно столкнуться со следующими ошибками:

    • "msg" is not recognized as an internal or external command, operable program or batch file. (msg не распознается в качестве внутренней или внешней команды, исполняемой программы или пакетного файла). В этом случае версия Windows не поддерживает msg . Обновите Windows до версии Профессиональная.
    • Error 5 getting session names (Ошибка 5 получение имен сеансов) или Error 1825 getting session names (Ошибка 1825 получение имен сеансов). Ошибка при общении с получателем. Можно попытаться устранить такую неполадку, если на компьютере получателя открыть редактор реестра (для этого выполните команду regedit), перейти в HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server и изменить значение параметра «AllowRemoteRPC» с 0 на 1.
  • А именно. разбирались, как , и начали разбираться с клавиатурой. Давайте теперь разберемся с сообщениями. Для этого переходите по иконке Сообщения , которая находится правее иконки Контакты , и перед Вами появится список сообщений, которые Вы отправляли, и которые к Вам приходили. Теперь нажмите на левую сенсорную кнопку в нижней части (в виде прямоугольника). Появляется окошко, в котором находится три иконки: Поиск , Настройка и Удалить беседы .

    Зайдите в настройки. В пункте Размер шрифта сообщения можно выбрать размер шрифта: он может быть обычным, маленьким и совсем мелким.

    Можно также выбрать цвет фона, удалить старые сообщения, и поставить ограничения для количества SMS и MMS.

    Теперь вернитесь на список сообщений, и нажмите вверху справа на иконку Создать сообщение с изображением конверта. Открывается окно с полями, в которых можно написать имя контакта и само сообщение. Кликните по любому полю, и у Вас появится сенсорная клавиатура. Нажмите на клавиатуре на кнопку Настройки (с изображением шестеренки), и в новом окне Вы можете выбрать тип клавиатуры, нажав на соответствующий пункт.

    Работать с Android можно на одном из четырех видов клавиатур. Первый вид Qwerty — стандартный. Есть также клавиатура 3×4 , которая похожа на клавиатуру обычного телефона. Также можно выбрать Окно рукописного ввода . Вместо клавиатуры в этом случае появляются квадратики. В верхних квадратиках можно пальцем рисовать буквы, слева внизу — цифры, и справа внизу — знаки. В случае выбора варианта Окно рукописного ввода 2 появляется большое поле, в котором Вы рисуете буквы, цифры и знаки для сообщения.

    Если буквы Вы рисуете коряво, то сверху будут появляться варианты, среди которых нужно будет выбрать правильный.

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

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

    Также справа от поля контактов есть кнопка, нажав на которую, Вы открываете список контактов, и выбираете из него.

    Давайте рассмотрим еще некоторые возможности программы Skype. Представьте себе: вы слышали о том, что с помощью этой программы можно разговаривать, делать видеозвонки, но в вас нет ни гарнитуры, ни веб-камеры и, вдобавок ко всему у вас небольшая скорость соединения с Интернет. Зачем же мне эта программа, - скажете вы. Но оказывается Skype можно использовать и для передачи текста, т.е. вы можете писать своему собеседнику обыкновенные тексты. Как это сделать?

    Вначале убедитесь, что ваш собеседник находится в сети (об этом свидетельствует значок зеленого цвета). Затем выделите нужный контакт в вашем списке пользо­вателей, выполните щелчок правой кнопкой мыши и в контекстном меню вы­берите пункт «Начать чат» , откроется специальное окно чата. Внизу вы можете писать свои сообщения и, нажимая на синюю кнопку «Отправить сообщения» (справа), передавать их своему собеседнику.

    Во время переписки, помимо имени учетной записи, указывается еще и время, когда вы послали сообщение. Кроме того, имена учетных записей участников чата отличаются по цвету, так что, перечитывая написанное ранее, вы легко смо­жете установить, кому принадлежит та или иная фраза.

    Закончив переписку, просто выполните щелчок на кнопке «Закрыть» в верх­нем правом углу окна. В таком случае окно закроется, но чат останется активным, то есть вы сможете вернуться к нему в лю­бое удобное для вас время. Для этого в списке контактов просто выберите того пользователя, окно с чатом которого вы закрыли, и уже известными вам способами, например двойным щелчком, снова откройте окно чата. В итоге появится то же окно со всеми сообщениями, которыми вы обменивались до этого момента.

    Окно чата содержит большое количество дополнитель­ной информации. Вы можете изменять ее, подстраивая все под свои нужды. Вы можете скрыть все лишние элементы для увеличения пространства окна сообщений. Для того чтобы скрыть сведения об аватаре пользователя и данные учетной записи, необходимо выполнить двойной щелчок на строке состояния пользователя, содержащей имя учетной записи.

    Вы можете изменить шрифт и размер текста. Для этого вос­пользуйтесь командой «Инструменты» - «Настройки» - «Чаты» - «Визу­альное оформление чата» . В открывшемся окне, нажав кнопку «Изменить шрифт» , можно выбрать другой шрифт и его размер.

    По умолчанию окно для ввода сообщения занимает мало места. Это необходимо для того, чтобы дать возможность максимально отобразить окно сообщений. Вы можете изменить размеры окна для текста, перетащив границу. Для этого наведите указатель мыши на границу между окнами, и когда он примет вид дву­сторонней стрелки, переместите ее в нужном направлении, удерживая нажатой кнопку мыши.

    Для выражения своих чувств, эмоций во время разговора можно использовать различные значки-смайлы. Для того чтобы найти и вставить подходящий смайл, не­обходимо нажать специальную кнопку в окне чата (слева нарисована рожица) и в появив­шемся окне выбрать то изображение, которое наиболее под­ходит к случаю. При этом внизу списка слева отображается эмоция, которую данный смайл символизирует, а справа - ее символьный эквивалент.

    В программе сохраняется история ваших разговоров. Вы можете убедиться в этом вы­полнив команды «Инструменты» «Настройки» «Чаты и SМC» «Настройки чата» . Затем выберите команду «Открыть дополнительные настройки» . В списке «Сохранять историю в течение» выберите нужное зна­чение.

    Вы также можете не сохранять историю чата. Для этого вам нужно выбрать значение «Не сохранять» , а затем, чтобы уда­лить предыдущие записи, нажать кнопку«Очистить историю» .

    Теперь, когда вы одновременно с каким-либо пользова­телем откроете окно чата, вы сможете просмотреть историю ваших разговоров. Для этого нужно выполнить щелчок на со­ответствующей команде в окне сообщений.

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

    Еще на одну особенность я хочу обратить ваше внимание: вы можете переписываться сразу с несколькими собеседниками , т.е организовать групповой чат. При этом у каждого из них будет ото­бражаться на экране информация о том, что пишут и отве­чают другие. Групповой чат можно организовать следующим образом:

    1. Открыть окно чата с первым пользователем, выполнив на нем двойной щелчок или обратившись к соответствующей команде контекстного меню.
    2. Чтобы пригласить следующего пользователя, просто выделите его и, удерживая нажатой левую кнопку мыши, перетащите в созданное до этого окно чата на область с аватарой (справа вверху). После этого все участники получают сообщения о том, что создан групповой чат, и ссылку для перехода к нему. Щелкнув по этой ссылке, пользователь переходит в окно группового чата.
    3. Другой путь создания группового разговора – использование кнопки «Добавить» . После нажатия на нее, выберите команду «Создать групповой разговор» , а затем в правое верхнее окно перетащите тех пользователей, с которыми хотите поговорить. Можно также использовать кнопку «Добавить контакты» , расположенную в верхней части группового чата. После нажатия кнопки появляется окно «Добавь участников» , в котором вы можете выбрать нужных вам собеседников. Их нужно выделить, а затем нажать кнопку «Выбрать» . Для выбора сразу нескольких пользователей используйте клавишу «Сtrl» .

    Группу участников чата можно сохранить в списке контактов. Для этого нажмите кнопку «Сохранить группу в списке контактов» (над аватарами участников разговора). В появившемся окне «Сохранить группу» нажмите «ОК» .

    Кроме сохранения группы пользователей вы можете ввести тему группового разговора. Для этого просто выполните щелчок на специальной области для темы около аватара и введите назва­ние темы. Дополнительно вы можете «оживить» тему, добавив анимационную картинку.

    Самое интересное то, что вы можете вести другой, па­раллельный, разговор с пользователями, которые включены в групповой чат. При этом этот разговор будете наблюдать только вы и ваш собеседник, другие пользователи группы не будут даже подозревать о нем. Чтобы осуществить это, вам необходимо выделить нужного пользователя в вашем списке контактов и с помощью контекстного меню выбрать команду «Начать чат» .

    Наконец, вы можете во время разговора со своими друзьями послать им какой-либо файл, причем отправить файл вы можете сразу всем участникам группы. Ваши собеседники также могут послать файл всем остальным участникам. Однако, следует учитывать, что у того, кто рассылает файл, есть возможность вы­брать адресатов. Для этого нужно нажать стрелку рядом с по­сылаемым файлом, а затем - кнопку «Отменить» напротив того пользователя, для которого отсылаемый файл не предназна­чен.

    На этом пока все. Желаю успехов в освоении этой замечательной программы. Жмите кнопки и устанавливайте связь с друзьями!

    Если вам нужно послать файл только одному пользовате­лю из группы, то выполните щелчок правой кнопкой на аватаре этого пользователя и в контекстном меню выберите команду «Отпра­вить файл».

  • Разработка веб-сайтов
  • Привет, Хабр! В этом цикле статей я планирую рассказать о том, как можно организовать сбор и передачу данных с помощью одного из инструментов Hadoop - Apache Flume .


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

    В продолжении цикла я постараюсь более подробно осветить каждый из компонентов Flume, рассказать о том, как настроить мониторинг для него, написать свою реализацию одного из элементов и многое другое.

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

    Flume представляет собой инструмент, позволяющий управлять потоками данных и, в конечном счете, передавать их на некоторый “пункт назначения” (например, в файловую систему или HDFS).

    В целом, организация транспортировки данных посредством Flume напоминает создание эдакого “конвейера” или “водопровода”. Этот “конвейер” состоит из различных участков (узлов), на которых и происходит управление потоком данных (фильтрация, разделение потока и т.п.).

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

    Для начала обозначим основные термины, а затем мы рассмотрим структуру одиночного узла Flume.

    2. Основные термины

    • Событие (event) - единица данных с дополнительной мета-информацией. По структуре событие напоминает POST-запрос.
      • Заголовки (headers) - мета-информация, набор пар “ключ”-”значение”.
      • Содержимое (body) - собственно, данные, ради передачи которых всё затевается. Передается как byte.
    • Клиент (client) - внешний, по отношению к узлу Flume, сервис, поставляющий данные.
    • Источник (source) - отвечает за прием данных. При этом Flume предусматривает два типа источников - EventDrivenSource и PollableSource. В первом случае источник сам решает, когда добавлять события в канал (например, HTTPSource добавляет события по мере получения HTTP-запросов). PollableSource в противовес EventDrivenSource является пассивным - Flume просто периодически опрашивает источник на предмет появления новых событий.
    • Сток (Sink) - компонент, отвечающий за передачу данных на следующий этап обработки. Это может быть другой узел Flume, файловая система, HDFS и т.п.
    • Канал (channel) - компонент, выполняющий роль буфера при транспортировке данных. Канал является пассивным компонентом, он самостоятельно не инициирует никаких действий. Источники добавляют события в канал, в то время как стоки его опустошают.
    • Агент (agent) - процесс, в рамках которого функционируют компоненты Flume (источники, каналы, стоки). JVM Instance, в общем. Один узел может содержать несколько агентов.

    3. Структура узла Flume

    Правильнее было бы назвать этот подраздел “Структура агента Flume”, т.к. узел Flume может состоять из нескольких агентов. Но в рамках данной статьи все примеры будут приводиться как “один узел - один агент”, поэтому я позволю себе вольность и пока не буду разделять эти понятия.

    Рассмотрим несколько конфигураций для различных жизненных случаев.

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

    Такую конфигурацию можно использовать для простых целей - например, узел является замыкающим в цепочке узлов нашего «водопровода» и выполняет всего одну роль: принимает данные и записывает их в файл (непосредственно записью занимается сток). Или же узел является промежуточным и просто передает данные дальше (иногда это полезно делать для обеспечения отказоустойчивости - например, развернуть такой узел на машине с Flume-клиентом, чтобы избежать потери данных при проблемах с сетью).


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

    Примечание: Flume располагает более тонкими инструментами для балансировки нагрузки между стоками, для этого используются Flume Sink Processor’ы. О них речь пойдет в следующих частях цикла.

    Дубликатор
    Такой узел Flume позволяет отправлять одни и те же события на несколько стоков. Может возникнуть вопрос - а зачем два канала, разве не может канал дублировать события сразу на два стока? Ответ - нет, поскольку не «канал раздает события», а «сток опустошает канал». Даже если бы такой механизм и существовал, то выход из строя одного из стоков привел бы к неработоспособности других (т.к. каналу бы пришлось работать по принципу “либо все смогли, либо никто”). Это объясняется тем, что при сбое на уровне стока отсылаемая пачка событий не исчезает «в никуда», а остается лежать в канале. Ибо транзакция.


    Примечание : в данном примере используется безусловное дублирование - т.е. в оба канала копируется все подряд. Flume позволяет не дублировать, а разделять события по некоторым условиям - для этого используется Flume Channel Selector. О нем речь также пойдет в следующих статьях цикла.

    Универсальный приемник
    Еще один полезный вариант конфигурации - с несколькими источниками. Крайне полезная конфигурация, когда необходимо “слить воедино” однотипные данные, полученные различными способами.

    Резюме:

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

    4. Конфигурация и запуск узла Flume

    Думаю, пришло время практических примеров. Стандартный пакет Flume содержит множество реализаций источников/каналов/стоков для разных случаев жизни - описание по их настройке можно найти . В рамках этой статьи я ограничусь самыми простыми реализациями компонентов:
    • Memchannel (канал, использующий оперативную память для хранения событий).
    • NetCat Source.
    • Logger Sink (сток, выводящий события в консоль).
    Пожалуй так выглядит самая простая конфигурация для узла Flume:

    ### ==================== Компоненты узла ==================== ### # Перечисляем все основные компоненты, из которых будет состоять наш узел: источники, каналы и узлы # .sources - имена источников, разделенные пробелом (в этом примере один источник: my_source) my-agent.sources = my-source # .channels - аналогично указываем имена каналов my-agent.channels = my-channel # .sinks - для стоков то же самое my-agent.sinks = my-sink ### ==================== Источник my_source ================== ### # Тип источника - netcat (источники из стандартной поставки Flume имеют зарезервированные имена-псевдонимы, # в общем случае здесь можно указать полное имя класса источника, в т.ч., вашего собственного) my-agent.sources.my-source.type = netcat # Указываем, куда биндить наш исчтоник my-agent.sources.my-source.bind = 0.0.0.0 my-agent.sources.my-source.port = 11111 # Указываем источнику канал (или список каналов, через пробел), куда отправлять полученные события my-agent.sources.my-source.channels = my-channel ### ==================== Канал my_channel ================== ### # Используем тип канала из пакета Flume - memory (как и с источником, здесь можно казать свой класс), который хранит события в памяти my-agent.channels.my-channel.type = memory # Вместимость канала, кол_во событий my-agent.channels.my-channel.capacity = 10000 # Число событий в одной транзакции (как на добавление, так и на "вытягивание") my-agent.channels.my-channel.transactionCapacity = 100 ### ==================== Сток my_sink ================== ### # Тип стока - логгер, пишуший события в консоль (и здесь также можно указать свой класс) my-agent.sinks.my-sink.type = logger # Из какого канала будем забирать события my-agent.sinks.my-sink.channel = my-channel # Настройка исключительно для стока типа logger - сколько первых байт тела события выводить в консоль my-agent.sinks.my-sink.maxBytesToLog = 256
    Осталось теперь запустить узел с нашей конфигурацией. Сделать это можно двумя способами:

    1. На кластере Hadoop, через Cloudera Manager ( есть подробное описание того, как это сделать).
    2. Как Java-сервис, используя библиотеки Flume.
    Поскольку процесс запуска Flume средствами Cloudera Manager освещен достаточно подробно, рассмотрим второй вариант - с помощью Java.

    Прежде всего необходимо добавить зависимости Flume к нашему проекту. Для этого добавим в pom.xml репозиторий Clodera и два артефакта Flume - ng-sdk и ng-node .

    cloudera https://repository.cloudera.com/artifactory/cloudera-repos/ org.apache.flume flume-ng-sdk 1.5.0-cdh5.3.0 org.apache.flume flume-ng-node 1.5.0-cdh5.3.0
    После этого создадим класс с точкой входа:

    Package ru.flume.samples; import org.apache.flume.node.Application; public class FlumeLauncher { public static void main(String args) { // файл с конфигурацией Log4j я позволю себе указать прямо здесь System.setProperty("log4j.configuration", "file:/flume/config/log4j.properties"); // Запускаем Flume с параметрами: Application.main(new String{ "-f", "/flume/config/sample.conf", // путь до файла с конфигурацией "-n", "my-agent" // имя агента }); } }
    Читатели, знакомые с Java, заметят, что можно вообще не создавать этот класс, а просто скопировать необходимые зависимости для Flume в отдельную папку и запустить Java с нужными аргументами командной строки. Но это уже дело вкуса - я предпочитаю, чтобы Maven сам подтягивал все необходимые зависимости, в том числе и разработанные нами компоненты Flume, и аккуратно всё это заворачивал в deb-пакет.

    Если все пути указаны верно, а конфигурация не содержит ошибок, мы увидим в консоле вот такой лог от Flume.

    Вывод Flume, если всё получилось

    INFO main conf.FlumeConfiguration - Processing:my-sink INFO main conf.FlumeConfiguration - Added sinks: my-sink Agent: my-agent INFO main conf.FlumeConfiguration - Processing:my-sink INFO main conf.FlumeConfiguration - Processing:my-sink INFO main conf.FlumeConfiguration - Post-validation flume configuration contains configuration for agents: INFO main node.AbstractConfigurationProvider - Creating channels INFO main channel.DefaultChannelFactory - Creating instance of channel my-channel type memory INFO main node.AbstractConfigurationProvider - Created channel my-channel INFO main source.DefaultSourceFactory - Creating instance of source my-source, type netcat INFO main sink.DefaultSinkFactory - Creating instance of sink: my-sink, type: logger INFO main node.AbstractConfigurationProvider - Channel my-channel connected to INFO main node.Application - Starting new configuration: { sourceRunners:{ my-source=EventDrivenSourceRunner: { source:org.apache.flume.source.NetcatSource{ name:my-source, state:IDLE } } } sinkRunners:{ my-sink=SinkRunner: { policy:org.apache.flume.sink.DefaultSinkProcessor@77f03bb1 counterGroup:{ name:null counters:{} } } } channels:{ my-channel=org.apache.flume.channel.MemoryChannel{ name: my-channel } } } INFO main node.Application - Starting Channel my-channel INFO main node.Application - Waiting for channel: my-channel to start. Sleeping for 500 ms INFO lifecycleSupervisor-1-0 instrumentation.MonitoredCounterGroup - Monitored counter group for type: CHANNEL, name: my-channel: Successfully registered new MBean. INFO lifecycleSupervisor-1-0 instrumentation.MonitoredCounterGroup - Component type: CHANNEL, name: my-channel started INFO main node.Application - Starting Sink my-sink INFO main node.Application - Starting Source my-source INFO lifecycleSupervisor-1-1 source.NetcatSource - Source starting INFO lifecycleSupervisor-1-1 source.NetcatSource - Created serverSocket:sun.nio.ch.ServerSocketChannelImpl


    Чтобы убедиться, что всё работает корректно, отправим нашему NetCat-источнику небольшой тестовый файл test.txt , в котором содержится 4 строки:

    Message 1 Message 2 Message 3
    Важно, чтобы файл оканчивался переносом строки. Для NetCat-источника он является разделителем событий. Если мы не добавим в конец файла этот перенос строки, то источник будет считать, что последнее событие пришло не полностью. В результате этого он будет упорно ждать разделителя, который, естественно, никогда не придет. Итак, выполняем команду:

    Nc 127.0.0.1 11111 < test.txt
    В результате этого NetCat должен вывести на экран три сообщения «ОК», как подтверждение того, что все строки файла благополучно отправлены и получены источником Flume. В это же время, сток должен вывести в консоль вот такие сообщения:

    Sink.LoggerSink - Event: { headers:{} body: 4D 65 73 73 61 67 65 20 31 0D Message 1. } sink.LoggerSink - Event: { headers:{} body: 4D 65 73 73 61 67 65 20 32 0D Message 2. } sink.LoggerSink - Event: { headers:{} body: 4D 65 73 73 61 67 65 20 33 0D Message 3. }
    Примечание: Flume при запуске регистрирует свой shutdownHook, поэтому нет необходимости вручную высвобождать какие-либо ресурсы (соединения, открытые файлы и т.п.) - все компоненты узла самостоятельно завершат работу вместе с JVM.

    5. Цепочка узлов Flume

    Итак, мы разобрались, как настроить и запустить одиночный узел Flume. Однако для управления потоками данных одного узла явно маловато. Попробуем построить небольшую цепочку из трех узлов, выполняющих задачу деления (по сути - балансировка): первый узел Flume принимает информацию от клиента и отправляет события на два других узла. При этом события не дублируются на втором и третьем узлах, а равномерно распределяются между ними.


    Соответственно, для такой схемы необходимо несколько конфигураций (для каждого узла - своя).

    Конфигурация для узла 1 (node1.conf)

    node1.sources = my-source node1.channels = my-channel # Теперь здесь 2 стока: node1.sinks = my-sink1 my-sink2 node1.sources.my-source.type = netcat node1.sources.my-source.bind = 0.0.0.0 node1.sources.my-source.port = 11111 node1.sources.my-source.channels = my-channel node1.channels.my-channel.type = memory node1.channels.my-channel.capacity = 10000 node1.channels.my-channel.transactionCapacity = 100 # Оба стока делаем с типом avro, они будут опустошать наш единственный канал вдвоем # Хосты принимающих узлов я оставлю локальными, чтобы всю эту цепочку можно было # попробовать запустить на одной машине node1.sinks.my-sink1.type = avro node1.sinks.my-sink1.channel = my-channel node1.sinks.my-sink1.hostname = 127.0.0.1 node1.sinks.my-sink1.port = 11112 node1.sinks.my-sink1.batch-size = 100 node1.sinks.my-sink2.type = avro node1.sinks.my-sink2.channel = my-channel node1.sinks.my-sink2.hostname = 127.0.0.1 node1.sinks.my-sink2.port = 11113 node1.sinks.my-sink2.batch-size = 100

    Конфигурация для узла 2 (node2.conf)

    node2.sources = my-source node2.channels = my-channel node2.sinks = my-sink # Поскольку на узле 1 сток имеет тип avro, здесь мы указываем источник типа avro node2.sources.my-source.type = avro node2.sources.my-source.bind = 0.0.0.0 node2.sources.my-source.port = 11112 node2.sources.my-source.channels = my-channel node2.channels.my-channel.type = memory node2.channels.my-channel.capacity = 10000 node2.channels.my-channel.transactionCapacity = 100 node2.sinks.my-sink.type = logger node2.sinks.my-sink.channel = my-channel node2.sinks.my-sink.maxBytesToLog = 256

    Конфигурация для узла 3 (node3.conf)

    node3.sources = my-source node3.channels = my-channel node3.sinks = my-sink # Поскольку на узле 1 сток имеет тип avro, здесь мы указываем источник типа avro node3.sources.my-source.type = avro node3.sources.my-source.bind = 0.0.0.0 node3.sources.my-source.port = 11113 node3.sources.my-source.channels = my-channel node3.channels.my-channel.type = memory node3.channels.my-channel.capacity = 10000 node3.channels.my-channel.transactionCapacity = 100 node3.sinks.my-sink.type = logger node3.sinks.my-sink.channel = my-channel node3.sinks.my-sink.maxBytesToLog = 256


    Конфигурации для узлов 2 и 3 в данном примере идентичны, отличаются только номерами портов. Также для связи между узлами здесь используются стандартные компоненты Flume: Avro источник и Avro сток. Подробнее они будут описаны в следующих статьях, пока же нам достаточно того, что Avro Sink может отправлять по сети события, а Avro Source может их принимать.

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

    Application.main(new String{"-f", "/flume/config/node1.conf", "-n", "node1"}); // для других узлов по аналогии: //Application.main(new String{"-f", "/flume/config/node2.conf", "-n", "node2"}); //Application.main(new String{"-f", "/flume/config/node3.conf", "-n", "node3"});
    Можно убедиться в работоспособности этой конфигурации, скормив первому узлу текстовый файл с сотней строк (маленькие порции данных могут пачкой отправиться на один из узлов и желаемого эффекта разделения данных мы не увидим).

    Заключение

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