Большие данные — это термин, обозначающий использование инструментов и методов для обработки больших и сложных коллекций данных. Технология, способная обрабатывать большие объемы данных, называется MapReduce.
Когда использовать MapReduce
MapReduce особенно подходит для задач, связанных с большими объемами данных. Он работает путем разделения работы на более мелкие фрагменты, которые затем могут обрабатываться несколькими системами. Поскольку MapReduce разделяет задачу на параллельную работу, решение будет быстрее по сравнению с традиционными системами.
Вероятно, есть следующие сценарии, которые будут применяться к MapReduce:
1 счет и статистика
2 отделка
3 Фильтр
4 Сортировать
Apache Hadoop
В этой статье мы будем использовать Apache Hadoop.
Для разработки решений MapReduce рекомендуется использовать Hadoop, который уже является стандартом де-факто и является бесплатным программным обеспечением с открытым исходным кодом.
Также арендуйте или создавайте кластеры Hadoop у облачных провайдеров, таких как Amazon, Google и Microsoft.
Есть множество других преимуществ:
Масштабируемость: Вы можете легко добавить новые узелки обработки, не изменив строку кода
Экономичность: не требует специализированного и экзотического оборудования, так как программное обеспечение отлично работает на обычном оборудовании.
Гибкость: нет схемы. Может обрабатывать любую структуру данных и даже комбинировать несколько источников данных без особых проблем.
Отказоустойчивость: если узел выходит из строя, другие узлы могут продолжить его работу, и весь кластер продолжит работу.
Кроме того, контейнеры Hadoop также поддерживают приложение под названием «потоковая передача», которое дает пользователям свободу выбора языка сценариев для разработки преобразователей и редюсеров.
В этой статье мы будем использовать PHP в качестве основного языка разработки.
Установка Hadoop
Превышена конфигурация установки Apache Hadoop. Вы можете легко найти множество статей в Интернете в соответствии с вашей собственной платформой. Для простоты мы обсуждаем только вещи, связанные с большими данными.
Картограф
Работа преобразователя заключается в преобразовании ввода в последовательность пар ключ-значение. Например, в случае счетчика слов ввод представляет собой серию строк. Мы разделяем их по словам и превращаем в пары ключ-значение (например, ключ:слово,значение:1), что выглядит так:
the 1
water 1
on 1
on 1
water 1
on 1
... 1
Затем эти пары отправляются на редуктор для следующего шага.
reducer
Задача редуктора — извлекать (сортировать) пары, выполнять итерацию и преобразовывать в желаемый результат. В примере со счетчиком слов возьмите количество слов (значение) и добавьте их, чтобы получить слово (ключ) и его окончательный счет. следующее:
water 2
the 1
on 3
Весь процесс сопоставления и редукции выглядит примерно так, см. схему ниже:
Счетчик слов с PHP
Мы начнем с примера «Hello World» в мире Maprecuce, то есть простое реализация счетчика слова. Нам понадобится некоторые данные для обработки. Мы используем The Moby Dick, который был опубликован.
Выполните следующую команду, чтобы скачать книгу:
wget http://www.gutenberg.org/cache ... 1.txt
Создайте рабочий каталог в HDFS (распределенная файловая система Hadoop)
hadoop dfs -mkdir wordcount
Наш код PHP начинается с mapper
#!/usr/bin/php
<?php
// iterate through lines
while($line = fgets(STDIN)){
// remove leading and trailing
$line = ltrim($line);
$line = rtrim($line);
// split the line in words
$words = preg_split('/\s/', $line, -1, PREG_SPLIT_NO_EMPTY);
// iterate through words
foreach( $words as $key ) {
// print word (key) to standard output
// the output will be used in the
// reduce (reducer.php) step
// word (key) tab-delimited wordcount (1)
printf("%s\t%d\n", $key, 1);
}
}
?>
Ниже приведен код редуктора.
#!/usr/bin/php
<?php
$last_key = NULL;
$running_total = 0;
// iterate through lines
while($line = fgets(STDIN)) {
// remove leading and trailing
$line = ltrim($line);
$line = rtrim($line);
// split line into key and count
list($key,$count) = explode("\t", $line);
// this if else structure works because
// hadoop sorts the mapper output by it keys
// before sending it to the reducer
// if the last key retrieved is the same
// as the current key that have been received
if ($last_key === $key) {
// increase running total of the key
$running_total += $count;
} else {
if ($last_key != NULL)
// output previous key and its running total
printf("%s\t%d\n", $last_key, $running_total);
// reset last key and running total
// by assigning the new key and its value
$last_key = $key;
$running_total = $count;
}
}
?>
Вы можете легко тестировать сценарии локально, используя некоторую комбинацию команд и конвейеров.
head -n1000 pg2701.txt | ./mapper.php | sort | ./reducer.php
Мы запускаем это в кластере Apache Hadoop:hadoop jar /usr/hadoop/2.5.1/libexec/lib/hadoop-streaming-2.5.1.jar \
-mapper "./mapper.php"
-reducer "./reducer.php"
-input "hello/mobydick.txt"
-output "hello/result"
Вывод будет сохранен в папке hello/result, которую можно просмотреть, выполнив следующую команду
hdfs dfs -cat hello/result/part-00000
Рассчитать среднегодовую цену золота
Следующий пример является более практичным, хотя набор данных относительно небольшой, ту же логику можно легко применить к набору с сотнями точек данных. Попробуем рассчитать среднегодовую цену золота за последние пятьдесят лет.
Скачиваем набор данных:
wget https://raw.githubusercontent. ... a.csv
Создайте рабочий каталог в HDFS (распределенная файловая система Hadoop)
hadoop dfs -mkdir goldprice
Скопируйте загруженный набор данных в HDFS
hadoop dfs -copyFromLocal ./data.csv goldprice/data.csv
Мой Редуктор выглядит так
#!/usr/bin/php
<?php
// iterate through lines
while($line = fgets(STDIN)){
// remove leading and trailing
$line = ltrim($line);
$line = rtrim($line);
// regular expression to capture year and gold value
preg_match("/^(.*?)\-(?:.*),(.*)$/", $line, $matches);
if ($matches) {
// key: year, value: gold price
printf("%s\t%.3f\n", $matches[1], $matches[2]);
}
}
?>
Редуктор также немного изменен, так как нам нужно вычислить количество элементов и среднее значение.
#!/usr/bin/php
<?php
$last_key = NULL;
$running_total = 0;
$running_average = 0;
$number_of_items = 0;
// iterate through lines
while($line = fgets(STDIN)) {
// remove leading and trailing
$line = ltrim($line);
$line = rtrim($line);
// split line into key and count
list($key,$count) = explode("\t", $line);
// if the last key retrieved is the same
// as the current key that have been received
if ($last_key === $key) {
// increase number of items
$number_of_items++;
// increase running total of the key
$running_total += $count;
// (re)calculate average for that key
$running_average = $running_total / $number_of_items;
} else {
if ($last_key != NULL)
// output previous key and its running average
printf("%s\t%.4f\n", $last_key, $running_average);
// reset key, running total, running average
// and number of items
$last_key = $key;
$number_of_items = 1;
$running_total = $count;
$running_average = $count;
}
}
if ($last_key != NULL)
// output previous key and its running average
printf("%s\t%.3f\n", $last_key, $running_average);
?>
Как и в примере с подсчетом слов, мы также можем протестировать локально
head -n1000 data.csv | ./mapper.php | sort | ./reducer.php
Наконец, запустите его на кластере Hadoop.
hadoop jar /usr/hadoop/2.5.1/libexec/lib/hadoop-streaming-2.5.1.jar \
-mapper "./mapper.php"
-reducer "./reducer.php"
-input "goldprice/data.csv"
-output "goldprice/result"
Посмотреть среднееhdfs dfs -cat goldprice/result/part-00000
Небольшой бонус: сгенерируйте графики
Мы часто превращаем результаты в графики. Для этой демонстрации я буду использовать gnuplot, вы можете использовать что-нибудь еще интересное.
Сначала верните результат локально:
hdfs dfs -get goldprice/result/part-00000 gold.dat
Создайте файл конфигурации графика gnu (gold.plot) и скопируйте следующее# Gnuplot script file for generating gold prices
set terminal png
set output "chart.jpg"
set style data lines
set nokey
set grid
set title "Gold prices"
set xlabel "Year"
set ylabel "Price"
plot "gold.dat"
Создайте график:gnuplot gold.plot
Это создает файл с именем chart.jpg. Это выглядит так:Переводчик: Ду Цзян
Автор: Гленн Де Бакер
оригинал:Эй, SMEPRLICITY. Не голодная / статья / закрытая дверь ...