AnyEventとEC2を使った
  クローラーのご紹介
    Songhee Han
    Kazuya Shono
自己紹介
                                                • 韓 松熙(@purewish)
                                                • 荘...
本セッションの内容
• 本セッションでは、
 • EC2を用いたクローリングサーバのスケールアウト
 • AnyEventを用いたインスタンス管理や前後処理の制御
  についてご紹介します
• クローリングの対象や目的によって実装方法が異な
 ...
クローラー
• 先日、業務でPerlを使ったHoneybeeというク
  ローラーを作成しました
• Honeybeeでは、クローリングに特化した
  Honeybee::Beeと、クローリングの前後に行
  う一連の処理フローを管理・実行する...
AnyEventとは
• AnyEventのかんたんな説明
  • イベント駆動プログラミングをまとめるためのインターフェイス
  • I/O, Timer, HTTPなどのイベントが発生したタイミングで、非同期に
    処理を実行することが...
全体的なイメージ
                       Hive

                     事前処理




クロール                 クロール                           クロ...
Honeybee::Beeについて




    Copyright Since 1999 © GaiaX Co. Ltd. All rights reserved.
シンプルなアプリケーション
• 今回のクローラーでは、クローリング部分を楽にス
  ケールアウトできるように設計しました
• さまざまなホスティングサービスに設置できるように
  するため、クローリング処理だけを切り出し、環境に
  依存しない...
Honeybee:: Beeの実装
• Bee自体は、受け取ったURLを対象にスクレ
  イピングを行い結果をJSON形式で返します
• そのため、BeeはWeb Application
  Frameworkを使用せず、単純なPSGIのアプ
...
スケールアウト

• シンプルな構成のアプリなので環境に依存せ
  ず、設置することができます
• 今回は、Amazon Web ServicesのEC2を利
  用し、複数のインスタンスに設置することでス
  ケールアウトをはかりました


...
連携のイメージ図
Hive                  パラメータを送信                                         Bee

                                     ...
EC2のイメージ管理
• EC2で楽にインスタンスを起動するために、
  あらかじめBeeを組み込んだOSイメージを
  AMIとしてS3に保存しています




      Copyright Since 1999 © GaiaX Co. L...
Honeybee::Hiveについて




    Copyright Since 1999 © GaiaX Co. Ltd. All rights reserved.
Hiveの機能
• Honeybee::Hiveでは、
  • クローリング対象のURLを生成し、データベースに格納
  • クローリング処理(Bee側とHTTP通信)
  • クローリング結果の重複対応
  といった機能が実装されています
•...
2つのデーモン
• Crawler Daemon
   • インスタンスの管理
   • クローリング処理の実行
• Flow Management Daemon
  • 全体の処理を順次実行するための、メッセージの
    受信と機能の実行を...
Crawler Daemon
             Hive                                                          Bee

                事前処理
      ...
クローリング処理の管理
• 実際のクローリング処理はBeeで行います
• Hive側では、Beeが設置されているインスタンスを
  管理し、効率的にBee側に作業を行うようにリクエス
  トをする必要があります




        Copy...
インスタンスの管理
• 今回は、インスタンスの情報をデータベースに格納していま
  す
• AnyEventのtimerで、定期的にインスタンスの状態をチェック
  し、idleなインスタンスが存在すれば、そのインスタンスを
  activeに...
Bee側へのリクエスト
• 取得したidle状態のインスタンスにリクエストを送り
  ます
• インスタンスが複数存在する場合も考慮し、インスタ
  ンスの数だけ子プロセスを立ち上げ、並列でリクエ
  ストを送るようにしています
• 子プロセス...
Bee側の処理フロー図
    Hive                                                               Bee

Crawler Daemon
                   ...
インスタンスの管理
             use AnyEvent;
             use Parallel::ForkManager;

             my $cv = AE::cv;
             m...
Bee側とのやりとり
             $pm->start and next;

             my $crawl = $api->logic('Crawl')->get_crawl;
             my $r...
Flow Management Daemon
             Hive                                                          Bee

                事前処...
順次実行される仕組み
• Beeではスケールアウトが重要だったように、Hiveでは処理
  フローが順に実行される点を重視しました
