如何實(shí)現(xiàn)用PHP和Shell寫(xiě)Hadoop的MapReduce程序-創(chuàng)新互聯(lián)

本篇內(nèi)容主要講解“如何實(shí)現(xiàn)用PHP和Shell寫(xiě)Hadoop的MapReduce程序”,感興趣的朋友不妨來(lái)看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來(lái)帶大家學(xué)習(xí)“如何實(shí)現(xiàn)用PHP和Shell寫(xiě)Hadoop的MapReduce程序”吧!

創(chuàng)新互聯(lián)公司-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價(jià)比西固網(wǎng)站開(kāi)發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫(kù),直接使用。一站式西固網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋西固地區(qū)。費(fèi)用合理售后完善,十余年實(shí)體公司更值得信賴。

使得任何支持標(biāo)準(zhǔn)IO (stdin, stdout)的可執(zhí)行程序都能成為hadoop的mapper或者 reducer。例如:


復(fù)制代碼 代碼如下:

hadoop jar hadoop-streaming.jar -input SOME_INPUT_DIR_OR_FILE -output SOME_OUTPUT_DIR -mapper /bin/cat -reducer /usr/bin/wc


在這個(gè)例子里,就使用了Unix/Linux自帶的cat和wc工具來(lái)作為mapper / reducer,是不是很神奇?

如果你習(xí)慣了使用一些動(dòng)態(tài)語(yǔ)言,用動(dòng)態(tài)語(yǔ)言來(lái)寫(xiě)mapreduce吧,跟之前的編程沒(méi)有任何不同,hadoop只是運(yùn)行它的一個(gè)框架,下面我演示一下用PHP來(lái)實(shí)現(xiàn)Word Counter的mapreduce。

一、找到Streaming jar

Hadoop根目錄下是沒(méi)有hadoop-streaming.jar的,因?yàn)閟treaming是一個(gè)contrib,所以要去contrib下面找,以hadoop-0.20.2為例,它在這里:

復(fù)制代碼 代碼如下:

$HADOOP_HOME/contrib/streaming/hadoop-0.20.2-streaming.jar

二、寫(xiě)Mapper

新建一個(gè)wc_mapper.php,寫(xiě)入如下代碼:

復(fù)制代碼 代碼如下:

