您好,登錄后才能下訂單哦!
這篇文章給大家分享的是有關怎么使用MapReduce的內容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。
大數據是使用工具和技術處理大量和復雜數據集合的術語。能夠處理大量數據的技術稱為MapReduce。
何時使用MapReduce
MapReduce特別適合涉及大量數據的問題。它通過將工作分成更小的塊,然后可以被多個系統處理。由于MapReduce將一個問題分片并行工作,與傳統系統相比,解決方案會更快。
大概有如下場景會應用到MapReduce:
1 計數和統計
2 整理
3 過濾
4 排序
Apache Hadoop
在本文中,我們將使用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的整個過程看起來有點像這樣,請看下列之圖表:
我們將從MapReduce世界的“Hello World”的例子開始,那就是一個簡單的單詞計數器的實現。 我們將需要一些數據來處理。我們用已經公開的書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); } }?>
下面是 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
感謝各位的閱讀!關于“怎么使用MapReduce”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。