很多初学者,对大数据的观点都是模糊不清的,大数据是什么,能做什么,学的时候,该按照什么线路去学习,学完往哪方面发展,想深入理解。
何时利用MapReduce
MapReduce特殊适宜涉及大量数据的问题。它通过将事情分成更小的块,然后可以被多个别系处理。由于MapReduce将一个问题分片并行事情,与传统系统比较,办理方案会更快。
大概有如了局景会运用到MapReduce:
1 计数和统计
2 整理
3 过滤
4 排序
Apache Hadoop
开拓MapReduce办理方案,推举利用Hadoop,它已经是事实上的标准,同时也是开源免费的软件。
其余在Amazon,Google和Microsoft等云供应商租用或搭建Hadoop集群。
还有其他多个优点:
可扩展:可以轻松清加新的处理节点,而无需变动一行代码
本钱效益:不须要任何专门和奇特的硬件,由于软件在正常的硬件都运行正常
灵巧:无模式。可以处理任何数据构造 ,乃至可以组合多个数据源,而不会有很多问题。
容错:如果有节点涌现问题,其它节点可以吸收它的事情,全体集群连续处理。
其余,Hadoop容器还是支持一种称为“流”的运用程序,它为用户供应了选择用于开拓映射器和还原器脚本措辞的自由度。
本文中我们将利用PHP做为主开拓措辞。
Hadoop安装
Apache Hadoop的安装配置超出了本文范围。您可以根据自己的平台,在线轻松找到很多文章。为了保持大略,我们只谈论大数据干系的事。
映射器(Mapper)
映射器的任务是将输入转换成一系列的键值对。比如在字计数器的情形下,输入是一系列的行。我们按单词将它们分开,把它们变成键值对(如key:word,value:1),看起来像这样:
the 1
water 1
on 1
on 1
water 1
on 1
... 1
然后,这些对然后被发送到reducer以进行下一步骤。
reducer
reducer的任务是检索(排序)对,迭代并转换为所需输出。 在单词计数器的例子中,取单词数(值),并将它们相加得到一个单词(键)及其终极计数。如下:
water 2
the 1
on 3
mapping和reducing的全体过程看起来有点像这样,请看下列之图表:
利用PHP做单词计数器
我们将从MapReduce天下的“Hello World”的例子开始,那便是一个大略的单词计数器的实现。 我们将须要一些数据来处理。我们用已经公开的书Moby Dick来做实验。
实行以下命令下载这本书:
wget http://www.baidu.com/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); } }?>
下面是 reducer 代码。
#!/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
我的reducer看起来像这样
#!/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]); } }?>
reducer也略有修正,由于我们须要打算项目数量和均匀值。
#!/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 plot配置文件(gold.plot)并复制以下内容
# Gnuplot script file for generating gold pricesset terminal pngset output \"大众chart.jpg\"大众set style data linesset nokeyset gridset title \公众Gold prices\"大众set xlabel \"大众Year\公众set ylabel \公众Price\"大众plot \"大众gold.dat\"大众
天生图表:
gnuplot gold.plot
这会天生一个名为chart.jpg的文件。