Java development 2.0: Вторая волна разработки Java-приложений: Анализ больших объемов данных с помощью Hadoop MapReduce

Как превратить горы данных в золотую жилу информации

Apache Hadoop в настоящее время является ведущей платформой для анализа распределенных данных, и, как и большинство технологий Java™ 2.0, разработано с учетом требований масштабируемости. Познакомьтесь с вычислительной парадигмой Hadoop MapReduce и узнайте, как с ее помощью организовать эффективный анализ данных для решения информационных задач как большого, так и малого бизнеса.

Эндрю Гловер, президент компании, Stelligent Incorporated

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



29.02.2012

Развить навыки по этой теме

Этот материал — часть knowledge path для развития ваших навыков. Смотри Использование NoSQL для анализа данных большого объема

Когда в 2001 году компания Google впервые запустила свою систему поиска изображений, поисковая база насчитывала 250 миллионов индексированных графических файлов. Менее чем за десятилетие количество индексированных изображений в базе поискового гиганта перевалило за 10 миллиардов. Сейчас объемы данных таковы, что для просмотра контента, загружаемого каждую минуту на YouTube, вам потребуется 35 часов. Говорят, что Твиттер обрабатывает в среднем около 55 миллионов сообщений в день. Ранее в этом году поисковая система Твиттера регистрировала около 600 миллионов запросов в день. Именно о таких потоках информации идет речь, когда мы говорим о больших объемах данных.

Об этой серии статей

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

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

MapReduce как раз и является одним из тех решений, которые обеспечили технологическую революцию в обработке больших объемов данных. Вычислительная модель MapReduce и ее реализация были разработаны Google для обработки значительных объемов распределенных данных. В этой статье я познакомлю вас с проектом Apache Hadoop, который предлагает открытую реализацию парадигмы MapReduce, уже получившей прозвище «приложения-убийцы» облачных вычислений.

О проекте Hadoop

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

Множество функций и конфигураций, поддерживаемых Hadoop, обеспечивают удобство использования, мощь и широкие возможности применения этой платформы. Так, например, Yahoo! и бесчисленное множество других организаций используют Hadoop для анализа тонн битов и байтов информации. С другой стороны, Hadoop можно легко запустить и на одном узле. Все, что вам нужно для этого – умение программировать на Java (включая дженерики). Помимо Java, Hadoop работает с Ruby, Python и C++.

Дополнительно о MapReduce

Если вы читали другие статьи этой серии, то вы уже видели модель MapReduce в действии. В статье Работа с CouchDB через интерфейсы REST при помощи RESTClient в Groovy я продемонстрировал использование MapReduce для представления данных в CouchDB, а в статье MongoDB — хранилище данных NoSQL со всеми (полезными) признаками СУРБД функции MapReduce использовались в качестве механизма обработки документов MongoDB.

Как инфраструктура, предназначенная для обработки больших массивов данных, модель MapReduce оптимизирована для распределенной работы на множестве компьютеров. Как следует из названия, эта инфраструктура включает в себя две основные функции. Задача функции map— разбить поток входящих данных на меньшие наборы и передать эти наборы данных другим процессам для дальнейшей обработки. Функция reduce анализирует результаты обработки отдельных наборов, полученные функцией map, и передает их на выход программы.

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


Данные вокруг нас

Правительство США собирает тонны данных, большинство которых предназначено для изучения среднестатистического жителя страны. Разнообразные правительственные агентства свободно распространяют информацию относительно экономического состояния США и изменений в социально-демографической сфере. Геологическое управление США (USGS) публикует данные о землетрясениях.

Каждый день в различных регионах земного шара происходит множество мелких землетрясений. Большинство из них незаметны человеку, поскольку происходят в глубине земной коры, но сейсмологические станции регистрируют даже малейшие колебания. Каждую неделю Геологическое управление США публикует данные о землетрясениях в виде файла в формате CSV (значения, разделенные запятыми).