• 順次実行される仕組みとして、
 • cronなどで定期的に処理のステータス(どこまで実行したか)を確認
  ...
メッセージを送る側
• 今回は、AnyEvent::Socketを使用し、tcp_serverでメッセー
  ジを受け取り、決められた処理を順に実行しています
• メッセージは各処理の最後で送信します
• 送る際に、
  • 次に実行するコール...
メッセージを受け取る側
• 送られたメッセージをtcp_serverで受け取ります
• 受け取ったメッセージをアンシリアライズします
• 最後に、指定されたコールバックを、復元された引
  数を渡して実行します




        Copy...
Hiveのイメージ図
                        Hive

                                      メッセージを送信
 事前処理

                           ...
イベントの処理
             package Honeybee::Hive::Event;
             use Storable qw/freeze/;
             use IO::Socket::UNI...
メッセージの送信
             #!/usr/bin/env perl
             use strict;
             use warnings;
             use utf8;
     ...
メッセージの受信と実行
             use   Storable qw/thaw/;
             use   AnyEvent::Socket;
             use   AnyEvent::Handle...
イベントの処理
             package Honeybee::Hive::Event;
             use Storable qw/freeze/;
             use IO::Socket::UNI...
全体の流れ
             Hive                                                          Bee

                事前処理
               ...
考察




Copyright Since 1999 © GaiaX Co. Ltd. All rights reserved.
今までは...

• 一つのロジックに一連の処理の流れが書い
  てあったため、処理の一部分だけをスケール
  アウトすることが難しかった
• ロジックを分割したとき、状態遷移を管理する
  ためには、定期的にチェックするしかなかった
 • 例...
今回の設計で...

• 複雑なロジックを出来る限りシンプルに分割
  することで、特定の処理をスケールアウトしや
  すい設計にした
• crontabなどで定期的にチェックする構成をや
  め、各処理の最後で自動的に次の処理を実
  行させ...
Amazon EC2を使用すると...

• 新しいインスタンスを立ち上げるだけで、捌け
  る数を増やすことができる
• クローリング部分はシンプルな処理なので、
  スペックを必要とせず、1インスタンスに掛か
  るコストが低い




 ...
まとめ

• 今回の実装コンセプトはほんの一例にすぎま
  せんが、こういったアプローチもよいのではな
  いかと思います
• ご意見ありましたら是非お聞かせ下さい




      Copyright Since 1999 © GaiaX ...
10/14/2010   Copyright Since 1999 © GaiaX Co. Ltd. All rights reserved.   39
ご静聴ありがとうございました




10/14/2010      Copyright Since 1999 © GaiaX Co. Ltd. All rights reserved.   40
AnyEventとEC2を使ったクローリングツールのご紹介
Upcoming SlideShare
Loading in...5
×

AnyEventとEC2を使ったクローリングツールのご紹介

6,413

Published on

今回ガイアックスでは、AnyEventとAmazon EC2を使ったWebサイトのクローリングツールを作成しました。発表では、これらの技術の基本的な使い方から、EC2を利用するメリット、設計のコンセプトなどについてお話できればと思います。

Published in: Technology
0 Comments
2 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
6,413
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
97
Comments
0
Likes
2
Embeds 0
No embeds

No notes for slide

