Практическое занятие: Обработка журналов с помощью Apache Hadoop

Извлечение полезных данных из журналов с использованием технологии Hadoop в типичных Linux-системах

Журналы – это важнейший элемент любой компьютерной системы, обеспечивающий выполнение обширного перечня задач – от аудита до управления ошибками. В условиях роста объема журналов и количества источников информации для них (включая облачные среды) для эффективной обработки этих журналов необходима масштабируемая система. Это практическое занятие посвящено обработке журналов с помощью технологии Apache Hadoop в типичной Linux-системе.

M. Тим Джонс, инженер-консультант, Emulex Corp.

М. Тим ДжонсМ. Тим Джонс - архитектор встроенного ПО и, кроме того, автор книг Artificial Intelligence: A Systems Approach, GNU/Linux Application Programming (выдержавшей на данный момент второе издание), AI Application Programming (второе издание) и BSD Sockets Programming from a Multilanguage Perspective. Он имеет обширный опыт разработки ПО в самых разных предметных областях - от ядер специальных ОС для геосинхронных космических аппаратов до архитектур встраиваемых систем и сетевых протоколов. Тим - инженер-консультант Emulex Corp., Лонгмонт, Колорадо.



09.11.2012

Журналы могут иметь самые разные формы, однако вне зависимости от этого результатом роста приложений и инфраструктур является огромное количество распределенных данных, углубленное исследование которых может принести определенную пользу. Журналы сегодняшних серверов — журналы веб-серверов и почтовых серверов, журналы ядра и журналы загрузки — содержат обширный набор насыщенной информации. Огромные массивы распределенных данных — идеальная область применения для технологии Apache Hadoop, а журнальные файлы как раз и представляют собой упорядоченные по времени структурированные текстовые данные.

Обработку журнала можно использовать для извлечения из него разнообразной информации. Один из наиболее распространенных сценариев применения состоит в извлечении количества ошибок или количества наступлений в системе некоторого события (например, неудачных попыток входа в систему). Вы также можете извлекать различные показатели производительности (например, количество соединений или количество транзакций в секунду). Другой пример полезной информации – извлечение (map) из веб-журналов соответствующих сведений и подсчет количества посещений сайта (reduce). Кроме того, такой анализ позволяет идентифицировать уникальные посещения пользователей в дополнение к статистическим сведениям по обращению к файлам.

Обзор

Эти упражнения позволят вам получить практические навыки в следующих областях:

  • Развертывание простой Hadoop-среды
  • Взаимодействие с файловой системой HDFS (Hadoop file system)
  • Написание простого MapReduce-приложения
  • Написание фильтрующего Pig-запроса
  • Написание агрегирующего Pig-запроса

Предварительные условия

Чтобы извлечь максимальную пользу из этих упражнений, вы должны обладать базовыми практическими знаниями в области Linux®. Кроме того, для развертывания простой Hadoop-среды полезно наличие определенных знаний в области виртуальных машин.


Упражнение 1. Развертывание простой Hadoop-среды

Существует два способа развертывания Hadoop-среды. Первый способ состоит в установке программного обеспечения Hadoop и его последующего конфигурирования в своей ИТ-среде (самый простой случай — одноузловой экземпляр, все демоны которого исполняются в единственном узле). За более подробной информацией обратитесь к статье Распределенная обработка данных с помощью Hadoop: Часть 1. Начало работы.

Второй и более простой способ состоит в использовании виртуальной машины Cloudera's Hadoop Demo VM (которая содержит образ Linux и заранее сконфигурированный экземпляр Hadoop). Виртуальная машина Cloudera исполняется в среде VMware, KVM (Kernel-based Virtual Machine) или Virtualbox.

Выберите предпочтительный способ и выполните установку. После этого выполните следующее задание.

  • Убедитесь в функционировании Hadoop посредством выдачи HDFS-команды ls.

Упражнение 2. Взаимодействие с файловой системой HDFS

HDFS — это файловая система специального назначения, которая в рамках Hadoop-кластера управляет данными и репликами, распределяя их по вычислительным узлам с целью эффективной обработки. Несмотря на то, что HDFS — это файловая система специального назначения, в ней реализованы многие команды типовых файловых систем. Для извлечения справочной информации по Hadoop воспользуйтесь командой hadoop dfs. Выполните следующие действия

  • Создайте тестовый подкаталог внутри файловой системы HDFS.
  • С помощью команды copyFromLocal переместите какой-либо файл из локальной файловой системы в вышеупомянутый подкаталог HDFS.
  • Для дополнительной уверенности просмотрите перемещенный файл в файловой системе HDFS с помощью команды hadoop dfs .

