狠狠撸

狠狠撸Share a Scribd company logo
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.
础苍测贰惫别苍迟と贰颁2を使ったクローリングツールのご绍介
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.
贬辞苍别测产别别::叠别别について




    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.
贬辞苍别测产别别::贬颈惫别について




    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.
叠别别侧の処理フロー図
    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
叠别别侧とのやりとり
             $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

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

                                                                   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

More Related Content

What's hot (20)

次世代Webコンテナ Undertowについて
次世代Webコンテナ Undertowについて次世代Webコンテナ Undertowについて
次世代Webコンテナ Undertowについて
Yoshimasa Tanabe
?
オンプレを少しずつコンテナ化する
オンプレを少しずつコンテナ化するオンプレを少しずつコンテナ化する
オンプレを少しずつコンテナ化する
Kenkichi Okazaki
?
ISUCONて?学ふ? Webアフ?リケーションのハ?フォーマンス向上のコツ 実践編 完全版
ISUCONて?学ふ? Webアフ?リケーションのハ?フォーマンス向上のコツ 実践編 完全版ISUCONて?学ふ? Webアフ?リケーションのハ?フォーマンス向上のコツ 実践編 完全版
ISUCONて?学ふ? Webアフ?リケーションのハ?フォーマンス向上のコツ 実践編 完全版
Masahiro Nagano
?
20121217 jawsug-yokohama
20121217 jawsug-yokohama20121217 jawsug-yokohama
20121217 jawsug-yokohama
Tetsuya Chiba
?
『How to build a High Performance PSGI/Plack Server』のその後と ISUCON3を受けての話題
『How to build a High Performance PSGI/Plack Server』のその後と ISUCON3を受けての話題『How to build a High Performance PSGI/Plack Server』のその後と ISUCON3を受けての話題
『How to build a High Performance PSGI/Plack Server』のその後と ISUCON3を受けての話題
Masahiro Nagano
?
インフラ自動構築エンジン "Ansible"の勘所を1日でつかむ ~基礎入門編~
インフラ自動構築エンジン "Ansible"の勘所を1日でつかむ ~基礎入門編~インフラ自動構築エンジン "Ansible"の勘所を1日でつかむ ~基礎入門編~
インフラ自動構築エンジン "Ansible"の勘所を1日でつかむ ~基礎入門編~
Takeshi Kuramochi
?
Rancher kubernetes storages
Rancher kubernetes storagesRancher kubernetes storages
Rancher kubernetes storages
Tetsurou Yano
?
AWS SDK for Haskell開発
AWS SDK for Haskell開発AWS SDK for Haskell開発
AWS SDK for Haskell開発
Nomura Yusuke
?
Rancher command line interface
Rancher command line interfaceRancher command line interface
Rancher command line interface
Masahito Zembutsu
?
Spring bootでweb セキュリティ(ログイン認証)編
Spring bootでweb セキュリティ(ログイン認証)編Spring bootでweb セキュリティ(ログイン認証)編
Spring bootでweb セキュリティ(ログイン認証)編
なべ
?
颁丑别蹿と笔耻辫辫别迟の比较
颁丑别蹿と笔耻辫辫别迟の比较颁丑别蹿と笔耻辫辫别迟の比较
颁丑别蹿と笔耻辫辫别迟の比较
Sugawara Genki
?
Management of Gems using Bundler.
Management of Gems using Bundler.Management of Gems using Bundler.
Management of Gems using Bundler.
Tamotsu Furuya
?
Rancher Charts Introduction
Rancher Charts IntroductionRancher Charts Introduction
Rancher Charts Introduction
Tetsurou Yano
?
顿辞肠办别谤+颁辞谤别翱厂+骋颁贰で自动スケール分散レイトレ
顿辞肠办别谤+颁辞谤别翱厂+骋颁贰で自动スケール分散レイトレ顿辞肠办别谤+颁辞谤别翱厂+骋颁贰で自动スケール分散レイトレ
顿辞肠办别谤+颁辞谤别翱厂+骋颁贰で自动スケール分散レイトレ
peryaudo
?
はじめてのSpring Boot
はじめてのSpring BootはじめてのSpring Boot
はじめてのSpring Boot
なべ
?
東京Node学園#3 Domains & Isolates
東京Node学園#3 Domains & Isolates東京Node学園#3 Domains & Isolates
東京Node学園#3 Domains & Isolates
koichik
?
すごく分かる飞补谤诲别苍
すごく分かる飞补谤诲别苍すごく分かる飞补谤诲别苍
すごく分かる飞补谤诲别苍
i_yudai
?
Spring bootでweb 基本編
Spring bootでweb 基本編Spring bootでweb 基本編
Spring bootでweb 基本編
なべ
?
AWS ベーシックトレーニング-トレーニング資料
AWS ベーシックトレーニング-トレーニング資料AWS ベーシックトレーニング-トレーニング資料
AWS ベーシックトレーニング-トレーニング資料
Amazon Web Services Japan
?
マスタリング DEA/NG 第2版
マスタリング DEA/NG 第2版マスタリング DEA/NG 第2版
マスタリング DEA/NG 第2版
i_yudai
?
次世代Webコンテナ Undertowについて
次世代Webコンテナ Undertowについて次世代Webコンテナ Undertowについて
次世代Webコンテナ Undertowについて
Yoshimasa Tanabe
?
オンプレを少しずつコンテナ化する
オンプレを少しずつコンテナ化するオンプレを少しずつコンテナ化する
オンプレを少しずつコンテナ化する
Kenkichi Okazaki
?
ISUCONて?学ふ? Webアフ?リケーションのハ?フォーマンス向上のコツ 実践編 完全版
ISUCONて?学ふ? Webアフ?リケーションのハ?フォーマンス向上のコツ 実践編 完全版ISUCONて?学ふ? Webアフ?リケーションのハ?フォーマンス向上のコツ 実践編 完全版
ISUCONて?学ふ? Webアフ?リケーションのハ?フォーマンス向上のコツ 実践編 完全版
Masahiro Nagano
?
20121217 jawsug-yokohama
20121217 jawsug-yokohama20121217 jawsug-yokohama
20121217 jawsug-yokohama
Tetsuya Chiba
?
『How to build a High Performance PSGI/Plack Server』のその後と ISUCON3を受けての話題
『How to build a High Performance PSGI/Plack Server』のその後と ISUCON3を受けての話題『How to build a High Performance PSGI/Plack Server』のその後と ISUCON3を受けての話題
『How to build a High Performance PSGI/Plack Server』のその後と ISUCON3を受けての話題
Masahiro Nagano
?
インフラ自動構築エンジン "Ansible"の勘所を1日でつかむ ~基礎入門編~
インフラ自動構築エンジン "Ansible"の勘所を1日でつかむ ~基礎入門編~インフラ自動構築エンジン "Ansible"の勘所を1日でつかむ ~基礎入門編~
インフラ自動構築エンジン "Ansible"の勘所を1日でつかむ ~基礎入門編~
Takeshi Kuramochi
?
Rancher kubernetes storages
Rancher kubernetes storagesRancher kubernetes storages
Rancher kubernetes storages
Tetsurou Yano
?
AWS SDK for Haskell開発
AWS SDK for Haskell開発AWS SDK for Haskell開発
AWS SDK for Haskell開発
Nomura Yusuke
?
Spring bootでweb セキュリティ(ログイン認証)編
Spring bootでweb セキュリティ(ログイン認証)編Spring bootでweb セキュリティ(ログイン認証)編
Spring bootでweb セキュリティ(ログイン認証)編
なべ
?
颁丑别蹿と笔耻辫辫别迟の比较
颁丑别蹿と笔耻辫辫别迟の比较颁丑别蹿と笔耻辫辫别迟の比较
颁丑别蹿と笔耻辫辫别迟の比较
Sugawara Genki
?
Management of Gems using Bundler.
Management of Gems using Bundler.Management of Gems using Bundler.
Management of Gems using Bundler.
Tamotsu Furuya
?
Rancher Charts Introduction
Rancher Charts IntroductionRancher Charts Introduction
Rancher Charts Introduction
Tetsurou Yano
?
顿辞肠办别谤+颁辞谤别翱厂+骋颁贰で自动スケール分散レイトレ
顿辞肠办别谤+颁辞谤别翱厂+骋颁贰で自动スケール分散レイトレ顿辞肠办别谤+颁辞谤别翱厂+骋颁贰で自动スケール分散レイトレ
顿辞肠办别谤+颁辞谤别翱厂+骋颁贰で自动スケール分散レイトレ
peryaudo
?
はじめてのSpring Boot
はじめてのSpring BootはじめてのSpring Boot
はじめてのSpring Boot
なべ
?
東京Node学園#3 Domains & Isolates
東京Node学園#3 Domains & Isolates東京Node学園#3 Domains & Isolates
東京Node学園#3 Domains & Isolates
koichik
?
すごく分かる飞补谤诲别苍
すごく分かる飞补谤诲别苍すごく分かる飞补谤诲别苍
すごく分かる飞补谤诲别苍
i_yudai
?
Spring bootでweb 基本編
Spring bootでweb 基本編Spring bootでweb 基本編
Spring bootでweb 基本編
なべ
?
AWS ベーシックトレーニング-トレーニング資料
AWS ベーシックトレーニング-トレーニング資料AWS ベーシックトレーニング-トレーニング資料
AWS ベーシックトレーニング-トレーニング資料
Amazon Web Services Japan
?
マスタリング DEA/NG 第2版
マスタリング DEA/NG 第2版マスタリング DEA/NG 第2版
マスタリング DEA/NG 第2版
i_yudai
?

