Ruby	
  によるお手軽分散処理	

                     maebashi	
  @	
  IIJ	




2013/01	
        Copyright	
  (c)	
  2013	
  Internet	
  Ini>a>ve	
  Japan	
  Inc.	
   1
分散処理って?	
•  複数のコンピュータノードで、同時並行的に処
   理を実行してスループットを上げる	
  
•  分散処理といえば	
  Hadoop	
  




2013/01	
   Copyright	
  (c)	
  2013	
  Internet	
  Ini>a>ve	
  Japan	
  Inc.	
   2
本日の話	
•  Ruby	
  で Hadoop	
  MapReduce	
  みたいなものを
   つくりました	
  




2013/01	
     Copyright	
  (c)	
  2013	
  Internet	
  Ini>a>ve	
  Japan	
  Inc.	
   3
本日の話	
                                                                                    これ	

            Hadoop	




                                                                          http://www.gluster.org/	




2013/01	
   Copyright	
  (c)	
  2013	
  Internet	
  Ini>a>ve	
  Japan	
  Inc.	
                       4
分散処理フレームワーク	
  
             MapReduce	
  とは?	
             mapとreduceの2段階にわけてデータ処理	
  
             ①	
  map	
  –	
  抽出・変換	
  
             ②	
  reduce	
  –	
  集約・集計	




2013/01	
         Copyright	
  (c)	
  2013	
  Internet	
  Ini>a>ve	
  Japan	
  Inc.	
   5
分散ファイルシステム	
  
             GlusterFSとは?	




                                                            FUSEでマウントして	
  
                                                            普通のファイルシステム	
  
                                                            として見える	



2013/01	
     Copyright	
  (c)	
  2013	
  Internet	
  Ini>a>ve	
  Japan	
  Inc.	
   6
ファイル名に応じて分散	




                                                              clientからは、ひとつの	
  
                                                              ファイルシステムとして見える	

             (Distributed Volume の場合)	

2013/01	
       Copyright	
  (c)	
  2013	
  Internet	
  Ini>a>ve	
  Japan	
  Inc.	
   7
pmux	
  とは?	
  (1)	
•  pipeline	
  mul>plexer	
  に由来	
  
•  hMps://github.com/iij/pmux	
  
•  hMps://github.com/iij/pmux/wiki	
  




2013/01	
       Copyright	
  (c)	
  2013	
  Internet	
  Ini>a>ve	
  Japan	
  Inc.	
   8
pmux	
  とは?	
  (2)	
•  標準入出力を介して	
  MapReduce	
  するための
   コマンドラインツール(Hadoop	
  Streaming相当)	
  

   例:	
  分散grep	
    $ pmux --mapper="grep PATTERN" *.log


                                                                                           GlusterFS上にある	
  
                                                                                           ファイル群	

2013/01	
            Copyright	
  (c)	
  2013	
  Internet	
  Ini>a>ve	
  Japan	
  Inc.	
                   9
動作原理	
•  例えば次のようなコマンド	
  
            $ grep PATTERN *.log


•  *.log が複数ノードに分散して配置されて
   いれば、各ノードで並列に処理できる	
  




2013/01	
     Copyright	
  (c)	
  2013	
  Internet	
  Ini>a>ve	
  Japan	
  Inc.	
   10
ファイルがあるノードで処理を実行	




2013/01	
   Copyright	
  (c)	
  2013	
  Internet	
  Ini>a>ve	
  Japan	
  Inc.	
   11
結果を集める	




2013/01	
   Copyright	
  (c)	
  2013	
  Internet	
  Ini>a>ve	
  Japan	
  Inc.	
   12
実際はもう少し複雑	




2013/01	
    Copyright	
  (c)	
  2013	
  Internet	
  Ini>a>ve	
  Japan	
  Inc.	
   13
使用例:	
  ステータスコード集計	
            Apache	
  ログから特定パターンの行だけ抜き出し、	
  
            そのステータスコードを集計	
$ pmux --mapper='grep PAT |cut -d" " -f 9’ 
--reducer='sort|uniq -c’ /mnt/glusterfs/*.log
 176331 200
 106360 206
    809 400
  21852 403
    533 404
     27 406
    805 416
     25 500
2013/01	
           Copyright	
  (c)	
  2013	
  Internet	
  Ini>a>ve	
  Japan	
  Inc.	
   14