Упражнение 3. Написание простого MapReduce-приложения

Как показано в статье Распределенная обработка данных с помощью Hadoop: Часть 3. Разработка приложений, написание MapReduce-приложения для подсчета слов не составляет никаких сложностей. Используя пример на языке Ruby, рассмотренный в этой статье, создайте MapReduce-приложение на языке Python, а затем выполните его с типовым набором данных. Не забывайте, что Hadoop сортирует вывод Map-шага таким образом, чтобы похожие слова располагались рядом, что обеспечивает полезную оптимизацию для шага Reduce.


Упражнение 4. Написание простого Pig-запроса

Как показано в статье Обработка данных с помощью Apache Pig, инструмент Pig позволяет создавать простые скрипты, которые транслируются в MapReduce-приложения. В этом упражнении вы извлекаете все журнальные записи (из каталога /var/log/messages), которые содержат слово kernel: и слово terminating.

  • Создайте скрипт, который извлекает все журнальные строки по заранее заданным критериям.

Упражнение 5. Написание агрегирующего Pig-запроса

Сообщения для журнала генерируются различными источниками в ядре Linux (такими как kernel или dhclient). В этом примере вы хотите выявить различные источники, которые генерируют журнальные сообщения, а также количество журнальных сообщений, поступивших из каждого источника.

  • Create a script that counts the number of log messages for each log source.

Решения упражнений

Конкретный выходной результат будет зависеть от вашей конкретной установки Hadoop и от ее конфигурации.


Решение упражнения 1. Развертывание простой Hadoop-среды

В упражнении 1 вы выполняете команду ls в файловой системе HDFS. В листинге 1 демонстрируется правильное решение.

Листинг 1. Выполнение команды ls в файловой системе HDFS
$ hadoop dfs -ls /
drwxrwxrwx    - hue       supergroup           0 2011-12-10 06:56 /tmp
drwxr-xr-x    - hue       supergroup           0 2011-12-08 05:20 /user
drwxr-xr-x    - mapred    supergroup           0 2011-12-08 10:06 /var
$

В зависимости от использования возможно присутствие различного количества файлов.


Решение для упражнения 2. Взаимодействие с файловой системой HDFS

В упражнении 2 вы создаете в файловой системе HDFS подкаталог и копируете в него некоторый файл. Обратите внимание, что вы создаете тестовые данные посредством перемещения буфера сообщений ядра в файл. Для дополнительного надежности просмотрите файл в файловой системе HDFS с помощью команды cat (см. листинг 2).

Листинг 2. Манипуляции с файловой системой HDFS
$ dmesg > kerndata
$ hadoop dfs -mkdir /test
$ hadoop dfs -ls /test
$ hadoop dfs -copyFromLocal kerndata /test/mydata
$ hadoop dfs -cat /test/mydata
Linux version 2.6.18-274-7.1.el5 (mockbuild@builder10.centos.org)...
...
e1000: eth0 NIC Link is Up 1000 Mbps Full Duplex, Flow Control: RX
$

Решение упражнения 3. Написание простого MapReduce-приложения

В упражнении 3 вы создаете простое MapReduce-приложение на языке Python для подсчета слов. Python — это действительно отличный язык для реализации примера с подсчетом слов. Полезный отчет по MapReduce-программе на языке Python содержится в статье Написание MapReduce-программы для Hadoop на языке Python (автор Майкл Нолл).

В этом упражнении предполагается, что вы уже выполнили шаги упражнения 2 (по перемещению данных в файловую систему HDFS). В листинге 3 показано соответствующее Map-приложение.

Листинг 3. Map-приложение на языке Python
#!/usr/bin/env python

import sys

for line in sys.stdin:
    line = line.strip()
    words = line.split()
    for word in words:
        print '%s\t1' % word

В листинге 4 показано соответствующее Reduce-приложение.

Листинг 4. Reduce-приложение на языке Python
#!/usr/bin/env python

from operator import itemgetter
import sys

last_word = None
last_count = 0
cur_word = None

for line in sys.stdin:
    line = line.strip()

    cur_word, count = line.split('\t', 1)

    count = int(count)

    if last_word == cur_word:
        last_count += count
    else:
        if last_word:
           print '%s\t%s' % (last_word, last_count)
           last_count = count
        last_word = cur_word

if last_word == cur_word:
    print '%s\t%s' % (last_word, last_count)

В листинге 5 демонстрируется процесс вызова MapReduce-примера на языке Python в среде Hadoop.

