ひしだまの変更履歴

ひしだまHPの更新履歴。
主にTRPGリプレイの元ネタ集、プログラミング技術メモと自作ソフト、好きなゲームや音楽です。

1~100を合算するHadoopプログラム

2012-03-26 22:40:17 | PG(分散処理)

1~100を合算するC言語のプログラムに続いて、Hadoopでも作ってみた。さすがに変数1個では無理だったが^^;
しかもこんなもんHadoopでやるなという格好の例だけどね!(爆)
数が超大きくなったらHadoopで分散させる意味もあるかもしれないが、そんなのintの範囲に収まらないし^^;

とは言え、SequenceFileを使ったサンプルとしては真面目に役立つかもしれない。かも。

プログラムの構造としては、SeqFileに1~100までのレコードを出力し、それをReducerで合算するだけ。
SeqFileも大きくなればHDFS上で分散してくれるはずなので、こういう使い方はアリだと思う。 

合算部分はWordCountでよく出てくるIntSumReducerそのものが使える。
また、Mapperでは特に何もせずReducerにそのまま値を渡せばよい為、Mapperクラスそのものを指定している。(新API(Hadoop0.20以降)ではMapperクラスは入力をそのまま出力に渡すようになっている。旧APIのIdentityMapperに相当する。なお、HadoopではReduce処理だけしたくても必ずMap処理を経由する必要がある)
Mapperの入力やReducerの出力はTextFileだろうがSeqFileだろうがMapper/Reducerには関係ないので、Mapper/IntSumReducerクラスがWordCountと同様にそのまま使える。

入力をTextFileにしても構わなかったんだけど、そうするとMapperを自作してTextからIntWritableへ変換したりする必要があるので、TextFileにはしなかった。
同様に出力をTextFileにしても良かったんだけど、ファイルのまま中を見るならTextの方が便利だが、値を取得するならSeqFileでもいいかなーと。
ちなみに、jobにセットするOutputFormatをTextOutputFormatに変えるだけで、後は何も変えなくても自動的にTextFileになる。こういった疎結合の仕組みは楽でいいよね~。
(TextOutputFormatでは、キーや値がNullWritableやnullだと何も出力されない。今回はキーが常にNullWritableなので、値(がtoString()されたもの)だけが出力される)
(今回のプログラムでは、最後の結果読み込み部分をSeqFile用からTextFile用に変えないといけないけど)

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

変数を1個だけ使って1~100を合算するC言語プログラム

2012-03-26 22:07:54 | PG(C言語)

今日Twitterで、変数を1個だけ使って1から100までの和を作れというお題(Σ100)が流れていた。そのひとつであるtanakhさんのC言語のプログラムを見て、自分もC言語で作ってみた(笑)

C言語ではmain関数からプログラムの実行が始まるのはみんな知ってるけど、(C言語ってのはひどい言語でw、)mainの引数は省略できるんだよね。
自分が知っている範囲では引数は3つあって、main(int argc, char* argv[], char *envp[])。(4つ目もあったような気がするけど、覚えてない…)
argcは実行時引数の個数、argvはその値の配列、envpは環境変数(「変数名=値」という形式)の配列。引数の個数はargcで渡されるのに、envpの個数は渡されない。envp++でポインターを進めていって、*envpがNULLだったら終わり^^;
ちなみにargvも「argv[argc]==NULL」なのが保証されていたはず。

で、自分が作ったΣ100のプログラムは、このうちの第1引数(argc)をカウンターに使おうという鬼畜な構造(爆)
引数を99個渡してやれば、(必ずプログラム名として1個は渡されるので)argcは100になる。さすがに引数を99個書くのは面倒だったので、UNIXのseqを使ったけど^^; 

こういう、シンプルで変なプログラムは意外と好きだったりするのだった(笑)

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする