Содержание
- Введение
- Обзор
- Упражнение 1. Развертывание простой Hadoop-среды
- Упражнение 2. Взаимодействие с файловой системой HDFS
- Упражнение 3. Написание простого MapReduce-приложения
- Упражнение 4. Написание простого Pig-запроса
- Упражнение 5. Написание агрегирующего Pig-запроса
- Решения упражнений
- Решение упражнения 1. Развертывание простой Hadoop-среды
- Решение для упражнения 2. Взаимодействие с файловой системой HDFS
- Решение упражнения 3. Написание простого MapReduce-приложения
- Решение для упражнения 4. Написание простого Pig-запроса
- Решение для упражнения 5. Написание агрегирующего Pig-запроса
- Ресурсы для скачивания
- Похожие темы
- Комментарии
Практическое занятие: Обработка журналов с помощью Apache Hadoop
Извлечение полезных данных из журналов с использованием технологии Hadoop в типичных Linux-системах
Журналы могут иметь самые разные формы, однако вне зависимости от этого результатом роста приложений и инфраструктур является огромное количество распределенных данных, углубленное исследование которых может принести определенную пользу. Журналы сегодняшних серверов — журналы веб-серверов и почтовых серверов, журналы ядра и журналы загрузки — содержат обширный набор насыщенной информации. Огромные массивы распределенных данных — идеальная область применения для технологии 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) $
Ресурсы для скачивания
Похожие темы
- Оригинал статьи: Practice: Process logs with Apache Hadoop.
- Распределенные вычисления с помощью Linux и Hadoop (Кен Манн и М. Тим Джонс, developerWorks, декабрь 2008 г.). Apache Hadoop — это программная платформа на базе Linux, позволяющая выполнять распределенную обработку огромного количества данных, включая параллельное индексирование веб-страниц Интернета.
- Распределенная обработка данных с помощью Hadoop: Часть 1. Начало работы (М. Тим Джонс, developerWorks, май 2010 г.). В статье рассматривается инфраструктура Hadoop и ее основные элементы, в т.ч. файловая система HDFS и распространенные типы узлов, а также способы мониторинга и управления инфраструктурой Hadoop с помощью ее базовых веб-интерфейсов. Демонстрируется, как установить и сконфигурировать одноузловой Hadoop-кластер; описывается MapReduce-приложение.
- Распределенная обработка данных с помощью Hadoop: Часть 2. Двигаемся дальше (М. Тим Джонс, developerWorks, июнь 2010 г.). В статье рассматривается более сложная конфигурация Hadoop-кластера с несколькими узлами для параллельной обработки данных. Описана работа MapReduce-функций в параллельной среде и рассмотрены вопросы администрирования Hadoop с помощью интерфейса командной строки и с помощью веб-интерфейса.
- Распределенная обработка данных с помощью Hadoop: Часть 3. Разработка приложений (М. Тим Джонс, developerWorks, июль 2010 г.). В статье рассматриваются API-интерфейсы Hadoop, а также и потоки данных Hadoop и их использование с помощью простого MapReduce-приложения.
- Cloudera's Hadoop Demo VM (май 2012 г.). Начните освоение Apache Hadoop с помощью набора виртуальных машин, каждая из которых содержит образ Linux и заранее сконфигурированный экземпляр Hadoop.
- Написание MapReduce-программы для Hadoop на языке Python (Майкл Нолл, обновлено в октябре 2011 г., опубликовано в сентябре 2007 г.): В этом учебном пособии показано, как написать простую MapReduce-программу для Hadoop на языке программирования Python.
- Следите за developerWorks в Твиттереили подпишитесь на фид материалов по Linux с ресурса developerWorks.