Еженедельный файл с данными не слишком велик — около 100 КБ. Тем не менее он вполне подойдет нам в качестве основы для знакомства с Hadoop. Не следует только забывать, что инфраструктура Hadoop в состоянии обрабатывать значительно большие объемы данных.

Отслеживание землетрясений

CSV-файл, который я недавно скачал с сайта USGS, состоит из 920 строк (подсчет строк приведен в листинге 1).

Листинг 1. Подсчет строк в файле данных о землетрясениях USGS
$> wc -l eqs7day-M1.txt 
  920 eqs7day-M1.txt

Содержимое файла в формате CSV выглядит примерно так, как показано в листинге 2 (в листинге приведены первые две строчки файла):

Листинг 2. Две первые строчки CSV-файла
$> head -n 2 eqs7day-M1.txt 
Src,Eqid,Version,Datetime,Lat,Lon,Magnitude,Depth,NST,Region
ci,14896484,2,"Sunday, December 12, 2010 23:23:20 UTC",33.3040,-116.4130,1.0,11.70,22,
  "Southern California"

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

Сначала я решил, что для получения данных о количестве землетрясений, произошедших каждый день, достаточно будет воспользоваться простой командой grep. Просмотрев файл, я обнаружил, что он начинается с данных, соответствующих 12 декабря. Тогда я выполнил команду grep -c для подсчета строк, содержащих эту дату. Результат приведен в листинге 3:

Листинг 3. Сколько землетрясений произошло 12 декабря?
$> grep -c 'December 12' eqs7day-M1.txt 
98

Установка Hadoop

Если вы еще не установили Hadoop, самое время сделать это. Для установки платформы необходимо скачать архив с последней версией двоичных файлов, unzip it, and then set Hadoop's bin распаковать этот архив, а затем добавить путь до директории bin инфраструктуры Hadoop к вашей переменной среды PATH. Добавление директории с двоичными файлами Hadoop к переменной среды позволит вам выполнять команду hadoop без указания полного пути. Для использования функций Hadoop вам не потребуется запускать java, вместо этого, как вы увидите дальше, мы воспользуемся встроенной утилитой hadoop. Утилита hadoop работает с разными опциями — так, вы можете указать в качестве опции путь к двоичным файлам Java (например, в вашей реализации команд map и reduce). В рассматриваемом далее примере я соберу все модули в один jar-файл и укажу Hadoop, какие задачи должны запускаться с использованием модулей из этого jar-файла. Для удобства работы я добавил пути ко всем дополнительным двоичным файлам, используемым моим приложением, к переменной classpath инфраструктуры Hadoop.

Теперь я знаю, что дате 12 декабря соответствует 98 записей, иначе говоря, в этот день было зарегистрировано 98 землетрясений. Я могу продолжить свои подсчеты и с помощью команды grep узнать, сколько землетрясений случилось 11 декабря, 10 декабря и т.д., однако подобный подход для меня слишком утомителен. Кроме того, для подсчета количества землетрясений с помощью команды grep я должен знать, каким датам соответствует тот или иной CSV-файл. С точки зрения рассматриваемого примера конкретные даты для меня не важны, более того, вполне вероятно, что я не всегда смогу получить эту информацию. Все, что я хочу знать — это сколько землетрясений произошло в каждый из произвольных семи дней, и эту информацию я легко могу получить с помощью Hadoop.

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


Разбор данных с помощью opencsv

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

Поскольку я привык тестировать код перед его непосредственным применением, я начну с короткого теста на JUnit. Задача JUnit-теста, код которого приведен в листинге 4, — проверить, что я действительно могу получить требуемые данные из CSV-файла.

Листинг 4. Разбор CSV-строки
public class CSVProcessingTest {

 private final String LINE = "ci,14897012,2,\"Monday, December 13, 2010 " +
            "14:10:32 UTC\",33.0290,-115." +
            "5388,1.9,15.70,41,\"Southern California\"";