#!/usr/bin/php
<?php
$in = fopen(“php://stdin”, “r”);
$results = array();
while ( $line = fgets($in, 4096) )
{
$words = preg_split(‘/\W/', $line, 0, PREG_SPLIT_NO_EMPTY);
foreach ($words as $word)
$results[] = $word;
}
fclose($in);
foreach ($results as $key => $value)
{
print “$value\t1\n”;
}


這段代碼的大致意思是:把輸入的每行文本中的單詞找出來(lái),并以”
hello 1
world 1″
這樣的形式輸出出來(lái)。

和之前寫(xiě)的PHP基本沒(méi)有什么不同,對(duì)吧,可能稍微讓你感到陌生有兩個(gè)地方:

PHP作為可執(zhí)行程序

第一行的“#!/usr/bin/php”告訴linux,要用/usr/bin/php這個(gè)程序作為以下代碼的解釋器。寫(xiě)過(guò)linux shell的人應(yīng)該很熟悉這種寫(xiě)法了,每個(gè)shell腳本的第一行都是這樣: #!/bin/bash, #!/usr/bin/python

有了這一行,保存好這個(gè)文件以后,就可以像這樣直接把wc_mapper.php當(dāng)作cat, grep一樣的命令執(zhí)行了:./wc_mapper.php

使用stdin接收輸入

PHP支持多種參數(shù)傳入的方法,大家最熟悉的應(yīng)該是從$_GET, $_POST超全局變量里面取通過(guò)Web傳遞的參數(shù),次之是從$_SERVER['argv']里取通過(guò)命令行傳入的參數(shù),這里,采用的是標(biāo)準(zhǔn)輸入stdin

它的使用效果是:

在linux控制臺(tái)輸入 ./wc_mapper.php

wc_mapper.php運(yùn)行,控制臺(tái)進(jìn)入等候用戶鍵盤輸入狀態(tài)

用戶通過(guò)鍵盤輸入文本

用戶按下Ctrl + D終止輸入,wc_mapper.php開(kāi)始執(zhí)行真正的業(yè)務(wù)邏輯,并將執(zhí)行結(jié)果輸出

那么stdout在哪呢?print本身已經(jīng)就是stdout啦,跟我們以前寫(xiě)web程序和CLI腳本沒(méi)有任何不同。

三、寫(xiě)Reducer

新建一個(gè)wc_reducer.php,寫(xiě)入如下代碼:


復(fù)制代碼 代碼如下:

#!/usr/bin/php
<?php
$in = fopen(“php://stdin”, “r”);
$results = array();
while ( $line = fgets($in, 4096) )
{
list($key, $value) = preg_split(“/\t/”, trim($line), 2);
$results[$key] += $value;
}
fclose($in);
ksort($results);
foreach ($results as $key => $value)
{
print “$key\t$value\n”;
}


這段代碼的大意是統(tǒng)計(jì)每個(gè)單詞出現(xiàn)了多少次,并以”
hello 2
world 1″
這樣的形式輸出。

四、用Hadoop來(lái)運(yùn)行

上傳要統(tǒng)計(jì)的示例文本


復(fù)制代碼 代碼如下:

hadoop fs -put *.TXT /tmp/input


以Streaming方式執(zhí)行PHP mapreduce程序

復(fù)制代碼 代碼如下:

hadoop jar hadoop-0.20.2-streaming.jar -input /tmp/input -output /tmp/output -mapper wc_mapper.php的絕對(duì)路徑 -reducer wc_reducer.php的絕對(duì)路徑


注意:

input和output目錄是在hdfs上的路徑

mapper和reducer是在本地機(jī)器的路徑,一定要寫(xiě)絕對(duì)路徑,不要寫(xiě)相對(duì)路徑,以免到時(shí)候hadoop報(bào)錯(cuò)說(shuō)找不到mapreduce程序。

查看結(jié)果


復(fù)制代碼 代碼如下:

hadoop fs -cat /tmp/output/part-00000

五、shell版的Hadoop MapReduce程序

復(fù)制代碼 代碼如下:

#!/bin/bash -

# 加載配置文件
source './config.sh'

# 處理命令行參數(shù)
while getopts "d:" arg
do
 case $arg in
  d)
   date=$OPTARG

  ?)
            echo "unkonw argument"
   exit 1

    esac
done

# 默認(rèn)處理日期為昨天
default_date=`date -v-1d +%Y-%m-%d`

# 最終處理日期. 如果日期格式不對(duì), 則退出執(zhí)行
date=${date:-${default_date}}
if ! [[ "$date" =~ [12][0-9]{3}-(0[1-9]|1[12])-(0[1-9]|[12][0-9]|3[01]) ]]
then
 echo "invalid date(yyyy-mm-dd): $date"
 exit 1
fi

# 待處理文件
log_files=$(${hadoop_home}bin/hadoop fs -ls ${log_file_dir_in_hdfs} | awk '{print $8}' | grep $date)

# 如果待處理文件數(shù)目為零, 則退出執(zhí)行
log_files_amount=$(($(echo $log_files | wc -l) + 0))
if [ $log_files_amount -lt 1 ]
then
 echo "no log files found"
 exit 0
fi

# 輸入文件列表
for f in $log_files
do
 input_files_list="${input_files_list} $f"
done

function map_reduce () {
 if ${hadoop_home}bin/hadoop jar ${streaming_jar_path} -input${input_files_list} -output ${mapreduce_output_dir}${date}/${1}/ -mapper "${mapper} ${1}" -reducer "${reducer}" -file "${mapper}"
 then
  echo "streaming job done!"
 else
  exit 1
 fi
}

# 循環(huán)處理每一個(gè)bucket
for bucket in ${bucket_list[@]}
do
 map_reduce $bucket
done


到此,相信大家對(duì)“如何實(shí)現(xiàn)用PHP和Shell寫(xiě)Hadoop的MapReduce程序”有了更深的了解,不妨來(lái)實(shí)際操作一番吧!這里是創(chuàng)新互聯(lián)建站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

網(wǎng)頁(yè)名稱:如何實(shí)現(xiàn)用PHP和Shell寫(xiě)Hadoop的MapReduce程序-創(chuàng)新互聯(lián)
鏈接地址:http://muchs.cn/article2/cocgoc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供外貿(mào)建站、云服務(wù)器、虛擬主機(jī)、Google、定制開(kāi)發(fā)、響應(yīng)式網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

外貿(mào)網(wǎng)站建設(shè)