AnyEventとEC2を使ったクローリングツールのご紹介

  1. 1. AnyEventとEC2を使った クローラーのご紹介 Songhee Han Kazuya Shono
  2. 2. 自己紹介 • 韓 松熙(@purewish) • 荘野 和也(@miniturbo) 10/14/2010 Copyright Since 1999 © GaiaX Co. Ltd. All rights reserved. 2
  3. 3. 本セッションの内容 • 本セッションでは、 • EC2を用いたクローリングサーバのスケールアウト • AnyEventを用いたインスタンス管理や前後処理の制御 についてご紹介します • クローリングの対象や目的によって実装方法が異な るため、特定のク ローリング処理というよりも、ク ローリングをするための構成や設計を中心にお話 したいと思います Copyright Since 1999 © GaiaX Co. Ltd. All rights reserved.
  4. 4. クローラー • 先日、業務でPerlを使ったHoneybeeというク ローラーを作成しました • Honeybeeでは、クローリングに特化した Honeybee::Beeと、クローリングの前後に行 う一連の処理フローを管理・実行する Honeybee::Hiveの2パッケージで構成されて います Copyright Since 1999 © GaiaX Co. Ltd. All rights reserved.
  5. 5. AnyEventとは • AnyEventのかんたんな説明 • イベント駆動プログラミングをまとめるためのインターフェイス • I/O, Timer, HTTPなどのイベントが発生したタイミングで、非同期に 処理を実行することができる • 今回使ったモジュール • AE::timer • AnyEvent::Socket • AnyEvent::Handle Copyright Since 1999 © GaiaX Co. Ltd. All rights reserved.
  6. 6. 全体的なイメージ Hive 事前処理 クロール クロール クロール Bee 事後処理 Copyright Since 1999 © GaiaX Co. Ltd. All rights reserved.
  7. 7. Honeybee::Beeについて Copyright Since 1999 © GaiaX Co. Ltd. All rights reserved.
  8. 8. シンプルなアプリケーション • 今回のクローラーでは、クローリング部分を楽にス ケールアウトできるように設計しました • さまざまなホスティングサービスに設置できるように するため、クローリング処理だけを切り出し、環境に 依存しないシンプルなアプリケーションになっていま す • そのクローリング部分こそがHoneybee::Beeです Copyright Since 1999 © GaiaX Co. Ltd. All rights reserved.
  9. 9. Honeybee:: Beeの実装 • Bee自体は、受け取ったURLを対象にスクレ イピングを行い結果をJSON形式で返します • そのため、BeeはWeb Application Frameworkを使用せず、単純なPSGIのアプ リケーションとして実装されています Copyright Since 1999 © GaiaX Co. Ltd. All rights reserved.
  10. 10. スケールアウト • シンプルな構成のアプリなので環境に依存せ ず、設置することができます • 今回は、Amazon Web ServicesのEC2を利 用し、複数のインスタンスに設置することでス ケールアウトをはかりました Copyright Since 1999 © GaiaX Co. Ltd. All rights reserved.
  11. 11. 連携のイメージ図 Hive パラメータを送信 Bee EC2インスタンス Crawler EC2インスタンス Daemon 他のレンタルサーバ JSONで返す Copyright Since 1999 © GaiaX Co. Ltd. All rights reserved.
  12. 12. EC2のイメージ管理 • EC2で楽にインスタンスを起動するために、 あらかじめBeeを組み込んだOSイメージを AMIとしてS3に保存しています Copyright Since 1999 © GaiaX Co. Ltd. All rights reserved.
  13. 13. Honeybee::Hiveについて Copyright Since 1999 © GaiaX Co. Ltd. All rights reserved.
  14. 14. Hiveの機能 • Honeybee::Hiveでは、 • クローリング対象のURLを生成し、データベースに格納 • クローリング処理(Bee側とHTTP通信) • クローリング結果の重複対応 といった機能が実装されています • この機能を実行するために、Hive側では2つのデー モンが用意されています Copyright Since 1999 © GaiaX Co. Ltd. All rights reserved.
  15. 15. 2つのデーモン • Crawler Daemon • インスタンスの管理 • クローリング処理の実行 • Flow Management Daemon • 全体の処理を順次実行するための、メッセージの 受信と機能の実行を行う Copyright Since 1999 © GaiaX Co. Ltd. All rights reserved.
  16. 16. Crawler Daemon Hive Bee 事前処理 EC2インスタンス クロール処理 Flow Management Crawler Daemon Daemon EC2インスタンス 事後処理 他のレンタルサーバ Copyright Since 1999 © GaiaX Co. Ltd. All rights reserved.
  17. 17. クローリング処理の管理 • 実際のクローリング処理はBeeで行います • Hive側では、Beeが設置されているインスタンスを 管理し、効率的にBee側に作業を行うようにリクエス トをする必要があります Copyright Since 1999 © GaiaX Co. Ltd. All rights reserved.
  18. 18. インスタンスの管理 • 今回は、インスタンスの情報をデータベースに格納していま す • AnyEventのtimerで、定期的にインスタンスの状態をチェック し、idleなインスタンスが存在すれば、そのインスタンスを activeにし、リクエストを送るようにしています • レスポンスが返ってきたら、使用したインスタンスをidleの状 態に戻します Copyright Since 1999 © GaiaX Co. Ltd. All rights reserved.
  19. 19. Bee側へのリクエスト • 取得したidle状態のインスタンスにリクエストを送り ます • インスタンスが複数存在する場合も考慮し、インスタ ンスの数だけ子プロセスを立ち上げ、並列でリクエ ストを送るようにしています • 子プロセスは、レスポンスを処理し、インスタンスを idle状態に戻して終了します Copyright Since 1999 © GaiaX Co. Ltd. All rights reserved.
  20. 20. Bee側の処理フロー図 Hive Bee Crawler Daemon EC2インスタンス 子プロセス (idle) EC2インスタンス 子プロセス (idle) EC2インスタンス (active) Copyright Since 1999 © GaiaX Co. Ltd. All rights reserved.
  21. 21. インスタンスの管理 use AnyEvent; use Parallel::ForkManager; my $cv = AE::cv; my $timer = AE::timer 0, 1, sub { # idle状態のインスタンスをデータベースから取得 my $instances = $api->logic('Instance')->get_idle_instances(1); my $pm = Parallel::ForkManager->new(scalar @$instances); foreach my $instance (@$instances) { $pm->start and next; ・・・ # 次のページで詳細を記述 # インスタンスをidle状態に戻す $api->logic('Instance')->idle_instance( $instance->{instance_seq}); $pm->finish; } $pm->wait_all_children; }; $cv->recv; 10/14/2010 Copyright Since 1999 © GaiaX Co. Ltd. All rights reserved. 22
  22. 22. Bee側とのやりとり $pm->start and next; my $crawl = $api->logic('Crawl')->get_crawl; my $res = $ua->post($instance->{instance_url}, { seq => $crawl->{crawl_seq}, url => $crawl->{crawl_search_url}, domain => $crawl->{crawl_search_tool_domain} }); my $content = JSON::decode_json( $res->content ); if ( $content->{success} ) { $api->logic('Crawl') ->succeed($crawl->{crawl_seq}, $content->{urls}); } else { $api->logic('Crawl') ->fail($crawl->{crawl_seq}, $content->{error}); } $pm->finish; 10/14/2010 Copyright Since 1999 © GaiaX Co. Ltd. All rights reserved. 23
  23. 23. Flow Management Daemon Hive Bee 事前処理 EC2インスタンス クロール処理 Flow Management Crawler Daemon Daemon EC2インスタンス 事後処理 他のレンタルサーバ Copyright Since 1999 © GaiaX Co. Ltd. All rights reserved.
  24. 24. 順次実行される仕組み • Beeではスケールアウトが重要だったように、Hiveでは処理 フローが順に実行される点を重視しました • 順次実行される仕組みとして、 • cronなどで定期的に処理のステータス(どこまで実行したか)を確認 することは避けたい • 処理が実行された後、自動的に次の処理を実行するよう、メッセージ やシグナルで通知を行う • 通知を受け取ったとき、次の処理を実行する という観点で設計を行いました Copyright Since 1999 © GaiaX Co. Ltd. All rights reserved.
  25. 25. メッセージを送る側 • 今回は、AnyEvent::Socketを使用し、tcp_serverでメッセー ジを受け取り、決められた処理を順に実行しています • メッセージは各処理の最後で送信します • 送る際に、 • 次に実行するコールバック名 • そのコールバックに渡す引数 をシリアライズし、ソケット通信で送信します Copyright Since 1999 © GaiaX Co. Ltd. All rights reserved.
  26. 26. メッセージを受け取る側 • 送られたメッセージをtcp_serverで受け取ります • 受け取ったメッセージをアンシリアライズします • 最後に、指定されたコールバックを、復元された引 数を渡して実行します Copyright Since 1999 © GaiaX Co. Ltd. All rights reserved.
  27. 27. Hiveのイメージ図 Hive メッセージを送信 事前処理 Flow Management クロール処理 Daemon 事後処理 次の処理を実行 Copyright Since 1999 © GaiaX Co. Ltd. All rights reserved.
  28. 28. イベントの処理 package Honeybee::Hive::Event; use Storable qw/freeze/; use IO::Socket::UNIX; sub trigger { my ( $self, $data ) = @_; my $serialized = freeze($data); my $sock = IO::Socket::UNIX->new( Peer => $conf->{hive}->{socket} ); $sock->send($serialized); $sock->close; } sub execute { my ( $self, $event, $args ) = @_; eval { $self->$event($args); }; carp $@ if $@; } 10/14/2010 Copyright Since 1999 © GaiaX Co. Ltd. All rights reserved. 29
  29. 29. メッセージの送信 #!/usr/bin/env perl use strict; use warnings; use utf8; use Honeybee::Hive::Event; my $event = Honeybee::Hive::Event->new; $event->trigger({ event => 'prepare_crawl', args => { process_seq => 1, } }); 10/14/2010 Copyright Since 1999 © GaiaX Co. Ltd. All rights reserved. 30
  30. 30. メッセージの受信と実行 use Storable qw/thaw/; use AnyEvent::Socket; use AnyEvent::Handle; use Honeybee::Hive::Event; my $event = Honeybee::Hive::Event->new; tcp_server '', $conf->{socket}, sub { my ($fh) = @_; my $handle; $handle = AnyEvent::Handle->new( fh => $fh, on_read => sub { my $buffer = $handle->rbuf; my $data = thaw($buffer); $event->execute($data->{event}, $data->{args}); } ); }; AE::cv->recv; 10/14/2010 Copyright Since 1999 © GaiaX Co. Ltd. All rights reserved. 31
  31. 31. イベントの処理 package Honeybee::Hive::Event; use Storable qw/freeze/; use IO::Socket::UNIX; sub trigger { ... } sub execute { my ( $self, $event, $args ) = @_; eval { $self->$event($args); }; carp $@ if $@; } sub prepare_crawl { ... $self->trigger({ event => 'crawl' }) } 10/14/2010 Copyright Since 1999 © GaiaX Co. Ltd. All rights reserved. 32
  32. 32. 全体の流れ Hive Bee 事前処理 EC2インスタンス クロール処理 Flow Management Crawler EC2インスタンス Daemon Daemon 事後処理 他のレンタルサーバ Copyright Since 1999 © GaiaX Co. Ltd. All rights reserved.
  33. 33. 考察 Copyright Since 1999 © GaiaX Co. Ltd. All rights reserved.
  34. 34. 今までは... • 一つのロジックに一連の処理の流れが書い てあったため、処理の一部分だけをスケール アウトすることが難しかった • ロジックを分割したとき、状態遷移を管理する ためには、定期的にチェックするしかなかった • 例えば...状態を表すフラグをDBに設けそのフラ グを定期的にチェックしたり... Copyright Since 1999 © GaiaX Co. Ltd. All rights reserved.
  35. 35. 今回の設計で... • 複雑なロジックを出来る限りシンプルに分割 することで、特定の処理をスケールアウトしや すい設計にした • crontabなどで定期的にチェックする構成をや め、各処理の最後で自動的に次の処理を実 行させるようにした • 今回は、ソケット通信にて実装した Copyright Since 1999 © GaiaX Co. Ltd. All rights reserved.
  36. 36. Amazon EC2を使用すると... • 新しいインスタンスを立ち上げるだけで、捌け る数を増やすことができる • クローリング部分はシンプルな処理なので、 スペックを必要とせず、1インスタンスに掛か るコストが低い Copyright Since 1999 © GaiaX Co. Ltd. All rights reserved.
  37. 37. まとめ • 今回の実装コンセプトはほんの一例にすぎま せんが、こういったアプローチもよいのではな いかと思います • ご意見ありましたら是非お聞かせ下さい Copyright Since 1999 © GaiaX Co. Ltd. All rights reserved.
  38. 38. 10/14/2010 Copyright Since 1999 © GaiaX Co. Ltd. All rights reserved. 39
  39. 39. ご静聴ありがとうございました 10/14/2010 Copyright Since 1999 © GaiaX Co. Ltd. All rights reserved. 40
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×