 @Test
 public void testReadingOneLine() throws Exception {
  String[] lines = new CSVParser().parseLine(LINE);

  assertEquals("should be Monday, December 13, 2010 14:10:32 UTC",
    "Monday, December 13, 2010 14:10:32 UTC", lines[3]);

  assertEquals("should be Southern California",
    "Southern California", lines[9]);

  assertEquals("should be 1.9", "1.9", lines[6]);
 }
}

Как видно из листинга 4, использование библиотеки opencsv значительно облегчает работу со значениями, разделенными запятыми. Программа-анализатор возвращает массив значений типа String, так что требуемое значение можно получить, просто указав его номер (при этом следует помнить, что нумерация значений в массивах и коллекциях Java начинается с нуля).

Преобразование формата даты

При использовании модели MapReduce задача функции map— отобрать по определенному ключу значения для их дальнейшей обработки. Это означает, что функция map использует и возвращает два элемента: ключ и значение. Возвращаясь к моим первоначальным требованиям, сначала мне нужно узнать, сколько землетрясений произошло в течение каждого дня. Соответственно при анализе данных о землетрясениях я должен использовать два элемента: дату в качестве ключа и счетчик землетрясений в качестве значения. Затем моя функция reduce просуммирует значения счетчиков (очевидно, каждый из них будет целым, равным 1) и определит, сколько раз конкретная дата встречалась в файле с данными о землетрясениях.

Поскольку меня интересует количество землетрясений, произошедших в течение одного дня, т.е. за 24 часа, имеет смысл изменить формат даты в файле, чтобы избавиться от указания конкретного времени землетрясения. В листинге 5 приведен короткий тест для проверки преобразования исходного формата даты в упрощенный формат без указания времени:

Листинг 5. Преобразование формата даты
@Test
public void testParsingDate() throws Exception {
 String datest = "Monday, December 13, 2010 14:10:32 UTC";
 SimpleDateFormat formatter = new SimpleDateFormat("EEEEE, MMMMM dd, yyyy HH:mm:ss Z");
 Date dt = formatter.parse(datest);

 formatter.applyPattern("dd-MM-yyyy");
 String dtstr = formatter.format(dt);
 assertEquals("should be 13-12-2010", "13-12-2010", dtstr);
}

В коде, приведенном в листинге 5, я воспользовался Java-объектом SimpleDateFormat для преобразования строкового значения даты вида «Monday, December 13, 2010 14:10:32 UTC», используемого в CSV-файле, в общий формат даты вида «13-12-2010».


Функции map и reduce в Hadoop

Разобравшись, как именно я буду извлекать и преобразовывать нужные мне значения из CSV-файла, я могу приступить к реализации функций map и reduce в инфраструктуре Hadoop. Этот шаг требует понимания дженериков Java, поскольку при работе с Hadoop предпочтительно использовать явные объявления типов.

Я определю функцию map как расширение встроенного Hadoop-класса Mapper. Затем я воспользуюсь дженериками для явного указания типов выходного ключа и значения. Кроме того, объявление типа укажет, какие данные будут фигурировать в качестве входного ключа и значения. В случае чтения из файла они представляют собой счетчик байтов и текстовую строку соответственно.

Класс EarthQuakesPerDateMapper является расширением класса объектов Mapper платформы Hadoop. Он явно определяет тип ключа на выходе как Text и тип значения на выходе как IntWritable (это внутренний класс Hadoop, по сути определяющий целочисленные значения). Обратите внимание, первые два типа в объявлении класса являются типами LongWritable и Text, что соответствует счетчику байтов и строке текста.

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

Листинг 6. Реализация функции map
public class EarthQuakesPerDateMapper extends Mapper<LongWritable, 
  Text, Text, IntWritable> {
 @Override
 protected void map(LongWritable key, Text value, Context context) throws IOException,
   InterruptedException {

  if (key.get() > 0) {
   try {
     CSVParser parser = new CSVParser();
     String[] lines = parser.parseLine(value.toString());

     SimpleDateFormat formatter = 
       new SimpleDateFormat("EEEEE, MMMMM dd, yyyy HH:mm:ss Z");
     Date dt = formatter.parse(lines[3]);
     formatter.applyPattern("dd-MM-yyyy");

     String dtstr = formatter.format(dt);
     context.write(new Text(dtstr), new IntWritable(1));
   } catch (ParseException e) {}
  }
 }
}

