phpを利用したMapReduce実行

サンプルデータの配置

サンプルデータの作成

echo Hello World Bye World > file01
echo Hello Hadoop Goodbye Hadoop > file02

ls
file01  file02

HDFS上にinputディレクトリを作成

sudo -u hdfs hadoop fs -mkdir /user/hdfs/input

HDFS上にサンプルデータを配置

sudo -u hdfs hadoop fs -put file01 /user/hdfs/input/file01
sudo -u hdfs hadoop fs -put file02 /user/hdfs/input/file02

sudo -u hdfs hadoop fs -cat /user/hdfs/input/file01
Hello World Bye World

sudo -u hdfs hadoop fs -cat /user/hdfs/input/file02
echo Hello Hadoop Goodbye Hadoop

map処理の作成

vi map.php

[php]
<?php
while (($row = fgetcsv(STDIN, 1024, " ")) !== FALSE) {
foreach ($row as $word) {
if ($word !== ”) {
echo "${word}\t1\n";
}
}
}
?>
[/php]

map.phpローカルテスト

cat file01 file02 | php ./map.php

Hello   1
World   1
Bye     1
World   1
Hello   1
Hadoop  1
Goodbye 1
Hadoop  1

キーと値のペアが出力される。
値は文字の出現回数とし1を固定。

map処理と同じ状態で出力

cat file01 file02 | php ./map.php | sort

Bye     1
Goodbye 1
Hadoop  1
Hadoop  1
Hello   1
Hello   1
World   1
World   1

キーを元にソートされるためsortコマンドへ送る。

reduce処理の作成

vi reduce.php

[php]
<?php
$count = array();
while ((list($key, $value) = fgetcsv(STDIN, 1024, "\t")) !== FALSE) {
$count[$key] = empty($count[$key]) ? 1: $count[$key] + 1;
}

foreach ( $count as $key => $value ) {
echo "${key}\t${value}\n";
}
?>
[/php]

reduce.phpローカルテスト

cat file01 file02 | php ./map.php | sort | php ./reduce.php

Bye     1
Goodbye 1
Hadoop  2
Hello   2
World   2

キーと値のペアを配列にマップしてカウント

Hadoop Streamingの実行

ファイルの配信

scp -r /home/mapred hdfs@slaves000:/home/
scp -r /home/mapred hdfs@slaves001:/home/
scp -r /home/mapred hdfs@slaves002:/home/

ストリーミングモジュールを利用してmapreduceの実行

sudo su hdfs

/usr/lib/hadoop-0.20/bin/hadoop \
  jar /usr/lib/hadoop-0.20/contrib/streaming/hadoop-streaming-0.20.2-cdh3u5.jar \
  -input /user/hdfs/input \
  -output /user/hdfs/output \
  -mapper '/usr/bin/php /home/mapred/map.php' \
  -reducer '/usr/bin/php /home/mapred/reduce.php'

/user/hdfs/outputが既に存在しているとエラーになります。

結果の確認

sudo -s hdfs hadoop fs -ls /user/hdfs/output
Found 3 items
-rw-r--r--   1 hdfs supergroup          0 2012-12-02 04:23 /user/hdfs/output/_SUCCESS
drwxr-xr-x   - hdfs supergroup          0 2012-12-02 04:24 /user/hdfs/output/_logs
-rw-r--r--   1 hdfs supergroup         41 2012-12-02 04:25 /user/hdfs/output/part-00000

sudo -u hdfs hadoop fs -cat /user/hdfs/output/part-00000

Bye     1
Goodbye 1
Hadoop  2
Hello   2
World   2

HDFS上の/user/hdfs/output/に結果が保存される。

One thought on “Hadoop Streaming

  1. Your post, Hadoop Streaming | ひつじブログ – メモー基本PHP関連, is really well written and insightful. Glad I found your website, warm regards from Luanne!

    http://www.bestbrandsworldwide.com
    http://www.bigconceptdesigns.com
    http://www.terrazoa.com
    http://www.gamegusto.com
    http://www.querybuzz.com
    http://www.couponclinch.com
    http://www.propertyslate.com
    http://www.everyoneworthknowing.com
    http://www.careerfortune.com
    http://www.peopleinhollywood.com

Leave a reply