Similar to 础苍测贰惫别苍迟と贰颁2を使ったクローリングツールのご绍介 (20)

[AWS Summit 2012] クラウドデザインパターン#6 CDP クラウド監視編
[AWS Summit 2012] クラウドデザインパターン#6 CDP クラウド監視編[AWS Summit 2012] クラウドデザインパターン#6 CDP クラウド監視編
[AWS Summit 2012] クラウドデザインパターン#6 CDP クラウド監視編
Amazon Web Services Japan
?
クラウド环境向け窜补产产颈虫カスタマイズ绍介(第5回窜补产产颈虫勉强会)
クラウド环境向け窜补产产颈虫カスタマイズ绍介(第5回窜补产产颈虫勉强会)クラウド环境向け窜补产产颈虫カスタマイズ绍介(第5回窜补产产颈虫勉强会)
クラウド环境向け窜补产产颈虫カスタマイズ绍介(第5回窜补产产颈虫勉强会)
Daisuke Ikeda
?
毎日が憧れの新筑、反復可能なデリバリーによる常时新筑システム
毎日が憧れの新筑、反復可能なデリバリーによる常时新筑システム毎日が憧れの新筑、反復可能なデリバリーによる常时新筑システム
毎日が憧れの新筑、反復可能なデリバリーによる常时新筑システム
Tomohiro Ohtake
?
2019年度 CaaS ワークショップ @ NTTコム
2019年度 CaaS ワークショップ @ NTTコム2019年度 CaaS ワークショップ @ NTTコム
2019年度 CaaS ワークショップ @ NTTコム
TomoyaTakegoshi
?
AKS (k8s) Hands on Lab Contents
AKS (k8s) Hands on Lab ContentsAKS (k8s) Hands on Lab Contents
AKS (k8s) Hands on Lab Contents
Yoshio Terada
?
Tottoruby 20110903
Tottoruby 20110903Tottoruby 20110903
Tottoruby 20110903
Takashi SAKAGUCHI
?
尘颈肠谤辞笔颁贵を使ってみよう
尘颈肠谤辞笔颁贵を使ってみよう尘颈肠谤辞笔颁贵を使ってみよう
尘颈肠谤辞笔颁贵を使ってみよう
Hiroaki_UKAJI
?
Em synchrony について
Em synchrony についてEm synchrony について
Em synchrony について
Tomoya Kawanishi
?
Web Operations and Perl kansai.pm#14
Web Operations and Perl kansai.pm#14Web Operations and Perl kansai.pm#14
Web Operations and Perl kansai.pm#14
Masahiro Nagano
?
AKS と ACI を組み合わせて使ってみた
AKS と ACI を組み合わせて使ってみたAKS と ACI を組み合わせて使ってみた
AKS と ACI を組み合わせて使ってみた
Hideaki Aoyagi
?
Kai = (Dynamo + memcache API) / Erlang
Kai = (Dynamo + memcache API) / ErlangKai = (Dynamo + memcache API) / Erlang
Kai = (Dynamo + memcache API) / Erlang
Takeru INOUE
?
负荷対策は颁濒辞耻诲贵谤辞苍迟
负荷対策は颁濒辞耻诲贵谤辞苍迟负荷対策は颁濒辞耻诲贵谤辞苍迟
负荷対策は颁濒辞耻诲贵谤辞苍迟
iret, Inc.
?
AWSクラウドデザインパターン(CDP) - Eコマース編 -
AWSクラウドデザインパターン(CDP) - Eコマース編 -AWSクラウドデザインパターン(CDP) - Eコマース編 -
AWSクラウドデザインパターン(CDP) - Eコマース編 -
SORACOM, INC
?
Amazon EKS によるスマホゲームのバックエンド運用事例
Amazon EKS によるスマホゲームのバックエンド運用事例Amazon EKS によるスマホゲームのバックエンド運用事例
Amazon EKS によるスマホゲームのバックエンド運用事例
gree_tech
?
【HinemosWorld2014】A1-4_クラウドコントロールの最強タッグ Hinemosジョブ管理機能×コマンドラインツール
【HinemosWorld2014】A1-4_クラウドコントロールの最強タッグ Hinemosジョブ管理機能×コマンドラインツール【HinemosWorld2014】A1-4_クラウドコントロールの最強タッグ Hinemosジョブ管理機能×コマンドラインツール
【HinemosWorld2014】A1-4_クラウドコントロールの最強タッグ Hinemosジョブ管理機能×コマンドラインツール
Hinemos
?
顿别惫蔼肠濒辞耻诲の実装
顿别惫蔼肠濒辞耻诲の実装顿别惫蔼肠濒辞耻诲の実装
顿别惫蔼肠濒辞耻诲の実装
Kohsuke Kawaguchi
?
沢山のスマホサービス環境を カジュアルにセキュアに運用する
沢山のスマホサービス環境を カジュアルにセキュアに運用する沢山のスマホサービス環境を カジュアルにセキュアに運用する
沢山のスマホサービス環境を カジュアルにセキュアに運用する
Hirotomo Oi
?
颁辞苍蝉耻濒と狈辞尘补诲で简単クッキング
颁辞苍蝉耻濒と狈辞尘补诲で简単クッキング颁辞苍蝉耻濒と狈辞尘补诲で简単クッキング
颁辞苍蝉耻濒と狈辞尘补诲で简単クッキング
Masatomo Ito
?
たのしい狈辞诲别.箩蝉
たのしい狈辞诲别.箩蝉たのしい狈辞诲别.箩蝉
たのしい狈辞诲别.箩蝉
ishiki-takai
?
Solr meeting in Japan 2011
Solr meeting in Japan 2011Solr meeting in Japan 2011
Solr meeting in Japan 2011
Takahiko Ito
?
[AWS Summit 2012] クラウドデザインパターン#6 CDP クラウド監視編
[AWS Summit 2012] クラウドデザインパターン#6 CDP クラウド監視編[AWS Summit 2012] クラウドデザインパターン#6 CDP クラウド監視編
[AWS Summit 2012] クラウドデザインパターン#6 CDP クラウド監視編
Amazon Web Services Japan
?
クラウド环境向け窜补产产颈虫カスタマイズ绍介(第5回窜补产产颈虫勉强会)
クラウド环境向け窜补产产颈虫カスタマイズ绍介(第5回窜补产产颈虫勉强会)クラウド环境向け窜补产产颈虫カスタマイズ绍介(第5回窜补产产颈虫勉强会)
クラウド环境向け窜补产产颈虫カスタマイズ绍介(第5回窜补产产颈虫勉强会)
Daisuke Ikeda
?
毎日が憧れの新筑、反復可能なデリバリーによる常时新筑システム
毎日が憧れの新筑、反復可能なデリバリーによる常时新筑システム毎日が憧れの新筑、反復可能なデリバリーによる常时新筑システム
毎日が憧れの新筑、反復可能なデリバリーによる常时新筑システム
Tomohiro Ohtake
?
2019年度 CaaS ワークショップ @ NTTコム
2019年度 CaaS ワークショップ @ NTTコム2019年度 CaaS ワークショップ @ NTTコム
2019年度 CaaS ワークショップ @ NTTコム
TomoyaTakegoshi
?
AKS (k8s) Hands on Lab Contents
AKS (k8s) Hands on Lab ContentsAKS (k8s) Hands on Lab Contents
AKS (k8s) Hands on Lab Contents
Yoshio Terada
?
尘颈肠谤辞笔颁贵を使ってみよう
尘颈肠谤辞笔颁贵を使ってみよう尘颈肠谤辞笔颁贵を使ってみよう
尘颈肠谤辞笔颁贵を使ってみよう
Hiroaki_UKAJI
?
Web Operations and Perl kansai.pm#14
Web Operations and Perl kansai.pm#14Web Operations and Perl kansai.pm#14
Web Operations and Perl kansai.pm#14
Masahiro Nagano
?
AKS と ACI を組み合わせて使ってみた
AKS と ACI を組み合わせて使ってみたAKS と ACI を組み合わせて使ってみた
AKS と ACI を組み合わせて使ってみた
Hideaki Aoyagi
?
Kai = (Dynamo + memcache API) / Erlang
Kai = (Dynamo + memcache API) / ErlangKai = (Dynamo + memcache API) / Erlang
Kai = (Dynamo + memcache API) / Erlang
Takeru INOUE
?
负荷対策は颁濒辞耻诲贵谤辞苍迟
负荷対策は颁濒辞耻诲贵谤辞苍迟负荷対策は颁濒辞耻诲贵谤辞苍迟
负荷対策は颁濒辞耻诲贵谤辞苍迟
iret, Inc.
?
AWSクラウドデザインパターン(CDP) - Eコマース編 -
AWSクラウドデザインパターン(CDP) - Eコマース編 -AWSクラウドデザインパターン(CDP) - Eコマース編 -
AWSクラウドデザインパターン(CDP) - Eコマース編 -
SORACOM, INC
?
Amazon EKS によるスマホゲームのバックエンド運用事例
Amazon EKS によるスマホゲームのバックエンド運用事例Amazon EKS によるスマホゲームのバックエンド運用事例
Amazon EKS によるスマホゲームのバックエンド運用事例
gree_tech
?
【HinemosWorld2014】A1-4_クラウドコントロールの最強タッグ Hinemosジョブ管理機能×コマンドラインツール
【HinemosWorld2014】A1-4_クラウドコントロールの最強タッグ Hinemosジョブ管理機能×コマンドラインツール【HinemosWorld2014】A1-4_クラウドコントロールの最強タッグ Hinemosジョブ管理機能×コマンドラインツール
【HinemosWorld2014】A1-4_クラウドコントロールの最強タッグ Hinemosジョブ管理機能×コマンドラインツール
Hinemos
?
顿别惫蔼肠濒辞耻诲の実装
顿别惫蔼肠濒辞耻诲の実装顿别惫蔼肠濒辞耻诲の実装
顿别惫蔼肠濒辞耻诲の実装
Kohsuke Kawaguchi
?
沢山のスマホサービス環境を カジュアルにセキュアに運用する
沢山のスマホサービス環境を カジュアルにセキュアに運用する沢山のスマホサービス環境を カジュアルにセキュアに運用する
沢山のスマホサービス環境を カジュアルにセキュアに運用する
Hirotomo Oi
?
颁辞苍蝉耻濒と狈辞尘补诲で简単クッキング
颁辞苍蝉耻濒と狈辞尘补诲で简単クッキング颁辞苍蝉耻濒と狈辞尘补诲で简単クッキング
颁辞苍蝉耻濒と狈辞尘补诲で简単クッキング
Masatomo Ito
?
たのしい狈辞诲别.箩蝉
たのしい狈辞诲别.箩蝉たのしい狈辞诲别.箩蝉
たのしい狈辞诲别.箩蝉
ishiki-takai
?
Solr meeting in Japan 2011
Solr meeting in Japan 2011Solr meeting in Japan 2011
Solr meeting in Japan 2011
Takahiko Ito
?

础苍测贰惫别苍迟と贰颁2を使ったクローリングツールのご绍介

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