Моя реализация функции map, приведенная в листинге 6, весьма проста. Hadoop обращается к этому классу каждый раз при считывании строки из входного файла. Чтобы избежать обработки заголовка CSV-файла, я проверяю, что счетчик байтов (объект key) имеет ненулевое значение. Затем я выполняю операции, которые вы уже видели в листингах 4 и 5: из входящей строки я извлекаю дату, преобразую ее, а затем полученную дату в новом формате задаю в качестве значения выходного ключа. Помимо значения выходного ключа, я определяю значение счетчика: 1. Я задаю счетчик для каждой даты из входного файла; таким образом, при обращении к моей реализации функции reduce в качестве входных параметров будут фигурировать ключи и наборы значений для каждого ключа. В нашем случае в качестве ключей и значений будут использоваться даты и соответствующие им счетчики, как показано в листинге 7:

Листинг 7. Логическое представление выходных значений функции map, которые являются входными параметрами функции reduce
"13-12-2010":[1,1,1,1,1,1,1,1]
"14-12-2010":[1,1,1,1,1,1]
"15-12-2010":[1,1,1,1,1,1,1,1,1]

Обратите внимание, метод context.write(new Text(dtstr), new IntWritable(1)) (см. код, приведенный в листинге 6) формирует логическую коллекцию, показанную в листинге 7. Как вы уже, наверное, догадались, context является структурой данных Hadoop, используемой для хранения различной информации. Структура context из нашего примера передается функции reduce, которая, в свою очередь, извлечет все единичные значения и просуммирует их. В результате работы функции reduce будет создана еще одна логическая структура данных, примерный вид которой приведен в листинге 8:

Листинг 8. Вывод функции reduce
"13-12-2010":8
"14-12-2010":6
"15-12-2010":9

Код реализации функции reduce приведен в листинге 9. Точно так же, как Hadoop-класс Mapper, класс Reducer параметризован: в качестве первых двух параметров выступают тип входного ключа (Text) и тип соответствующего значения (IntWritable), а в качестве двух последних параметров фигурируют типы значений на выходе функции: ключ и значение, типы которых в нашем случае совпадают с типами входных параметров.

Листинг 9. Реализация функции reduce
public class EarthQuakesPerDateReducer extends Reducer<Text, IntWritable, Text, 
  IntWritable> {
 @Override
 protected void reduce(Text key, Iterable<IntWritable> values, Context context)
  throws IOException, InterruptedException {
  int count = 0;
  for (IntWritable value : values) {
   count++;
  }
  context.write(key, new IntWritable(count));
 }
}

Моя реализация функции reduce предельно проста. Как видно из листинга 7, входное значение на самом деле представляет собой коллекцию значений (точнее, коллекцию единиц). Все, что мне нужно сделать — это просуммировать их, а затем записать новую пару ключ-значение, которая будет представлять собой дату и сумму счетчиков. Мой код функции по большому счету просто формирует строки, аналогичные примеру из листинга 8. Логическая цепочка преобразований выглядит следующим образом:

"13-12-2010":[1,1,1,1,1,1,1,1] -> "13-12-2010":8

Абстрактная форма этого листинга, очевидно, соответствует записи map -> reduce.


Определение задачи в Hadoop

После того, как я определил реализацию функций map и reduce, все, что мне осталось сделать — это связать их в одну задачу Hadoop Job. Определить задачу Job в Hadoop достаточно просто: вы задаете входные и выходные данные, реализацию функций map и reduce (в нашем случае это код, приведенный в листинге 6 и листинге 9) и типы выходных данных. В нашем примере типы данных на выходе совпадают с типами выходных данных функции reduce.

Листинг 10. Задача Job, связывающая функции map и reduce
public class EarthQuakesPerDayJob {

