Hadoopアドベントカレンダーの14日目。
阪本です。
セキュア通信でFlumeを使う方法について書こうと思います。
現行のFlumeには、セキュア通信を行うための仕組みは用意されていません。
完全ローカルで使用するのであれば、それでもよいかもしれませんが、
やはり通信経路のセキュリティは気になるもの。
特に日本ではこのあたり、気にされるんですよねぇ。
そこで、SSHポートフォワード+Flumeによるセキュア通信をやってみました。
まずは、flume configでの設定。
exec unmapAll exec purgeAll exec map host1 node1_1 exec map host1 node1_2 exec map host2 node2_1 exec map host2 node2_2 exec map host3 collector1 exec map host3 collector2 exec config node1_1 flow1 'execPeriodic("/usr/local/test/collect1.sh", 60000)' 'agentSink("localhost", 10001)' exec config node1_2 flow2 'execPeriodic("/usr/local/test/collect2.sh", 60000)' 'agentSink("localhost", 10002)' exec config node2_1 flow1 'execPeriodic("/usr/local/test/collect1.sh", 60000)' 'agentSink("localhost", 10001)' exec config node2_2 flow2 'execPeriodic("/usr/local/test/collect2.sh", 60000)' 'agentSink("localhost", 10002)' exec config collector1 flow1 'collectorSource(35851)' 'collectorSink("file:///home/test/output1")' exec config collector2 flow2 'collectorSource(35852)' 'collectorSink("file:///home/test/output2")'
上は、論理ノード4つと論理コレクタ4つを、計3台の物理マシンに割り当てる例。
(見やすいように改行しています。)
collect1/2.shは、転送する内容を標準出力に出力します。
node1_1とnode2_1はcollector1に、node1_2とnode2_2はcollector2にデータを転送します。
ここでポイントとなるのは、ノードのagentSinkで指定するアドレスとポート。
当然ながら、SSHポートフォワードでポートを開けているアドレスとポートを指定しなければなりません。
Agentはlocalhostの10001/10002番ポートへデータを送信し、
Collectorは
そしてsshコマンド。各ノード上で以下を実行。
ssh -L 10001:host3:35851 -L 10002:host3:35852 -L 10003:host3:35872 user@host3
こうすることで、ノードの10001番ポートに来たデータはhost1の35851番ポートへ、
ノードの10002番ポートに来たデータはhost1の35852番ポートへ、
そしてノードの10003番ポートに来たデータはhost1の35872番ポートへ、
SSH経由で転送されることになります。
Agent <-> Master間のHeartbeat通信もSSH経由を忘れずに。
公開鍵認証できるようにしておけば、パスワード要らず。
あとは、Agent側のflume.master.heartbeat.portに10003を設定して、
普通にFlumeを実行するだけ。
プログラムに手を加えることなく、セキュア通信できるようにするのは
SSHの強みですね。