Hadoop Streaming 試行錯誤

Hadoop Streaming を使ってみている。
まだあんまりドキュメントがないので、
試行錯誤するしかない。
なわけで、今日の試行錯誤のメモ。

インストールや環境設定については、
書いてあるページがそこそこあるから
そっちを見てください。

※exblogに怒られないように、
ところどころ大文字になっているので、
コピペするときは気をつけてね

前提:
(1) input.txt を hdfs に送っておく。
> $HADOOP_HOME/bin/hadoop hdfs -put input.txt

(2) -output の temp ディレクトリは毎回削除する。
> $HADOOP_HOME/bin/hadoop hdfs -rmr temp

ちなみに
>hadoop dfs -rmr temp[1234]

とか
>hadoop dfs -rmr temp*

とかも可能

【1】perlモジュールを読み込んでみる:成功
モジュールがカレントになくても、
mapper にはカレントにあるものとして指定してOKっぽい

${HADOOP_HOME}/bin/hadoop
  jar ${HADOOP_HOME}/hadoop-streaming.jar
  -input input.txt
  -output temp
  -mapper "perl test.pl"
  -reducer /bin/ls
  -file /tmp/mymodule.pm


test.pl
require "mymodule.pm";
while(<>) { print $_; }


【2】reducer を省略してみる:成功
-reducer は省略してもOK
reduce をしない代わりに -jobconf mapred.reduce.tasks=0 を指定する

${HADOOP_HOME}/bin/hadoop
  jar ${HADOOP_HOME}/hadoop-streaming.jar
  -input input.txt
  -output temp
  -mapper "perl test.pl"
  -jobconf mapred.reduce.tasks=0

test.pl
while(<>) { print $_; }


【3】引数のファイルを色々読んでみる
-file でファイルを指定して色々してみる。
hdfs 上に送らなくても色々できるかの実験。
test.pl の中を色々変えながら、実行してみる。

${HADOOP_HOME}/bin/hadoop
  jar ${HADOOP_HOME}/hadoop-streaming.jar
  -input input.txt
  -output temp
  -mapper "perl test.pl"
  -jobconf mapred.reduce.tasks=0
  -file input2.txt


test.pl : 失敗
-input のファイルは必ず読まないとダメみたい?
open(IN, "input2.txt");
while(<IN>) { print $_; }
close(IN);


test.pl : 失敗
# 複数行出力しても、最後の出力しか採用されない?
open(IN, "input2.txt");
@all = <IN>;
close(IN);
while(<>) {
  print ($#all + 1), "行¥n"; # この行は出力されないみたいだ
  print $_;
}


test.pl : 失敗
# 関係ないものを出力してみる
# ($#all + 1) の結果が、改行もなしにだーっと出力された
open(IN, "input2.txt");
@all = <IN>;
close(IN);
while(<>) {
  print ($#all + 1), "行¥n";
}


test.pl : 失敗
# -input から読み込んだ行も出力してみたのだが...
# ($#all + 1) の結果が、改行もなしにだーっと出力された
open(IN, "input2.txt");
@all = <IN>;
close(IN);
while(<>) {
  print ($#all + 1) , "¥t", $_;
}


test.pl : 失敗
# これも ($#all + 1) の結果が、改行もなしにだーっと出力された
open(IN, "input2.txt");
@all = <IN>;
close(IN);
while(<>) {
  print ($#all + 1) , "¥t", ($_."¥n");
}


test.pl : 成功
# ($#all + 1) を print 中で計算させるのがいけないのか?
open(IN, "input2.txt");
@all = <IN>;
close(IN);
$ls = $#all + 1;
while(<>) {
  # これはちゃんと出力された
  print "${ls}行¥n";
}


test.pl : 成功
# ($#all + 1) を print 中で計算させてもOKな場合がある
open(IN, "input2.txt");
@all = <IN>;
close(IN);
while(<>) {
  s/[¥r¥n]+//g;
  # これもちゃんと出力された
  print $_, "¥t", ($#all + 1), "¥n";
}

[PR]
by xiaoxia | 2009-02-27 18:15 | ソフトウェア | Comments(0)

ダメ女プログラマ&主婦&腐女子&バイオリン弾き


by 小霞