使用例:	
  word	
  count	
        map.rb	
        #! /usr/bin/ruby -an
        $F.each {|f| print "#{f}t1n"}

        reduce.rb	
            #! /usr/bin/ruby -an
            BEGIN {$c = Hash.new 0}
            $c[$F[0]] += $F[1].to_i
            END {$c.each {|k, v| print "#{k} #{v}n"}}


        コマンドライン	
        $ pmux --mapper=map.rb --reducer=reduce.rb 
         --file=map.rb –-file=reduce.rb 
         /mnt/glusterfs/*.txt

2013/01	
                Copyright	
  (c)	
  2013	
  Internet	
  Ini>a>ve	
  Japan	
  Inc.	
   15
コンセプト	
•  なるべく既にある概念を用いて分散処理	
  
      – 普通のファイルシステムに見える GlusterFS	
  
      – Unix	
  のパイプの思想とフィルタコマンド群	
  
      – ssh によるリモートコマンド実行	
  




2013/01	
      Copyright	
  (c)	
  2013	
  Internet	
  Ini>a>ve	
  Japan	
  Inc.	
   16
内部構造	
•  シングルスレッド	
  
•  イベントドリブン方式	
  

•  Net::SSH	
  で ssh	
  セッションを同時に複数張り、
   その上に MessagePack-­‐RPC	
  を通す	
  




2013/01	
   Copyright	
  (c)	
  2013	
  Internet	
  Ini>a>ve	
  Japan	
  Inc.	
   17
独立した二つのイベントループ	




2013/01	
   Copyright	
  (c)	
  2013	
  Internet	
  Ini>a>ve	
  Japan	
  Inc.	
   18
Fiber	
  で結合	




2013/01	
   Copyright	
  (c)	
  2013	
  Internet	
  Ini>a>ve	
  Japan	
  Inc.	
   19
ベンチマークテスト	
                     こんなかんじのtcpdumpのlogの	
            14:00:00.416011	
  IP	
  21.44.60.29.hMp	
  >	
  170.73.162.175.58546:	
  
            	
  .	
  3523999974:3524001422(1448)	
  ack	
  3401170238	
  win	
  1716	
  
            	
  <nop,nop,>mestamp	
  1070614671	
  1955062367>	
  



                  各ファイルで一番出現数の多かった	
  
                       IPアドレスを抽出	

 8344ファイル、1ファイルあたり約50万行、計約40億行	


2013/01	
                        Copyright	
  (c)	
  2013	
  Internet	
  Ini>a>ve	
  Japan	
  Inc.	
   20
実行するmapコマンド	


--mapper='egrep –o "[0-9]+.[0-9]+.[0-9]+.[0-9]+"|
sort|uniq -c|sort -nr|head -1'




2013/01	
        Copyright	
  (c)	
  2013	
  Internet	
  Ini>a>ve	
  Japan	
  Inc.	
   21
結果	

   pmuxを使わずに1台で実行	
 8時間49分6秒	




2013/01	
   Copyright	
  (c)	
  2013	
  Internet	
  Ini>a>ve	
  Japan	
  Inc.	
   22
結果	

   pmuxを使わずに1台で実行	
 8時間49分6秒	


    pmuxを使ってノード60台で実行	
 1分45秒	


                              約300倍	


2013/01	
   Copyright	
  (c)	
  2013	
  Internet	
  Ini>a>ve	
  Japan	
  Inc.	
   23
なぜ60台で300倍?	
•  1台あたり8コアのCPUを使っているから	
  

•  ならば480倍になるのでは?	
  
      – 諸々のオーバーヘッドでそこまでいかない	
  
      – ファイルの実体位置を探すのに時間がかかる	
  
            •  今回のケース 8344ファイルで約20秒	




2013/01	
           Copyright	
  (c)	
  2013	
  Internet	
  Ini>a>ve	
  Japan	
  Inc.	
   24
2013/01	
   Copyright	
  (c)	
  2013	
  Internet	
  Ini>a>ve	
  Japan	
  Inc.	
   25

Rubyによるお手軽分散処理

  • 1.
    Ruby  によるお手軽分散処理 maebashi  @  IIJ 2013/01 Copyright  (c)  2013  Internet  Ini>a>ve  Japan  Inc. 1
  • 2.
    分散処理って? •  複数のコンピュータノードで、同時並行的に処 理を実行してスループットを上げる   •  分散処理といえば  Hadoop   2013/01 Copyright  (c)  2013  Internet  Ini>a>ve  Japan  Inc. 2
  • 3.
    本日の話 •  Ruby  でHadoop  MapReduce  みたいなものを つくりました   2013/01 Copyright  (c)  2013  Internet  Ini>a>ve  Japan  Inc. 3
  • 4.
    本日の話 これ Hadoop http://www.gluster.org/ 2013/01 Copyright  (c)  2013  Internet  Ini>a>ve  Japan  Inc. 4
  • 5.
    分散処理フレームワーク   MapReduce  とは? mapとreduceの2段階にわけてデータ処理   ①  map  –  抽出・変換   ②  reduce  –  集約・集計 2013/01 Copyright  (c)  2013  Internet  Ini>a>ve  Japan  Inc. 5
  • 6.
    分散ファイルシステム   GlusterFSとは? FUSEでマウントして   普通のファイルシステム   として見える 2013/01 Copyright  (c)  2013  Internet  Ini>a>ve  Japan  Inc. 6
  • 7.
    ファイル名に応じて分散 clientからは、ひとつの   ファイルシステムとして見える (Distributed Volume の場合) 2013/01 Copyright  (c)  2013  Internet  Ini>a>ve  Japan  Inc. 7
  • 8.
    pmux  とは?  (1) • pipeline  mul>plexer  に由来   •  hMps://github.com/iij/pmux   •  hMps://github.com/iij/pmux/wiki   2013/01 Copyright  (c)  2013  Internet  Ini>a>ve  Japan  Inc. 8
  • 9.
    pmux  とは?  (2) • 標準入出力を介して  MapReduce  するための コマンドラインツール(Hadoop  Streaming相当)   例:  分散grep $ pmux --mapper="grep PATTERN" *.log GlusterFS上にある   ファイル群 2013/01 Copyright  (c)  2013  Internet  Ini>a>ve  Japan  Inc. 9
  • 10.
    動作原理 •  例えば次のようなコマンド   $ grep PATTERN *.log •  *.log が複数ノードに分散して配置されて いれば、各ノードで並列に処理できる   2013/01 Copyright  (c)  2013  Internet  Ini>a>ve  Japan  Inc. 10
  • 11.
    ファイルがあるノードで処理を実行 2013/01 Copyright  (c)  2013  Internet  Ini>a>ve  Japan  Inc. 11
  • 12.
    結果を集める 2013/01 Copyright  (c)  2013  Internet  Ini>a>ve  Japan  Inc. 12
  • 13.
    実際はもう少し複雑 2013/01 Copyright  (c)  2013  Internet  Ini>a>ve  Japan  Inc. 13
  • 14.
    使用例:  ステータスコード集計 Apache  ログから特定パターンの行だけ抜き出し、   そのステータスコードを集計 $ pmux --mapper='grep PAT |cut -d" " -f 9’ --reducer='sort|uniq -c’ /mnt/glusterfs/*.log 176331 200 106360 206 809 400 21852 403 533 404 27 406 805 416 25 500 2013/01 Copyright  (c)  2013  Internet  Ini>a>ve  Japan  Inc. 14
  • 15.
    使用例:  word  count map.rb #! /usr/bin/ruby -an $F.each {|f| print "#{f}t1n"} reduce.rb #! /usr/bin/ruby -an BEGIN {$c = Hash.new 0} $c[$F[0]] += $F[1].to_i END {$c.each {|k, v| print "#{k} #{v}n"}} コマンドライン $ pmux --mapper=map.rb --reducer=reduce.rb --file=map.rb –-file=reduce.rb /mnt/glusterfs/*.txt 2013/01 Copyright  (c)  2013  Internet  Ini>a>ve  Japan  Inc. 15
  • 16.
    コンセプト •  なるべく既にある概念を用いて分散処理   – 普通のファイルシステムに見える GlusterFS   – Unix  のパイプの思想とフィルタコマンド群   – ssh によるリモートコマンド実行   2013/01 Copyright  (c)  2013  Internet  Ini>a>ve  Japan  Inc. 16
  • 17.
    内部構造 •  シングルスレッド   • イベントドリブン方式   •  Net::SSH  で ssh  セッションを同時に複数張り、 その上に MessagePack-­‐RPC  を通す   2013/01 Copyright  (c)  2013  Internet  Ini>a>ve  Japan  Inc. 17
  • 18.
    独立した二つのイベントループ 2013/01 Copyright  (c)  2013  Internet  Ini>a>ve  Japan  Inc. 18
  • 19.
    Fiber  で結合 2013/01 Copyright  (c)  2013  Internet  Ini>a>ve  Japan  Inc. 19
  • 20.
    ベンチマークテスト こんなかんじのtcpdumpのlogの 14:00:00.416011  IP  21.44.60.29.hMp  >  170.73.162.175.58546:    .  3523999974:3524001422(1448)  ack  3401170238  win  1716    <nop,nop,>mestamp  1070614671  1955062367>   各ファイルで一番出現数の多かった   IPアドレスを抽出 8344ファイル、1ファイルあたり約50万行、計約40億行 2013/01 Copyright  (c)  2013  Internet  Ini>a>ve  Japan  Inc. 20
  • 21.
    実行するmapコマンド --mapper='egrep –o "[0-9]+.[0-9]+.[0-9]+.[0-9]+"| sort|uniq-c|sort -nr|head -1' 2013/01 Copyright  (c)  2013  Internet  Ini>a>ve  Japan  Inc. 21
  • 22.
    結果 pmuxを使わずに1台で実行 8時間49分6秒 2013/01 Copyright  (c)  2013  Internet  Ini>a>ve  Japan  Inc. 22
  • 23.
    結果 pmuxを使わずに1台で実行 8時間49分6秒 pmuxを使ってノード60台で実行 1分45秒 約300倍 2013/01 Copyright  (c)  2013  Internet  Ini>a>ve  Japan  Inc. 23
  • 24.
    なぜ60台で300倍? •  1台あたり8コアのCPUを使っているから   • ならば480倍になるのでは?   – 諸々のオーバーヘッドでそこまでいかない   – ファイルの実体位置を探すのに時間がかかる   •  今回のケース 8344ファイルで約20秒 2013/01 Copyright  (c)  2013  Internet  Ini>a>ve  Japan  Inc. 24
  • 25.
    2013/01 Copyright  (c)  2013  Internet  Ini>a>ve  Japan  Inc. 25