Verteiltes Web-crawling mit Apache Spark - Ist es Möglich?
Eine interessante Frage von mir, wenn ich an einem interview über web mining. Die Frage war, ist es möglich zu Crawlen Websites mit Apache Spark?
Dachte ich, dass es möglich war, denn es unterstützt die verteilte Rechenleistung von Spark. Nach dem interview habe ich gesucht, aber konnte Sie nicht finden jede interessante Antwort. Geht das mit Spark?
- Versuchen Nutch. Dies scheint wie eine schlechte Idee übrigens. Spark ist ein compute engine. So etwas wie Akka oder LXD wenn Sie brauchen Container sind besser, wenn Sie zu verteilen an alle. Python ist eine furchtbar langsam, aber sehr gut durchdachte Sprache (ein paradox). Vielleicht sind Sie von dort herkommen. Ich bin die Erreichung von 1.000.000 Seiten pro Tag und pro Quelle mit einem einzigen Knoten laufen meine Ziege Grazer Pakete auf Github. Funke ist gut gebaut für Berechnungen, nicht aber die Vernetzung. github.com/asevans48. Ich Plane API support, Vertrieb; in der Regel schwerer als Scrapy.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wie etwa auf diese Weise:
Ihre Anwendung würde eine Reihe von Webseiten-URLs als Eingabe für die crawler, wenn Sie die nur eine normale app, Sie könnte es tun, wie folgt:
for example: you have to crawl www.example.com/news from 20150301 to 20150401, split results can be: [www.example.com/news/20150301, www.example.com/news/20150302, ..., www.example.com/news/20150401]
www.example.com/news/20150401
) zu einem einzigen thread, ist es in den threads, wo die wirklich Daten abrufen passiertWenn die Anwendung sich ein Funke ein, gleiche Prozedur passiert, aber Kapseln Zündkerzen Vorstellung: wir können eine CrawlRDD das gleiche tun Personal:
def getPartitions: Array[Partition]
ist ein guter Ort, um die split-Aufgabe.def compute(part: Partition, context: TaskContext): Iterator[X]
werden an alle verteilt, die Vollzieher Ihrer Anwendung parallel ausgeführt werden.Finale Programm sieht wie folgt aus:
Funke fügt im wesentlichen keinen Wert auf diese Aufgabe.
Sicher, Sie tun können, verteilte Crawlen, aber gut crawling-tools unterstützen bereits diese aus der box. Die Datenstrukturen zur Verfügung gestellt von Spark wie RRDs sind ziemlich nutzlos hier, und nur zum starten von crawl-jobs, könnten Sie nur verwenden, GARN, etc Sofort. direkt bei weniger Aufwand.
Sicher, Sie könnte dies auf Spark. Wie könnten Sie tun, ein Wort-Prozessor auf dem Funken, da ist es turing-vollständige... aber ist es nicht einfacher.
JA.
Überprüfen Sie heraus die open-source-Projekt: wunderkerze (Funke - crawler) https://github.com/USCDataScience/sparkler
Kasse Sparkler-Interna für ein flow - /pipeline-Diagramm. (Entschuldigung, es ist ein SVG-Bild konnte ich nicht hier posten)
Diesem Projekt war nicht verfügbar, wenn die Frage gepostet wurde, aber als der Dezember 2016 es ist eines der sehr aktive Projekte!.
Ist es möglich zu Crawlen Websites mit Apache Spark?
Die folgenden Stücke kann Ihnen helfen zu verstehen, warum jemand würde eine solche Frage stellen und auch helfen, Sie zu beantworten.
für eine web-Anwendung oder eine inkrementelle web-crawler
[1] http://dl.acm.org/citation.cfm?id=2228301
[2] http://nutch.apache.org/
PS:
Ich bin ein co-Schöpfer der wunderkerze und ein Committer, PMC für Apache Nutch.
Wenn ich wunderkerze, erstellte ich eine RDD, die ein proxy auf Solr/Lucene-basierte indizierte Speicherung. Es aktiviert unsere crawler-Datenbank-RDD zu asynchrone feinkörniges updates zu gemeinsamen Staat, die sonst nicht möglich nativ.
Gibt es ein Projekt, genannt SpookyStuff, die eine
Hoffe, es hilft!
Ich denke, dass die akzeptierte Antwort ist falsch, in einer grundlegenden Weise; real-life-großen web-Extraktion ist ein pull-Prozess.
Dies ist, weil oft anfordernden HTTP-Inhalten ist weit weniger aufwendig als das erstellen der Antwort. Ich habe gebaut, ein kleines Programm, welches in der Lage ist zu krabbeln 16 Millionen Seiten pro Tag mit vier CPU-Kernen und 3GB RAM, und das war noch nicht mal optimiert, sehr gut. Ähnliche server wie Last (~200 Anfragen pro Sekunde) ist nicht trivial und erfordert in der Regel viele Ebenen der Optimierung.
Echten web-Seiten kann zum Beispiel brechen Ihre cache-system, wenn Sie kriechen Ihnen zu schnell (anstatt beliebtesten Seiten im cache, kann es überflutet mit dem long-tail-Inhalte des Crawls). Also in diesem Sinne, einen guten web-scraper immer respektiert robots.txt etc.
Den wirklichen nutzen der verteilten crawler kommt nicht aus einer Aufteilung der workload einer domain, sondern von der Aufteilung der work load von vielen Domänen zu einer einzelnen verteilten Prozess so, dass der eine Prozess kann sicher erfassen, wie viele Anforderungen das system stellt durch.
Natürlich in einigen Fällen soll der bad boy und Schrauben Sie die Regeln; jedoch, meiner Erfahrung nach, werden solche Produkte nicht lange am Leben bleiben, da der web-Website-Besitzer schützen Ihr Vermögen von Dingen, die Aussehen wie DoS-Attacken.
Golang ist sehr gut für das erstellen von web-scrapern, denn er hat die Kanäle als nativen Datentyp und Sie unterstützen pull-queues sehr gut. Da das HTTP-Protokoll und das kratzen im Allgemeinen langsam ist, können Sie unter anderem die Gewinnung, die Rohrleitungen als Teil des Prozesses, die untere die Menge der zu speichernden Daten in das data warehouse-system. Sie krabbeln kann einen TB mit Ausgaben von weniger als $1 im Wert von Ressourcen und tun es schnell, wenn mit Golang und Google Cloud (wahrscheinlich in der Lage zu tun, mit AWS und Azure auch).
Funke gibt dir keinen Mehrwert. Mit
wget
als client ist clever, da es automatisch Respekt robots.txt richtig: parallel-domain-specific-pull-queue zu wget ist der Weg zu gehen, wenn Sie arbeiten Professionell.