libro - El rastreo web distribuido con Apache Spark: ¿es posible?
spark batch (4)
¿Qué tal esta manera?
Su aplicación obtendría un conjunto de URL de sitios web como entrada para su rastreador, si está implementando solo una aplicación normal, puede hacerlo de la siguiente manera:
- divida todas las páginas web para ser rastreadas en una lista de sitios separados, cada sitio es lo suficientemente pequeño como para caber en un solo hilo,
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]
- asigna cada url base (
www.example.com/news/20150401
) a un único hilo, está en los hilos donde ocurre realmente la obtención de datos - guarde el resultado de cada hilo en FileSystem.
Cuando la aplicación se convierte en una chispa, el mismo procedimiento ocurre pero se encapsula en la noción de chispa: podemos personalizar un CrawlRDD para hacer el mismo personal:
- Dividir sitios:
def getPartitions: Array[Partition]
es un buen lugar para realizar la tarea dividida. - Subprocesos para rastrear cada división:
def compute(part: Partition, context: TaskContext): Iterator[X]
se extenderá a todos los ejecutores de su aplicación, ejecutados en paralelo. - guarde el rdd en HDFS.
El programa final se ve así:
class CrawlPartition(rddId: Int, idx: Int, val baseURL: String) extends Partition {}
class CrawlRDD(baseURL: String, sc: SparkContext) extends RDD[X](sc, Nil) {
override protected def getPartitions: Array[CrawlPartition] = {
val partitions = new ArrayBuffer[CrawlPartition]
//split baseURL to subsets and populate the partitions
partitions.toArray
}
override def compute(part: Partition, context: TaskContext): Iterator[X] = {
val p = part.asInstanceOf[CrawlPartition]
val baseUrl = p.baseURL
new Iterator[X] {
var nextURL = _
override def hasNext: Boolean = {
//logic to find next url if has one, fill in nextURL and return true
// else false
}
override def next(): X = {
//logic to crawl the web page nextURL and return the content in X
}
}
}
}
object Crawl {
def main(args: Array[String]) {
val sparkConf = new SparkConf().setAppName("Crawler")
val sc = new SparkContext(sparkConf)
val crdd = new CrawlRDD("baseURL", sc)
crdd.saveAsTextFile("hdfs://path_here")
sc.stop()
}
}
Una pregunta interesante que me hicieron cuando asistí a una entrevista sobre minería web. La pregunta era, ¿es posible rastrear los sitios web utilizando Apache Spark?
Supuse que era posible, porque admite la capacidad de procesamiento distribuido de Spark. Después de la entrevista busqué esto, pero no pude encontrar ninguna respuesta interesante. ¿Es eso posible con Spark?
Spark no agrega esencialmente ningún valor a esta tarea.
Claro, puede hacer el rastreo distribuido, pero las buenas herramientas de rastreo ya lo soportan de la caja. Las estructuras de datos proporcionadas por Spark, como los RRD, son bastante inútiles aquí, y solo para iniciar trabajos de rastreo, puedes usar YARN, Mesos, etc. directamente con menos sobrecarga.
Claro, podrías hacer esto en Spark. Al igual que podría hacer un procesador de textos en Spark, ya que está completo ... pero no es más fácil.
Hay un proyecto, llamado SpookyStuff , que es un
Motor de consulta escalable para desguace web / mashup de datos / aceptación QA, impulsado por Apache Spark
¡Espero eso ayude!
SÍ.
Mira el proyecto de código abierto: Sparkler (spark - crawler) https://github.com/USCDataScience/sparkler
Check Out Sparkler Internals para un diagrama de flujo / tubería. (Disculpas, es una imagen SVG no pude publicarlo aquí)
Este proyecto no estaba disponible cuando se publicó la pregunta, sin embargo, desde diciembre de 2016 ¡es uno de los proyectos más activos !.
¿Es posible rastrear los sitios web utilizando Apache Spark?
Las siguientes piezas pueden ayudarlo a comprender por qué alguien haría esa pregunta y también le ayudaría a responderla.
- Los creadores de Spark framework escribieron en el artículo seminal [1] que los RDD serían menos adecuados para las aplicaciones que realizan actualizaciones asíncronas de gran precisión al estado compartido, como un sistema de almacenamiento para una aplicación web o un rastreador web incremental.
- Los RDD son componentes clave en Spark. Sin embargo, puede crear aplicaciones tradicionales de reducción de mapas (con poco o ningún abuso de RDD)
- Hay un rastreador web distribuido muy popular llamado Nutch [2]. Nutch está construido con Hadoop Map-Reduce (de hecho, Hadoop Map Reduce se extrajo de la base de código de Nutch)
- Si puede hacer alguna tarea en Hadoop Map Reduce, también puede hacerlo con Apache Spark.
[1] http://dl.acm.org/citation.cfm?id=2228301
[2] http://nutch.apache.org/
PD: soy un cocreador de Sparkler y un Committer, PMC para Apache Nutch.
Cuando diseñé Sparkler, creé un RDD que es un proxy para el almacenamiento indexado basado en Solr / Lucene. Permitió que nuestro RDD de crawler-databse realizara actualizaciones asíncronas de finegrained a estado compartido , que de otro modo no sería posible de forma nativa.