AnyEventとEC2を使ったクローリングツールのご紹介
Upcoming SlideShare
Loading in...5
×
 

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

on

  • 6,540 views

今回ガイアックスでは、AnyEventとAmazon ...

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

Statistics

Views

Total Views
6,540
Views on SlideShare
6,535
Embed Views
5

Actions

Likes
2
Downloads
95
Comments
0

4 Embeds 5

http://www.linkedin.com 2
http://tallerlena.wordpress.com 1
http://esporteufpa.blogspot.com 1
http://twib.jp 1

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

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

    • AnyEventとEC2を使った クローラーのご紹介 Songhee Han Kazuya Shono
    • 自己紹介 • 韓 松熙(@purewish) • 荘野 和也(@miniturbo) 10/14/2010 Copyright Since 1999 © GaiaX Co. Ltd. All rights reserved. 2
    • 本セッションの内容 • 本セッションでは、 • EC2を用いたクローリングサーバのスケールアウト • AnyEventを用いたインスタンス管理や前後処理の制御 についてご紹介します • クローリングの対象や目的によって実装方法が異な るため、特定のク ローリング処理というよりも、ク ローリングをするための構成や設計を中心にお話 したいと思います Copyright Since 1999 © GaiaX Co. Ltd. All rights reserved.
    • クローラー • 先日、業務でPerlを使ったHoneybeeというク ローラーを作成しました • Honeybeeでは、クローリングに特化した Honeybee::Beeと、クローリングの前後に行 う一連の処理フローを管理・実行する Honeybee::Hiveの2パッケージで構成されて います Copyright Since 1999 © GaiaX Co. Ltd. All rights reserved.
    • AnyEventとは • AnyEventのかんたんな説明 • イベント駆動プログラミングをまとめるためのインターフェイス • I/O, Timer, HTTPなどのイベントが発生したタイミングで、非同期に 処理を実行することができる • 今回使ったモジュール • AE::timer • AnyEvent::Socket • AnyEvent::Handle Copyright Since 1999 © GaiaX Co. Ltd. All rights reserved.
    • 全体的なイメージ Hive 事前処理 クロール クロール クロール Bee 事後処理 Copyright Since 1999 © GaiaX Co. Ltd. All rights reserved.
    • Honeybee::Beeについて Copyright Since 1999 © GaiaX Co. Ltd. All rights reserved.
    • シンプルなアプリケーション • 今回のクローラーでは、クローリング部分を楽にス ケールアウトできるように設計しました • さまざまなホスティングサービスに設置できるように するため、クローリング処理だけを切り出し、環境に 依存しないシンプルなアプリケーションになっていま す • そのクローリング部分こそがHoneybee::Beeです Copyright Since 1999 © GaiaX Co. Ltd. All rights reserved.
    • Honeybee:: Beeの実装 • Bee自体は、受け取ったURLを対象にスクレ イピングを行い結果をJSON形式で返します • そのため、BeeはWeb Application Frameworkを使用せず、単純なPSGIのアプ リケーションとして実装されています Copyright Since 1999 © GaiaX Co. Ltd. All rights reserved.
    • スケールアウト • シンプルな構成のアプリなので環境に依存せ ず、設置することができます • 今回は、Amazon Web ServicesのEC2を利 用し、複数のインスタンスに設置することでス ケールアウトをはかりました Copyright Since 1999 © GaiaX Co. Ltd. All rights reserved.
    • 連携のイメージ図 Hive パラメータを送信 Bee EC2インスタンス Crawler EC2インスタンス Daemon 他のレンタルサーバ JSONで返す Copyright Since 1999 © GaiaX Co. Ltd. All rights reserved.
    • EC2のイメージ管理 • EC2で楽にインスタンスを起動するために、 あらかじめBeeを組み込んだOSイメージを AMIとしてS3に保存しています Copyright Since 1999 © GaiaX Co. Ltd. All rights reserved.
    • Honeybee::Hiveについて Copyright Since 1999 © GaiaX Co. Ltd. All rights reserved.
    • Hiveの機能 • Honeybee::Hiveでは、 • クローリング対象のURLを生成し、データベースに格納 • クローリング処理(Bee側とHTTP通信) • クローリング結果の重複対応 といった機能が実装されています • この機能を実行するために、Hive側では2つのデー モンが用意されています Copyright Since 1999 © GaiaX Co. Ltd. All rights reserved.
    • 2つのデーモン • Crawler Daemon • インスタンスの管理 • クローリング処理の実行 • Flow Management Daemon • 全体の処理を順次実行するための、メッセージの 受信と機能の実行を行う Copyright Since 1999 © GaiaX Co. Ltd. All rights reserved.
    • Crawler Daemon Hive Bee 事前処理 EC2インスタンス クロール処理 Flow Management Crawler Daemon Daemon EC2インスタンス 事後処理 他のレンタルサーバ Copyright Since 1999 © GaiaX Co. Ltd. All rights reserved.
    • クローリング処理の管理 • 実際のクローリング処理はBeeで行います • Hive側では、Beeが設置されているインスタンスを 管理し、効率的にBee側に作業を行うようにリクエス トをする必要があります Copyright Since 1999 © GaiaX Co. Ltd. All rights reserved.
    • インスタンスの管理 • 今回は、インスタンスの情報をデータベースに格納していま す • AnyEventのtimerで、定期的にインスタンスの状態をチェック し、idleなインスタンスが存在すれば、そのインスタンスを activeにし、リクエストを送るようにしています • レスポンスが返ってきたら、使用したインスタンスをidleの状 態に戻します Copyright Since 1999 © GaiaX Co. Ltd. All rights reserved.
    • Bee側へのリクエスト • 取得したidle状態のインスタンスにリクエストを送り ます • インスタンスが複数存在する場合も考慮し、インスタ ンスの数だけ子プロセスを立ち上げ、並列でリクエ ストを送るようにしています • 子プロセスは、レスポンスを処理し、インスタンスを idle状態に戻して終了します Copyright Since 1999 © GaiaX Co. Ltd. All rights reserved.
    • Bee側の処理フロー図 Hive Bee Crawler Daemon EC2インスタンス 子プロセス (idle) EC2インスタンス 子プロセス (idle) EC2インスタンス (active) Copyright Since 1999 © GaiaX Co. Ltd. All rights reserved.
    • インスタンスの管理 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
    • 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
    • Flow Management Daemon Hive Bee 事前処理 EC2インスタンス クロール処理 Flow Management Crawler Daemon Daemon EC2インスタンス 事後処理 他のレンタルサーバ Copyright Since 1999 © GaiaX Co. Ltd. All rights reserved.
    • 順次実行される仕組み • Beeではスケールアウトが重要だったように、Hiveでは処理 フローが順に実行される点を重視しました • 順次実行される仕組みとして、 • cronなどで定期的に処理のステータス(どこまで実行したか)を確認 することは避けたい • 処理が実行された後、自動的に次の処理を実行するよう、メッセージ やシグナルで通知を行う • 通知を受け取ったとき、次の処理を実行する という観点で設計を行いました Copyright Since 1999 © GaiaX Co. Ltd. All rights reserved.
    • メッセージを送る側 • 今回は、AnyEvent::Socketを使用し、tcp_serverでメッセー ジを受け取り、決められた処理を順に実行しています • メッセージは各処理の最後で送信します • 送る際に、 • 次に実行するコールバック名 • そのコールバックに渡す引数 をシリアライズし、ソケット通信で送信します Copyright Since 1999 © GaiaX Co. Ltd. All rights reserved.
    • メッセージを受け取る側 • 送られたメッセージをtcp_serverで受け取ります • 受け取ったメッセージをアンシリアライズします • 最後に、指定されたコールバックを、復元された引 数を渡して実行します Copyright Since 1999 © GaiaX Co. Ltd. All rights reserved.
    • Hiveのイメージ図 Hive メッセージを送信 事前処理 Flow Management クロール処理 Daemon 事後処理 次の処理を実行 Copyright Since 1999 © GaiaX Co. Ltd. All rights reserved.
    • イベントの処理 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
    • メッセージの送信 #!/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
    • メッセージの受信と実行 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
    • イベントの処理 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
    • 全体の流れ Hive Bee 事前処理 EC2インスタンス クロール処理 Flow Management Crawler EC2インスタンス Daemon Daemon 事後処理 他のレンタルサーバ Copyright Since 1999 © GaiaX Co. Ltd. All rights reserved.
    • 考察 Copyright Since 1999 © GaiaX Co. Ltd. All rights reserved.
    • 今までは... • 一つのロジックに一連の処理の流れが書い てあったため、処理の一部分だけをスケール アウトすることが難しかった • ロジックを分割したとき、状態遷移を管理する ためには、定期的にチェックするしかなかった • 例えば...状態を表すフラグをDBに設けそのフラ グを定期的にチェックしたり... Copyright Since 1999 © GaiaX Co. Ltd. All rights reserved.
    • 今回の設計で... • 複雑なロジックを出来る限りシンプルに分割 することで、特定の処理をスケールアウトしや すい設計にした • crontabなどで定期的にチェックする構成をや め、各処理の最後で自動的に次の処理を実 行させるようにした • 今回は、ソケット通信にて実装した Copyright Since 1999 © GaiaX Co. Ltd. All rights reserved.
    • Amazon EC2を使用すると... • 新しいインスタンスを立ち上げるだけで、捌け る数を増やすことができる • クローリング部分はシンプルな処理なので、 スペックを必要とせず、1インスタンスに掛か るコストが低い Copyright Since 1999 © GaiaX Co. Ltd. All rights reserved.
    • まとめ • 今回の実装コンセプトはほんの一例にすぎま せんが、こういったアプローチもよいのではな いかと思います • ご意見ありましたら是非お聞かせ下さい Copyright Since 1999 © GaiaX Co. Ltd. All rights reserved.
    • 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