 public static void main(String[] args) throws Throwable {

  Job job = new Job();
  job.setJarByClass(EarthQuakesPerDayJob.class);
  FileInputFormat.addInputPath(job, new Path(args[0]));
  FileOutputFormat.setOutputPath(job, new Path(args[1]));

  job.setMapperClass(EarthQuakesPerDateMapper.class);
  job.setReducerClass(EarthQuakesPerDateReducer.class);
  job.setOutputKeyClass(Text.class);
  job.setOutputValueClass(IntWritable.class);

  System.exit(job.waitForCompletion(true) ? 0 : 1);
 }
}

Как видно из кода, приведенного в листинге 10, метод main связывает воедино мои функции map и reduce. Этот метод использует два входных параметра: директорию в которой хранится CSV-файл с данными о землетрясениях, и директорию, куда будет записан результирующий отчет (как правило, эта директория создается Hadoop).

Для успешной работы этой небольшой инфраструктуры мне нужно собрать все классы в один jar-файл. Кроме того, я должен указать Hadoop путь к библиотеке opencsv. После этого я смогу выполнить мой код, вызвав в командной строке утилиту hadoop с соответствующими параметрами, как показано в листинге 11:

Листинг 11. Вызов утилиты hadoop
$> export HADOOP_CLASSPATH=lib/opencsv-2.2.jar
$> hadoop jar target/quake.jar com.b50.hadoop.quake.EarthQuakesPerDayJob
   ~/temp/mreduce/in/ ~/temp/mreduce/out

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

По окончании выполнения задачи вы можете просмотреть содержимое выходного файла в практически любом редакторе. В качестве альтернативного решения можно вновь воспользоваться командой hadoop, что я и сделал в листинге 12:

Листинг 12. Просмотр результатов работы Hadoop
$> hadoop dfs -cat part-r-00000 
05-12-2010      43
06-12-2010      143
07-12-2010      112
08-12-2010      136
09-12-2010      178
10-12-2010      114
11-12-2010      114
12-12-2010      79

Если вы похожи на меня, то первое, что привлечет ваше внимание в листинге 12— это количество землетрясений, которые происходят каждый день — за один день 9 декабря случилось 178 землетрясений! Надеюсь, вы также обратите внимание на то, что Hadoop выполнил в точности то, что нам было нужно: собрал аккуратную таблицу с указанием количества землетрясений, произошедших в каждый конкретный день.


Пишем еще один Mapper

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

Листинг 13. Новая реализация функции map
public class EarthQuakeLocationMapper extends Mapper<LongWritable, Text, Text,
  IntWritable> {
 @Override
 protected void map(LongWritable key, Text value, Context context) throws IOException,
  InterruptedException {
  if (key.get() > 0) {
   String[] lines = new CSVParser().parseLine(value.toString());
   context.write(new Text(lines[9]), new IntWritable(1));
  }
 }
}

Вместо того чтобы извлекать дату и преобразовывать ее в новый формат, мне достаточно всего лишь «вытащить» местоположение, которое занимает последнюю позицию в CSV-массиве — эта операция и выполняется кодом, приведенным в листинге 13.

Чтобы не просматривать длиннющий список географических регионов с указанием количества произошедших там землетрясений, я ограничу свои результаты списком мест, где в течение семи дней случилось не менее 10 землетрясений.

Листинг 14. Где произошло больше всего землетрясений?
public class EarthQuakeLocationReducer extends Reducer<Text, IntWritable, Text,
  IntWritable> {
 @Override
 protected void reduce(Text key, Iterable<IntWritable> values, Context context)
  throws IOException, InterruptedException {
  int count = 0;
  for (IntWritable value : values) {
   count++;
  }
  if (count >= 10) {
   context.write(key, new IntWritable(count));
  }
 }
}

Код, приведенный в листинге 14, аналогичен коду листинга 9, однако в последнем случае я вывожу только те пары ключ-значение, в которых значение счетчика больше или равно 10. В качестве следующего шага я свяжу новые функции map и reduce в еще одну задачу Job, запакую все в jar-файл и, как обычно, запущу Hadoop для получения нужной мне информации.

