天天躁日日躁狠狠躁AV麻豆-天天躁人人躁人人躁狂躁-天天澡夜夜澡人人澡-天天影视香色欲综合网-国产成人女人在线视频观看-国产成人女人视频在线观看

用PHP和Shell寫Hadoop的MapReduce程序

使得任何支持標準IO (stdin, stdout)的可執行程序都能成為hadoop的mapper或者 reducer。例如:
復制代碼 代碼如下:
hadoop jar hadoop-streaming.jar -input SOME_INPUT_DIR_OR_FILE -output SOME_OUTPUT_DIR -mapper /bin/cat -reducer /usr/bin/wc

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

如果你習慣了使用一些動態語言,用動態語言來寫mapreduce吧,跟之前的編程沒有任何不同,hadoop只是運行它的一個框架,下面我演示一下用php來實現Word Counter的mapreduce。

一、找到Streaming jar

Hadoop根目錄下是沒有hadoop-streaming.jar的,因為streaming是一個contrib,所以要去contrib下面找,以hadoop-0.20.2為例,它在這里:

復制代碼 代碼如下:$HADOOP_HOME/contrib/streaming/hadoop-0.20.2-streaming.jar

二、寫Mapper

新建一個wc_mapper.php,寫入如下代碼:

復制代碼 代碼如下:
#!/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”;
}

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

和之前寫的php基本沒有什么不同,對吧,可能稍微讓你感到陌生有兩個地方:

php作為可執行程序

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

有了這一行,保存好這個文件以后,就可以像這樣直接把wc_mapper.php當作cat, grep一樣的命令執行了:./wc_mapper.php

使用stdin接收輸入

php支持多種參數傳入的方法,大家最熟悉的應該是從$_GET, $_POST超全局變量里面取通過Web傳遞的參數,次之是從$_SERVER['argv']里取通過命令行傳入的參數,這里,采用的是標準輸入stdin

它的使用效果是:

在linux控制臺輸入 ./wc_mapper.php

wc_mapper.php運行,控制臺進入等候用戶鍵盤輸入狀態

用戶通過鍵盤輸入文本

用戶按下Ctrl + D終止輸入,wc_mapper.php開始執行真正的業務邏輯,并將執行結果輸出

那么stdout在哪呢?print本身已經就是stdout啦,跟我們以前寫web程序和CLI腳本沒有任何不同。

三、寫Reducer

新建一個wc_reducer.php,寫入如下代碼:
復制代碼 代碼如下:
#!/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”;
}

這段代碼的大意是統計每個單詞出現了多少次,并以”
hello 2
world 1″
這樣的形式輸出。

四、用Hadoop來運行

上傳要統計的示例文本
復制代碼 代碼如下:
hadoop fs -put *.TXT /tmp/input

以Streaming方式執行php mapreduce程序

復制代碼 代碼如下:hadoop jar hadoop-0.20.2-streaming.jar -input /tmp/input -output /tmp/output -mapper wc_mapper.php的絕對路徑 -reducer wc_reducer.php的絕對路徑
注意:

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

mapper和reducer是在本地機器的路徑,一定要寫絕對路徑,不要寫相對路徑,以免到時候hadoop報錯說找不到mapreduce程序。

查看結果
復制代碼 代碼如下:hadoop fs -cat /tmp/output/part-00000

五、shell版的Hadoop MapReduce程序

復制代碼 代碼如下:
#!/bin/bash -

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

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

  ?)
            echo "unkonw argument"
   exit 1

    esac
done

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

# 最終處理日期. 如果日期格式不對, 則退出執行
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)

# 如果待處理文件數目為零, 則退出執行
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
}

# 循環處理每一個bucket
for bucket in ${bucket_list[@]}
do
 map_reduce $bucket
done

php技術用PHP和Shell寫Hadoop的MapReduce程序,轉載需保留來源!

鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。

主站蜘蛛池模板: 国产欧美一区二区精品久久久 | 吻嘴胸全身好爽床大全 | 乱色欧美激惰 | 熟妇久久无码人妻AV蜜桃 | 亚洲欧美高清在线精品一区 | 男生在床上脱美女 胸 | 精品无码国产AV一区二区三区 | 最近中文字幕MV高清在线视频 | 果冻传媒在线完整免费播放 | 国产精品亚洲专区在线播放 | 爽爽窝窝午夜精品一区二区 | 天天射天天爱天天干 | 久久精品国产96精品亚洲 | 国产视频精品在线偷拍 | 国产精品第九页 | 亚洲乱码中文字幕久久 | 1级午夜影院费免区 | 欧美日韩1区 | 99re久久热在线播放8 | 人人超碰97caoporen国产 | 男人吃奶摸下挵进去啪啪 | 久久精品午夜一区二区福利 | 2020年国产精品午夜福利在线观看 | 99久久精品免费看国产免费 | 99国产精品偷窥熟女精品视频 | 中文字幕在线视频观看 | 人妻 中文无码 中出 | 久久国产综合精品欧美 | 麻豆影视在线直播观看免费 | 久久精品18| 色综合久久88一加勒比 | 一品道门免费视频韩国 | 少妇的肉体AA片免费观看 | 99久久精品免费看国产一区二区三区 | 国产精品毛片在线视频 | 国产精品18久久久久久白浆. | 国产精品免费小视频 | 亚洲AVAV天堂AV在线网爱情 | 一个人HD高清在线观看免费视频 | 两个吃奶一个添下面视频 | 在线超碰免费视频观看 |