Network Pipeline

以前下記の記事で、 MapReduceをとりあげたとき、BashReduceのソースレビューをしました。
http://decode.red/blog/20141102230/

このときのネットワーク経由のパイプ処理の部分を抜き出して、そのしくみをわかりやすく再現してみました。

環境 : Ubuntu 14.04 (192.168.11.14), Raspberry Pi2 (192.168.11.111)
事前準備は、Ubuntu側は、mkfifo でパイプを二つ(/opt/fifo,/opt/fifo2)作り、Raspberry Piでは、一時ファイル(/opt/file)を作ります。
BashReduceでは、sshを使って、リモート側の事前準備をしています。

手順
-Raspberry Pi
1) nc -l -p 12345 > /opt/file #受け取ったデータを一時ファイルに書き込み

-Ubuntu
2) nc -l 11111 > /opt/fifo #受け取ったデータをパイプに書き込む

3) cat /opt/fifo #Raspberry Pi からの結果を表示

4) nc 192.168.11.111 12345 < /opt/fifo2 #Raspberry Piに送信 Raspberry Pi

5) tail -f /opt/file | nc 192.168.11.14 11111 #Ubuntuに送信

-Ubuntu
6)while read line; do echo $line; done > /opt/fifo2 #送信するデータを入力

BashReduceでは、fifo, fifo2のペアで送受信する部分でデータのハッシュ値によって複数のファイルディスクリプタを切り替えることによって接続先を切り替え、処理の分散をしています。リモート側で何らかの処理をするのですが、ここではそのまま返しています。

実行結果。
ubuntu-pipe

やはりUNIXのハイプは強力です。