Команда hadoop dfs выведет на экран интересующие меня значения:

Листинг 15. Распределение землетрясений по регионам
$> hadoop dfs -cat part-r-00000 
Andreanof Islands, Aleutian Islands, Alaska     24
Arkansas        40
Baja California, Mexico 101
Central Alaska  74
Central California      68
Greater Los Angeles area, California    16
Island of Hawaii, Hawaii        16
Kenai Peninsula, Alaska 11
Nevada  15
Northern California     114
San Francisco Bay area, California      21
Southern Alaska 97
Southern California     115
Utah    19
western Montana 11

Что можно сказать, ознакомившись с информацией, приведенной в листинге 15? Ну, прежде всего, мы видим, что западное побережье Северной Америки от Мексики до Аляски является регионом с повышенной сейсмической активностью. Далее, рядом с Арканзасом, похоже, проходит линия тектонического разлома, — раньше я об этом и не подозревал. Ну и, наконец, если вы живете в Северной или Южной Калифорнии (а там живет множество разработчиков программного обеспечения), то земля под вами «трясется» примерно каждые 13 минут.


В заключение

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

Сама по себе инфраструктура Hadoop представляет собой исключительно удобный и эффективный инструмент для обработки данных, а ведь вокруг этой инфраструктуры уже выросла и продолжает развиваться целая экосистема программных продуктов, от разнообразных подпроектов до облачных сервисов Hadoop. Возникновение и развитие экосистемы Hadoop свидетельствует о растущем сообществе, сформировавшемся на базе исходного проекта. Множество аналитических инструментов и программных продуктов, созданных этим сообществом, лишний раз подтверждают то факт, что обработка и анализ больших объемов данных являются самостоятельным глобальным направлением в бизнесе. Благодаря Hadoop распределенная обработка и анализ данных стали доступны не только гигантам вроде Google and Yahoo!, но и всем предпринимателям и новаторам отрасли программного обеспечения.

Ресурсы

Научиться

  • Оригинал статьи: Java development 2.0: Big data analysis with Hadoop MapReduce.
  • В серии статей Вторая волна разработки Java-приложений рассматриваются технологии и инструменты, меняющие принципы создания приложений на Java, в том числе MongoDB (сентябрь 2010 г.), CouchDB (ноябрь 2009 г.) и Objectify AppEngine (ноябрь 2010 г.).
  • Статья Распределенная обработка данных с помощью Hadoop: Часть 1. Начало работы (М.Тим Джонс (M. Tim Jones), developerWorks, май 2010 г.) — первая в серии статей — познакомит вас с инфраструктурой Hadoop, включая файловую систему HDFS и наиболее часто используемые типы узлов. Научитесь устанавливать и настраивать одноузловой кластер Hadoop, углубитесь в изучение приложения, использующего модель MapReduce, и узнайте о возможностях мониторинга и управления Hadoop с помощью ее собственных Web-интерфейсов. Продолжение статьи в части 2 и части 3.
  • Оцените эффективность MapReduce, ознакомившись с материалами по оценке использования вычислительных ресурсов приложениями на основе этой модели. Первая часть исследования Вычислительная эффективность Apache Hadoop MapReduce.Часть 1 (Пол Буркхардт (Paul Burkhardt), Cloudera Development Center, декабрь 2010 г.) рассматривает эффективность вычислений на примере приложений Hadoop MapReduce.
  • Статья Hadoop companies everywhere" (Алекс Хенди (Alex Handy), SD Times, июль 2009 г.) утверждает, что существует множество компаний, которые собирают горы данных, но не в состоянии эффективно использовать полученную информацию. Инфраструктура 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=Технология Java, Open source
ArticleID=799286
ArticleTitle=Java development 2.0: Вторая волна разработки Java-приложений: Анализ больших объемов данных с помощью Hadoop MapReduce
publish-date=02292012