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

Источник: IBM

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

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

Обзор

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

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

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

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


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

Существует два способа развертывания Hadoop-среды. Первый способ состоит в установке программного обеспечения Hadoop и его последующего конфигурирования в своей ИТ-среде (самый простой случай - одноузловой экземпляр, все демоны которого исполняются в единственном узле).

Второй и более простой способ состоит в использовании виртуальной машины 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-приложения

Написание MapReduce-приложения для подсчета слов не составляет никаких сложностей. Создайте MapReduce-приложение на языке Python, а затем выполните его с типовым набором данных. Не забывайте, что Hadoop сортирует вывод Map-шага таким образом, чтобы похожие слова располагались рядом, что обеспечивает полезную оптимизацию для шага Reduce.


Упражнение 4. Написание простого 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 - это действительно отличный язык для реализации примера с подсчетом слов.

В этом упражнении предполагается, что вы уже выполнили шаги упражнения 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)
$

Страница сайта http://test.interface.ru
Оригинал находится по адресу http://test.interface.ru/home.asp?artId=34988