SlideShare une entreprise Scribd logo
Logs, exceptions, mails, et
  autres désagréments
L’architecture de data-mining et de remontée d’erreurs chez Fotonauts




Olivier Gutknecht       Aymerick Jéhanne         Mathieu Poumeyrol
olg@fotonauts.com       aymerick@fotonauts.com   kali@fotonauts.com
La Seule Vraie Question



 “euh , il s ’est p assé
     quoi,    là ?”
La Seule Vraie Réponse

         les


LOGS
2 usages
Global et éternel
• Toutes les machines
• Sur tous les composants voulus
• A tous les niveaux
• Aussi longtemps que désiré
• Analyse en batch
• Usages applicatifs, business, métriques
Local et focalisé
• Axé sur les situations d’erreur
• Sur quelques composants (Rails, Merb)
• Autant d’informations que possible
• Persistence à court/moyen terme
• Analyse minimal et quasi-live
• Usage axé développement
ErrorMailerx
     e d u
   R
Idée Géniale #1


• Envoyons un mail à chaque exception Rails
Google tried to deliver your
  message, but it was rejected.
   The user you are trying to
            contact
is receiving mail at a rate
 that prevents additional
   messages from being
         delivered.
Hey !
Solution 1




MPW-C Compiler
 ”Too many errors
    on one line
  (make fewer)”
Solution 1I




    Jean Cocteau
 “Puisque ces mystères
 me dépassent, feignons
d'en être l'organisateur”
Une situation classique
irc://internal #infra


<rapportr> [prod][amz-prod-xx.fotonauts.net]
           [picor][exception][error]
           No route matches "/hello-world" with
           {:method=>:get}




      Notification dans notre canal IRC interne
irc://internal #infra
<rapportr> [prod][aws-prod-xx.fotonauts.net]
           [picor][exception][error]
           No route matches "/hello-world" with
           {:method=>:get}

           => http://xxx.fotonauts.net:5984/_utils/browse/
           document.html?infra-events/
           picor_exception_error_9b0b24e0-
           e817-012b-2ea4-12313800e821


      ... avec le lien vers un document CouchDB
Inclusion directe du hash généré par Rails dans CouchDB
Paris RailsCamp 2009
Paris RailsCamp 2009
function(doc) {
      if (doc['data']['env']['HTTP_X_FORWARDED_FOR']
           ==   "81.57.x.x, 127.0.0.1")
        emit(doc['date'], doc['message']));
    }




Définition ‘live’ d’une requête, conservable si besoin
Bono-bots
             Rails App          stomp   AMQP Exchange


                                                          amqp
                                             amqp


Toute action de haut niveau génère
un message sur notre système bus              Rapportr    bots   InfraLogger
asynchrone / agents de traitements
(bono-bots) pour gestion des
notifications utilisateurs, etc...                                   http
                                                 irc


On profite de la même
infrastructure pour véhiculer les            IRC Server          CouchDB
notifications d’exceptions.
Error “Mailer”
def self.deliver_exception(exception)
  evt = {
    :app     => 'picor',
    :type    => 'exception',
    :level   => 'error',
    :message => exception.message,
    :grid    => grid,
    :fqdn    => fqdn,
  }
  evt[:session][:params] = controller.params
  evt[:session][:env] = controller.request.env
  evt[:data][:backtrace] = exception.backtrace

  Bono::Bus::Infra.publish(Bono::Event.new(evt))
end
InfraBot - Couch
class InfraLogger < Bono::Bot::Service::Base
  def start
    options = {:queue => "#{Bono::Bot.uid}.service.infra_logger"}
    @queue = Bono::Bus::Infra.watch_events(options) do |event|
      infra_event_received(event)
    end
    super
  end

  # callback fired when an infra event is received
  def infra_event_received(event)
    # format document
    doc = event.to_hash
    doc['_id'] = doc.delete('uid')
    # save to CouchDB database
    Bono::Database::CouchDB.store_document_async('infra-events',
                                             doc, 'infra_logger')
  end