Листинг 5. Тестирование MapReduce-приложения на языке Python в среде Hadoop
$ hadoop jar /usr/lib/hadoop-0.20/contrib/streaming/hadoop-streaming-0.20.2-cdh3u2.jar \
  -file pymap.py -mapper pymap.py -file pyreduce.py -reducer pyreduce.py \
  -input /test/mydata -output /test/output
...
$ hadoop dfs -cat /test/output/part-00000
...
write	3
write-combining	2
wrong.	1
your	2
zone:	2
zonelists.	1
$

Решение для упражнения 4. Написание простого Pig-запроса

В упражнении 4 вы извлекаете элементы журнала /var/log/messages, которые содержат слово kernel: и слово terminating. В этом случае вы используете инструмент Pig в локальном режиме для запроса к локальному файлу (см. листинг 6). Загрузите файл в Pig-отношение (log), отфильтруйте его содержимое, чтобы оставить лишь сообщения со словом kernel, а затем отфильтруйте полученное отношение, оставив лишь сообщения со словом terminating.

Листинг 6. Извлечение из журнала всех сообщений, содержащих слова kernel и terminating
$ pig -x local
grunt> log = LOAD '/var/log/messages';
grunt> logkern = FILTER log BY $0 MATCHES '.*kernel:.*';
grunt> logkernterm = FILTER logkern BY $0 MATCHES '.*terminating.*';
grunt> dump logkernterm
...
(Dec  8 11:08:48 localhost kernel: Kernel log daemon terminating.)
grunt>

Решение для упражнения 5. Написание агрегирующего Pig-запроса

В упражнении 5 вы извлекали из каталога /var/log/messages источники сообщений для журналов и количество таких сообщений. В этом случае мы создаем запрашивающий скрипт и выполняем его в локальном режиме Pig. В листинге 7 вы загружаете файл и производите разбор входной информации, используя пробел в качестве разделителя. Затем вы присваиваете поля строки с разделителями своим поименованным элементам. Сначала вы используете оператор GROUP для группировки сообщений по их источнику, а затем применяете операторы FOREACH и COUNT для агрегирования своих данных.

Листинг 7. Скрипт для работы с каталогом /var/log/messages
log = LOAD '/var/log/messages' USING PigStorage(' ') AS (month:chararray, \
  day:int, time:chararray, host:chararray, source:chararray);
sources = GROUP log BY source;
counts = FOREACH sources GENERATE group, COUNT(log);
dump counts;

Результаты выполнения скрипта показаны в листинге 8.

Листинг 8. Результаты выполнения скрипта
$ pig -x local logsources.pig
...
(init:,1)
(gconfd,12)
(kernel:,505)
(syslogd,2)
(dhclient:,91)
(localhost,1168)
(gpm[2139]:,2)
[gpm[2168]:,2)
(NetworkManager:,292)
(avahi-daemon[3345]:,37)
(avahi-daemon[3362]:,44)
(nm-system-settings:,8)
$

Ресурсы

Научиться

Получить продукты и технологии

  • Cloudera's Hadoop Demo VM (май 2012 г.). Начните освоение Apache Hadoop с помощью набора виртуальных машин, каждая из которых содержит образ Linux и заранее сконфигурированный экземпляр Hadoop.

Комментарии

developerWorks: Войти

Обязательные поля отмечены звездочкой (*).


Нужен IBM ID?
Забыли Ваш IBM ID?


Забыли Ваш пароль?
Изменить пароль

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Профиль создается, когда вы первый раз заходите в developerWorks. Информация в вашем профиле (имя, страна / регион, название компании) отображается для всех пользователей и будет сопровождать любой опубликованный вами контент пока вы специально не укажите скрыть название вашей компании. Вы можете обновить ваш IBM аккаунт в любое время.

Вся введенная информация защищена.

Выберите имя, которое будет отображаться на экране



При первом входе в developerWorks для Вас будет создан профиль и Вам нужно будет выбрать Отображаемое имя. Оно будет выводиться рядом с контентом, опубликованным Вами в developerWorks.

Отображаемое имя должно иметь длину от 3 символов до 31 символа. Ваше Имя в системе должно быть уникальным. В качестве имени по соображениям приватности нельзя использовать контактный e-mail.

Обязательные поля отмечены звездочкой (*).

(Отображаемое имя должно иметь длину от 3 символов до 31 символа.)

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Вся введенная информация защищена.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=40
Zone=Open source, Linux
ArticleID=845132
ArticleTitle=Практическое занятие: Обработка журналов с помощью Apache Hadoop
publish-date=11092012