end
InfraBot - IRC
class IrcLogger < Bono::Bot::Service::Base
  def start
    @c = EventMachine::connect(IRC_SERVER, IRC_PORT, BonoIrc, self)
    @c {|conn| conn.send_data("JOIN #infran") }
    @c do |conn|
      options = {:queue => "#{Bot.uid}.service.irc_logger.infra_events"}
      @infra_events_queue = Bono::Infra.watch_events(options) do |e|
        infra_event_received(e)
      end
    end
  end

  # callback fired when an infra event is received
  def infra_event_received(e)
    send_message(“#infra”, e.to_s)
    send_message(“#infra”,
        "http://xxx:5984/_utils/browse/document.html?infra-events/#{e}")
  end
end
Idées en l’air

• Si plus de n erreur sur action par jour
  Entrer un bug automatiquement
• Si plus de n erreur sur user x
  Envoyer un mail d’investigation
• Si plus de n tentatives d’attaque
  Blacklister l’IP pour x heures
Logs globaux
Usage final

• Statistiques applicatif utilisateur
 • Page views, country views
• Search
 • Rating, ...
• Business metrics
Paris RailsCamp 2009
Paris RailsCamp 2009
Paris RailsCamp 2009
Paris RailsCamp 2009
Sources
• Frontaux Web
 • Varnish / Nginx / Lighttpd
• Rails
 • production.log
 • Log d’actions utilisateur haut niveau
• Divers logs infrastructure
 • mysql-slow.log, ...
Flot de traitement

• Acquérir les logs en place
• Store-n-forward
• Perennisation des logs bruts
• Traitement itératif des logs bruts
Flot de traitement

• Acquérir les logs en place : multitail
• Store-n-forward : Scribe
• Perennisation des logs bruts : S3
• Traitement itératif des logs bruts : Batchr
MySQL          High-level
Rails Log   HTTP Log
                                         Log           action log




             Multitail                     Multitail




              Scribe                       Scribe




                         ScribeServer
Outils externes
• EC2 / S3 : Amazon Web Services
• Hadoop: Framework Map/Reduce
• Hive: Data-mining sur Hadoop
• Scribe: logger distribué / hiérarchique
  basé sur
  Thrift: RPC bas niveau très efficace
ScribeServer           HDFS




                            Uploader            Hadoop/Hive




                               S3                Analyzer




                Business            Developer
Web front-end                                      Indexer
                 Metrics              Tools
Batchr
• Acquisition des données “historiques”
• Importation des données journalières en
  DFS Hadoop
 • Analyse des logs (GeoIP, comptage, ...)
• Update historique + journalière
• Réinjection S3
• Réinjection applicatif
Implémentation
• Gestion globale du batch par Rake
 • Gestion des instances EC2 (setup cluster
    hadoop, gestion de l’erreur)

 • Import/Export S3 ←→ HDFS
 • Extraction/Analyse avec Hadoop/HIVE
 • Réinjection dans l’applicatifs (Ruby DBI)
Hadoop EC2
• Réécriture du setup des images Hadoop-
  EC2 en rake
 • Boot d’une image Ubuntu standard
 • Configuration Rake Net::SSH::Multi
  • Download d’un hadoop standard
  • Drivé par le clustermaster via rake
hadoop_ec2:setup




hadoop_ec2:setup_os_instances          hadoop_ec2:mkfs




                                                     hadoop_ec2:local_execution_directory




                           hadoop_ec2:setup_hadoop




                                                 hadoop_ec2:run
hadoop_ec2:run




                                                        batchr:hadoop_setup




                       batchr:prepare_hive




batchr:dfs_accesslog                         batchr:dfs_buslog
                                                                              batchr:dfs_old_datasets
GeoIPCountryWhois.csv           batchr:dfs_ips




                         batchr:dfs_geoips




                          batchr:table_ips




                        batchr:table_update_datasets                      batchr:table_old_datasets




                                                  batchr:table_datasets
batchr:table_datasets




batchr:dfs_datasets                batchr:dfs_stats




batchr:s3_datasets                batchr:s3_stats




                            batchr:app_stats




           batchr:daily_attempt
“Stateful Rake”
• Rake
 • Expression des dépendances
 • Exécution manuelle d’une étape
• Avec des ajouts...
 • Etapes intermédiaires non fiables
 • Qu’est-ce qu’une tache terminée ?
class TaskOnce < Rake::Task
  def execute(args)
    time = Time.now
    begin
      super(args)
      File.open(".done."+ name, "w") do |o|
          o.puts(Time.now - time).to_s + "sn"
      end
    rescue Exception => e
      File.open(".fail."+ name, "w") { |o| o.puts e.inspect }
      raise e
    end
  end

  def needed?
    !File.exist?(".done." + name)
  end
end

def once(args, &block)
  TaskOnce.define_task(args, &block)
end
desc "extract unique ips from log"

once :dfs_ips => :table_accesslog do
  @hadoop.hive_string <<-HIVE, "dfs_ips"
  INSERT OVERWRITE DIRECTORY 'ips'
  SELECT distinct(remote_addr_int)
       FROM accesslog
       SORT BY remote_addr_int
  HIVE
end
desc "run me every day"
task :daily do
  begin
    Rake::Task["batchr:daily_attempt"].invoke
  ensure
    Rake::Task["batchr:cleanup"].invoke
  end
end


desc "run me every day, no cleanup on error"
task :daily_attempt => [ :pick_yesterday, :picor_stats,
                         :s3_datasets, :statr_datasets ]   do

end
Idées en l’air
• Vraie reprise sur panne (Cluster EC2)
• Réconciliation de logs
• Accès filtré à une fenêtre de logs
• Web Rake (monitoring, dashboard, ...)
• Frameworkiser EC2/Hadoop/Rake
• Prototypage des requêtes data-mining
 • Quid de l’usage/pertinence de Hive ?

Contenu connexe

KEY
Chef - Paris BlockCamp - Nov 09
PDF
TP1 Big Data - MapReduce
PDF
Riak introduction
PDF
Meetup Drupal Lyon mars 2013 - Optimiser les performances Drupal par le cache
KEY
L'avenir de LAMP
PDF
Oxalide Workshop #3 - Elasticearch, an overview
PDF
Stockage et analyse temps réel d'événements avec Riak chez Booking.com
PDF
EBIZNEXT-RIAK
Chef - Paris BlockCamp - Nov 09
TP1 Big Data - MapReduce
Riak introduction
Meetup Drupal Lyon mars 2013 - Optimiser les performances Drupal par le cache
L'avenir de LAMP
Oxalide Workshop #3 - Elasticearch, an overview
Stockage et analyse temps réel d'événements avec Riak chez Booking.com
EBIZNEXT-RIAK

Tendances (18)

PDF
REX Storm Redis
PDF
Configuration Management avec Drupal 8
PPTX
Monitoring applicatif : Pourquoi et comment ?
PDF
Paris stormusergroup intrudocution
PDF
Paris Kafka Meetup - Concepts & Architecture
PDF
Breizhcamp : Guide de survie du développeur dans une application (Java) qui rame
PDF
Perfug Guide de survie du développeur dans une application Java qui rame
PDF
Cassandra Ippevent 20 Juin 2013
PPT
201211 drupagora hostingdrupal
PDF
Mix it 2011 - Clojure
PDF
HADOOP + R
PDF
Grails from scratch to prod - MixIT 2011
PDF
Présentation de Apache Zookeeper
PPTX
Realtime Web avec Kafka, Spark et Mesos
PPTX
Chtijug springbatch 2011
PPTX
Paris JUG Spring Batch
PDF
Guide (un tout petit peu) pratique (et totalement subjectif) du stream proces...
PDF
Realtime Web avec Akka, Kafka, Spark et Mesos - Devoxx Paris 2014
REX Storm Redis
Configuration Management avec Drupal 8
Monitoring applicatif : Pourquoi et comment ?
Paris stormusergroup intrudocution
Paris Kafka Meetup - Concepts & Architecture
Breizhcamp : Guide de survie du développeur dans une application (Java) qui rame
Perfug Guide de survie du développeur dans une application Java qui rame
Cassandra Ippevent 20 Juin 2013
201211 drupagora hostingdrupal
Mix it 2011 - Clojure
HADOOP + R
Grails from scratch to prod - MixIT 2011
Présentation de Apache Zookeeper
Realtime Web avec Kafka, Spark et Mesos
Chtijug springbatch 2011
Paris JUG Spring Batch
Guide (un tout petit peu) pratique (et totalement subjectif) du stream proces...
Realtime Web avec Akka, Kafka, Spark et Mesos - Devoxx Paris 2014
Publicité

En vedette (20)

PPTX
Deck seo campus 2011 utiliser les logs serveurs
PDF
Le PHP chez Deezer
PPTX
AFUP - Mini conférences PHP - Les LOGs
PDF
Cci octobre 2014
PPTX
Drupal 8 + Elasticsearch + Docker
PDF
Plateforme centralisée d’analyse des logs des frontaux http en temps réel dan...
PPTX
Séminaire Log Management
PPT
SMSSI ITIL
PPTX
A la recherche d'ElasticSearch
PPTX
Analyse combinée crawl + logs - Search Foresight & Botify
PPT
Chapitre2 prise en_main_kibana
PDF
PPT
Chapitre3 elk concepts_avances
PPTX
IDS,SNORT ET SÉCURITÉ RESEAU
PDF
[Sildes] plateforme centralisée d’analyse des logs des frontaux http en temps...
PDF
Rapport projet pfe
PPTX
PPTX
ElasticSearch : Architecture et Développement
PPTX
Beginner's Guide to SIEM
KEY
Elasticsearch - Montpellier JUG
Deck seo campus 2011 utiliser les logs serveurs
Le PHP chez Deezer
AFUP - Mini conférences PHP - Les LOGs
Cci octobre 2014
Drupal 8 + Elasticsearch + Docker
Plateforme centralisée d’analyse des logs des frontaux http en temps réel dan...
Séminaire Log Management
SMSSI ITIL
A la recherche d'ElasticSearch
Analyse combinée crawl + logs - Search Foresight & Botify
Chapitre2 prise en_main_kibana
Chapitre3 elk concepts_avances
IDS,SNORT ET SÉCURITÉ RESEAU
[Sildes] plateforme centralisée d’analyse des logs des frontaux http en temps...
Rapport projet pfe
ElasticSearch : Architecture et Développement
Beginner's Guide to SIEM
Elasticsearch - Montpellier JUG
Publicité

Similaire à Paris RailsCamp 2009 (20)

PDF
Pourquoi rails est génial? (version longue)
PDF
Hadoop MapReduce - OSDC FR 2009
PDF
Snowcamp 2025 - Une architecture qui ne déraille pas
DOCX
Résumkbjnnbuhb.jhyhuhuhhhhhhhhhhhhhhhhhhhhhhhé.docx
PPTX
Nantes JUG - Traçabilité dans une architecture distribuée avec Node.js et Mon...
PPTX
Stats web avec Hive chez Scoop.it
PPT
Hadoop chez Kobojo
PDF
Introduction à Sinatra
PDF
Pourquoi Ruby on Rails est génial? (d'un point de vue non technique)
PDF
Présentation des services AWS
PDF
Je configure mes serveurs avec fabric et fabtools
PDF
Drupal et le NoSQL - drupagora 2011
PDF
(Tutoriel) Installer et Utiliser Huginn - Outil de veille open source
PDF
Hadoop prêt pour l'Entreprise
PPTX
Alan Poe appliqué au data streaming - toutes choses sont bonnes ou mauvaises ...
PPTX
presentationdesservices-161021100452.pptx
PPTX
Presentation des outils traitements distribues
PDF
Quelle place pour le framework Rails dans le développement d'application web
PDF
What’s Next Replay! Lyon 2011 - G. Darmont
PDF
I don't always write reactive application but when I do, it run on raspberry pi
Pourquoi rails est génial? (version longue)
Hadoop MapReduce - OSDC FR 2009
Snowcamp 2025 - Une architecture qui ne déraille pas
Résumkbjnnbuhb.jhyhuhuhhhhhhhhhhhhhhhhhhhhhhhé.docx
Nantes JUG - Traçabilité dans une architecture distribuée avec Node.js et Mon...
Stats web avec Hive chez Scoop.it
Hadoop chez Kobojo
Introduction à Sinatra
Pourquoi Ruby on Rails est génial? (d'un point de vue non technique)
Présentation des services AWS
Je configure mes serveurs avec fabric et fabtools
Drupal et le NoSQL - drupagora 2011
(Tutoriel) Installer et Utiliser Huginn - Outil de veille open source
Hadoop prêt pour l'Entreprise
Alan Poe appliqué au data streaming - toutes choses sont bonnes ou mauvaises ...
presentationdesservices-161021100452.pptx
Presentation des outils traitements distribues
Quelle place pour le framework Rails dans le développement d'application web
What’s Next Replay! Lyon 2011 - G. Darmont
I don't always write reactive application but when I do, it run on raspberry pi

Dernier (7)

PPTX
Souveraineté numérique - Définition et enjeux pour les entreprises et les dév...
PPTX
Presentation_Securite_Reseaux_Bac+2.pptx
PDF
Modems expliqués- votre passerelle vers Internet.pdf
PDF
FORMATION COMPLETE EN EXCEL DONE BY MR. NYONGA BRICE.pdf
PDF
FORMATION EN Programmation En Langage C.pdf
PDF
presentation_with_intro_compressee IEEE EPS France
PDF
Tendances tech 2025 - SFEIR & WENVISION.pdf
Souveraineté numérique - Définition et enjeux pour les entreprises et les dév...
Presentation_Securite_Reseaux_Bac+2.pptx
Modems expliqués- votre passerelle vers Internet.pdf
FORMATION COMPLETE EN EXCEL DONE BY MR. NYONGA BRICE.pdf
FORMATION EN Programmation En Langage C.pdf
presentation_with_intro_compressee IEEE EPS France
Tendances tech 2025 - SFEIR & WENVISION.pdf

Paris RailsCamp 2009

  • 1. Logs, exceptions, mails, et autres désagréments L’architecture de data-mining et de remontée d’erreurs chez Fotonauts Olivier Gutknecht Aymerick Jéhanne Mathieu Poumeyrol olg@fotonauts.com aymerick@fotonauts.com kali@fotonauts.com
  • 2. La Seule Vraie Question “euh , il s ’est p assé quoi, là ?”
  • 3. La Seule Vraie Réponse les LOGS
  • 5. Global et éternel • Toutes les machines • Sur tous les composants voulus • A tous les niveaux • Aussi longtemps que désiré • Analyse en batch • Usages applicatifs, business, métriques
  • 6. Local et focalisé • Axé sur les situations d’erreur • Sur quelques composants (Rails, Merb) • Autant d’informations que possible • Persistence à court/moyen terme • Analyse minimal et quasi-live • Usage axé développement
  • 7. ErrorMailerx e d u R
  • 8. Idée Géniale #1 • Envoyons un mail à chaque exception Rails
  • 9. Google tried to deliver your message, but it was rejected. The user you are trying to contact is receiving mail at a rate that prevents additional messages from being delivered.
  • 10. Hey !
  • 11. Solution 1 MPW-C Compiler ”Too many errors on one line (make fewer)”
  • 12. Solution 1I Jean Cocteau “Puisque ces mystères me dépassent, feignons d'en être l'organisateur”
  • 14. irc://internal #infra <rapportr> [prod][amz-prod-xx.fotonauts.net] [picor][exception][error] No route matches "/hello-world" with {:method=>:get} Notification dans notre canal IRC interne
  • 15. irc://internal #infra <rapportr> [prod][aws-prod-xx.fotonauts.net] [picor][exception][error] No route matches "/hello-world" with {:method=>:get} => http://xxx.fotonauts.net:5984/_utils/browse/ document.html?infra-events/ picor_exception_error_9b0b24e0- e817-012b-2ea4-12313800e821 ... avec le lien vers un document CouchDB
  • 16. Inclusion directe du hash généré par Rails dans CouchDB
  • 19. function(doc) { if (doc['data']['env']['HTTP_X_FORWARDED_FOR'] == "81.57.x.x, 127.0.0.1") emit(doc['date'], doc['message'])); } Définition ‘live’ d’une requête, conservable si besoin
  • 20. Bono-bots Rails App stomp AMQP Exchange amqp amqp Toute action de haut niveau génère un message sur notre système bus Rapportr bots InfraLogger asynchrone / agents de traitements (bono-bots) pour gestion des notifications utilisateurs, etc... http irc On profite de la même infrastructure pour véhiculer les IRC Server CouchDB notifications d’exceptions.
  • 21. Error “Mailer” def self.deliver_exception(exception) evt = { :app => 'picor', :type => 'exception', :level => 'error', :message => exception.message, :grid => grid, :fqdn => fqdn, } evt[:session][:params] = controller.params evt[:session][:env] = controller.request.env evt[:data][:backtrace] = exception.backtrace Bono::Bus::Infra.publish(Bono::Event.new(evt)) end
  • 22. InfraBot - Couch class InfraLogger < Bono::Bot::Service::Base def start options = {:queue => "#{Bono::Bot.uid}.service.infra_logger"} @queue = Bono::Bus::Infra.watch_events(options) do |event| infra_event_received(event) end super end # callback fired when an infra event is received def infra_event_received(event) # format document doc = event.to_hash doc['_id'] = doc.delete('uid') # save to CouchDB database Bono::Database::CouchDB.store_document_async('infra-events', doc, 'infra_logger') end end
  • 23. InfraBot - IRC class IrcLogger < Bono::Bot::Service::Base def start @c = EventMachine::connect(IRC_SERVER, IRC_PORT, BonoIrc, self) @c {|conn| conn.send_data("JOIN #infran") } @c do |conn| options = {:queue => "#{Bot.uid}.service.irc_logger.infra_events"} @infra_events_queue = Bono::Infra.watch_events(options) do |e| infra_event_received(e) end end end # callback fired when an infra event is received def infra_event_received(e) send_message(“#infra”, e.to_s) send_message(“#infra”, "http://xxx:5984/_utils/browse/document.html?infra-events/#{e}") end end
  • 24. Idées en l’air • Si plus de n erreur sur action par jour Entrer un bug automatiquement • Si plus de n erreur sur user x Envoyer un mail d’investigation • Si plus de n tentatives d’attaque Blacklister l’IP pour x heures
  • 26. Usage final • Statistiques applicatif utilisateur • Page views, country views • Search • Rating, ... • Business metrics
  • 31. Sources • Frontaux Web • Varnish / Nginx / Lighttpd • Rails • production.log • Log d’actions utilisateur haut niveau • Divers logs infrastructure • mysql-slow.log, ...
  • 32. Flot de traitement • Acquérir les logs en place • Store-n-forward • Perennisation des logs bruts • Traitement itératif des logs bruts
  • 33. Flot de traitement • Acquérir les logs en place : multitail • Store-n-forward : Scribe • Perennisation des logs bruts : S3 • Traitement itératif des logs bruts : Batchr
  • 34. MySQL High-level Rails Log HTTP Log Log action log Multitail Multitail Scribe Scribe ScribeServer
  • 35. Outils externes • EC2 / S3 : Amazon Web Services • Hadoop: Framework Map/Reduce • Hive: Data-mining sur Hadoop • Scribe: logger distribué / hiérarchique basé sur Thrift: RPC bas niveau très efficace
  • 36. ScribeServer HDFS Uploader Hadoop/Hive S3 Analyzer Business Developer Web front-end Indexer Metrics Tools
  • 37. Batchr • Acquisition des données “historiques” • Importation des données journalières en DFS Hadoop • Analyse des logs (GeoIP, comptage, ...) • Update historique + journalière • Réinjection S3 • Réinjection applicatif
  • 38. Implémentation • Gestion globale du batch par Rake • Gestion des instances EC2 (setup cluster hadoop, gestion de l’erreur) • Import/Export S3 ←→ HDFS • Extraction/Analyse avec Hadoop/HIVE • Réinjection dans l’applicatifs (Ruby DBI)
  • 39. Hadoop EC2 • Réécriture du setup des images Hadoop- EC2 en rake • Boot d’une image Ubuntu standard • Configuration Rake Net::SSH::Multi • Download d’un hadoop standard • Drivé par le clustermaster via rake
  • 40. hadoop_ec2:setup hadoop_ec2:setup_os_instances hadoop_ec2:mkfs hadoop_ec2:local_execution_directory hadoop_ec2:setup_hadoop hadoop_ec2:run
  • 41. hadoop_ec2:run batchr:hadoop_setup batchr:prepare_hive batchr:dfs_accesslog batchr:dfs_buslog batchr:dfs_old_datasets
  • 42. GeoIPCountryWhois.csv batchr:dfs_ips batchr:dfs_geoips batchr:table_ips batchr:table_update_datasets batchr:table_old_datasets batchr:table_datasets
  • 43. batchr:table_datasets batchr:dfs_datasets batchr:dfs_stats batchr:s3_datasets batchr:s3_stats batchr:app_stats batchr:daily_attempt
  • 44. “Stateful Rake” • Rake • Expression des dépendances • Exécution manuelle d’une étape • Avec des ajouts... • Etapes intermédiaires non fiables • Qu’est-ce qu’une tache terminée ?
  • 45. class TaskOnce < Rake::Task def execute(args) time = Time.now begin super(args) File.open(".done."+ name, "w") do |o| o.puts(Time.now - time).to_s + "sn" end rescue Exception => e File.open(".fail."+ name, "w") { |o| o.puts e.inspect } raise e end end def needed? !File.exist?(".done." + name) end end def once(args, &block) TaskOnce.define_task(args, &block) end
  • 46. desc "extract unique ips from log" once :dfs_ips => :table_accesslog do @hadoop.hive_string <<-HIVE, "dfs_ips" INSERT OVERWRITE DIRECTORY 'ips' SELECT distinct(remote_addr_int) FROM accesslog SORT BY remote_addr_int HIVE end
  • 47. desc "run me every day" task :daily do begin Rake::Task["batchr:daily_attempt"].invoke ensure Rake::Task["batchr:cleanup"].invoke end end desc "run me every day, no cleanup on error" task :daily_attempt => [ :pick_yesterday, :picor_stats, :s3_datasets, :statr_datasets ] do end
  • 48. Idées en l’air • Vraie reprise sur panne (Cluster EC2) • Réconciliation de logs • Accès filtré à une fenêtre de logs • Web Rake (monitoring, dashboard, ...) • Frameworkiser EC2/Hadoop/Rake • Prototypage des requêtes data-mining • Quid de l’usage/pertinence de Hive ?