Control de Concurrencia sobre ı́ndices invertidos Carolina Bonacic Mauricio Marı́n Departamento Cs. Computación, Universidad de Chile Departamento de Computación, Universidad de Magallanes, Chile * Abstract Basado en una estrategia de control de concurrencia para ı́ndices invertidos, en el presente artı́culo se discute la introducción de una nueva operación sobre el ı́ndice; este proceso esta basado en el modelo de computaci ón paralela BSP. Además, se analiza la eficiencia y balance de los procesadores bajo este contexto. 1. Introducción Una arquitectura para máquinas de búsqueda en la Web, presenta una serie de componetes básicos; entre ellos se encuentran el: crawler (recorre la Web buscando las páginas a indexar), indexador (mantiene un ı́ndice con esa información), máquina de consultas (realiza las búsquedas en el ı́ndice) y la interfaz (interactúa con el usuario). Bajo este contexto, un indexador para la Web usualmente esta construido por variantes del ı́ndice invertido [1], que son populares estructuras de datos frecuentemente usadas en bases de datos textuales. Estan formados por un conjunto de términos del texto y una lista de documentos donde aparecen éstos. En muchos casos, por bueno que sea el algoritmo de indexación, no es suficiente para: texto demasiado grande; la frecuencia de actualización es muy alta; llegan muchas consultas por segundo; la velocidad de los discos no está creciendo al ritmo necesario. Una alternativa a esto es utilizar paralelismo; frente a este punto se trabajó con el modelo de computación paralela BSP [8, 9], donde es factible expandir la capacidad de procesamiento tanto como se quiera. El caso tı́pico es tener operaciones de sólo lectura sobre el ı́ndice. Sin embargo, en aplicaciones tales como servicios de noticias es deseable poder incluir nuevo texto a medida que se generan nuevas noticias y mezclar este proceso con las consultas de lectura de los usuarios. Esto trae consigo un problema de concurrencia sobre el ı́ndice. Recientemente en [7] se ha encontrado un algoritmo eficiente de control de concurrencia para ı́ndices invertidos. El algoritmo propuesto en [7] permite realizar las operaciones de lectura y escritura de manera eficiente y toma ventaja de la propiedad de sincronización global de procesadores que aporta BSP. Bajo este criterio, el presente artı́culo abordará la inclusión de una nueva operación sobre el ı́ndice, la cual tiene relación con la eliminación concurrente de texto. 2. Modelo BSP para computación paralela El modelo BSP puede ser visto como un modelo de programación, donde se describe el punto de vista del programador del sistema distribuido o paralelo, o como un modelo de computación utilizado en el diseño de algoritmos, el cual tiene asociado un modelo de costos. * Contact e-mail: [email protected] La idea fundamental de BSP [8, 9], es la división entre computación y comunicación. Se define un sstep como una operación básica que se realiza sobre datos locales de un procesador. Todo programa BSP consiste en un conjunto de estos pasos, denominados superstep, en los cuales, existe una fase de computación local independiente, le sigue una fase global de comunicaciones y finalmente una sincronización por barrera que permite separar los diferentes superstep. Un acercamiento más común a la programación BSP, es la programación imperativa SPMD (Single Program Multiple Data) con funcionalidades de BSP provistas por llamadas a librerı́as, donde un programa BSP es iniciado por el usuario en una máquina, y luego este programa se duplica automáticamente en las máquinas restantes que conforman la red. Cada uno ejecuta el mismo código pero con sus datos locales. Entre las librerias más comunes se encuentran: BSP lib [4] ó BSP pub [6] El costo en tiempo de un programa en BSP esta dado por una suma acumulativa de costos en cada superstep y el costo de cada superstep, el la suma de los parámetros: w, h, g y l, donde w es el máximo de computación por cada procesador, h es el máximo de mensajes enviados/recibidos por cada procesador con cada palabra costando g unidades de tiempo, y l es el costo de una sincronización por barrera en el procesador. El efecto de la arquitectura del computador esta incluida en los parámetros g y l, relacionados en función de p. Estos valores permiten que la velocidad de los procesadores s pueda ser empı́ricamente determinada [8]. 3. Trabajo Previo El desarrollo de este trabajo es parte del diseño de un buscador basado en una estrategia de crawling [3] y en un ı́ndice invertido [7]. Se ha mostrado experimentalmente en [3] que aquellas estrategias que recorren el grafo de la Web aplicando la táctica de recorrido por profundidad, son capaces de recuperar las páginas relevantes casi tan eficientemente como las basadas en métodos mas complejos y de gran costo en tiempo computacional como el llamado page-rank. Los documentos recuperados durante el proceso de crawling son indexados para luego ser puestos al servicio de un buscador como google [5]. El proceso de crawler [2], comienza trabajando con un conjuto de páginas raiz (home page), descargándolas y extrayendo sus enlaces. La estratégia del scheduler esta basada en una cola de prioridad donde los nodos representan los sitios y las prioridades estan dadas por las páginas asociadas a los sitios. Por cada nodo-sitio se tiene otra cola donde se mantiene la página que determina la prioridad del nodo en ese sitio. En el proceso de simulación del scheduler, se escoge el website desde la cola de sitios web y se envia la información de esos sitios al módulo que simulará la descarga de páginas desde el websitie. La idea de este diseño es tener un crawler que sea capaz de procesar rápidamente los documentos que va recibiendo y a la vez reducir el tiempo requerido para indexar los resúmenes de cada documento. Mas aún, es deseable que a medida que se generan los nuevos resúmenes de documentos estos se pongan a disposición de los usuarios del buscador inmediatamente y de manera concurrente. Todo esto para hacer que las respuestas a los usuarios del buscador hagan referencia a copias lo más recientes posible de los respectivos documentos disponibles en la Web. Una combinación de crawler y buscador concurrente puede sin dudas reflejar de mejor manera los requerimientos de la Web, los cuales se caracterizan por ser un sistema altamente dinámico y de rápido crecimiento (las páginas aparecen y desaparecen de manera indeterminada). 4. Listas Invertidas Como se mencionó, una lista invertida es la estructura de datos más elemental para la recuperación de palabras [1]. Se caracterisa por tener operaciones de solo lectura, pero en aplicaciones más especı́ficas como en sistemas de noticias, se importante manejar las actualizaciones de los documentos. El proceso de actualización o eliminación de documentos, tiene relación con los resúmenes recuperados por el proceso de crawling. Para realizar esta acción, primero se debe verificar si existe una versión antigua de ese documento en el ı́ndice. Si ese es el caso, se elimina ésta y luego se inserta la nueva versión. Antes se recorre el documento antiguo para obtener las palabras de su vocabulario y luego se debe ir a las respectivas listas invertidas asociadas a ese vocabulario, para remover las referencias del documento antiguo. El broker deberı́a enviar la eliminación e inserción del documento de manera consecutiva para que entremedio no exista una consulta de lectura que pase por alto la existencia del documento siendo insertado/eliminado. 4.1. Implementación del Algoritmo El ı́ndice general se encuentra distribuido de manera uniforme en los p procesadores. A cada procesador se le entrega un conjunto de instrucciones a ejecutar. El proceso de lectura de consulta e indexaciones de documentos, finaliza, cuando ya no se envı́an más instrucciones a los procesadores. En la rutina principal, se extraen los mensajes de la cola de entrada y dependiendo del tipo, se envia al método que corresponde: void Procesador::run() { Mensaje *m; while( msgin->empty() == false) { // Extrae el siguiente mensaje de la Cola. m = (Mensaje*)msgin->top(); msgin->pop(); switch(m->tipo) { case MSG_QUERY: // manejo de consultas de lectura. case MSG_QUERY_1: // punto de acceso al indice general. case MSG_QUERY_2: // ranking final runQUERY(m); break; case MSG_INDEX: case MSG_INDEX_1: // insercion de un nuevo documento. // punto de acceso al indice general. runINDEX(m); break; default: printf("ERROR switch - Procesador::run()\n"); } } // while } // fin de run() Consultas tipo Lectura supersteps. Llega una consulta que debe ser resuelta utilizando el ı́ndice general. Esto toma tres Superstep1 Para cada query de p , ésta se divide s en términos. Cada término se distribuye de manera uniforme entre los p procesadores: H(s ) = p Superstep2 De cada término recibido, se busca su repectiva listas invertida desde el ı́ndice general. De cada una de estas listas, se extraen los K mejores elementos. Toda la información recuperada en los pasos anteriores, es enviada al procesador que separó los términos de la consulta. En esta etapa tanto las lecturas (consultas) como las escrituras (inserción de documentos) se deben sincronizar por medio de un timestamps. Superstep3 Una vez verificado que han llegado todos los términos de la consulta al procesador actual, se realiza el proceso de ranking. Se entrega los k documentos de respuesta al usuario. Consultas tipo Escritura Llega una solicitud para indexar un documento, ya sea nuevo o una actualización del mismo, equivalente a la eliminación de un documento. Primero se indexa el documento solo y luego se actualiza el ı́ndice general. Este proceso toma dos supersteps: Superstep1 Del documento a indexar, se forma su ı́ndice particular. Por cada w del ı́ndice, se obtiene su lista invertida. Se envia al p la palabra w más su respectiva lista invertida. Superstep2 for(w[i] de P[i]) { if(archivo ya indexado) { if(w[i] esta en el indice general) se descarta w[i] else insertaIndiceGeneral(w[i] + lista invertida) } else actualizaIndiceGeneral(w[i] + lista invertida) } insertaIndiceGeneral: almacena en el ı́ndice general w más su lista invertida. actualizaIndiceGeneral: si w ya se encuentra en el ı́ndice, se aumenta su frecuencia; sino se inserta w más su lista invertida. 5. Resultados Empı́ricos El objetivo de realizar una serie de experimentos y mediciones sobre el algoritmo propuesto, es para verificar que los tiempos de respuesta disminuyen a medida que se trabaja con más procesadores. Además es necesario, ver la carga de trabajo de cada máquina, i.e., que haya un buen balance de carga. De las operaciones ejecutadas sobre el ı́ndice invertido, la más reelevante a medir es la escritura, principalmente porque en ella se manipula el ı́ndice general y la cantidad de información que se maneja es mucho más alta, por lo ésta abarca un tiempo mayor de ejecución. Las mediciones se efectuaron sobre una colección de texto xml y se ejecutaron del orden de 90.000 consultas por cada procesador. La figura 1 muestra el tiempo promedio de ejecución de un conjunto de consultas de tipo escritura. Claramente se puede apreciar que los tiempos de ejecución del algoritmo paralelo van disminuyendo a medida que aumenta la cantidad de consultas; además, los tiempos decrecen mientras mayor sea el número de procesadores que trabajan, esto trae como consecuencia poder afirmar, que el algoritmo paralelo propuesto es escalable. Sumado a lo anterior, la figura 2 muestra la eficiencia de procesar el mismo número de consultas analizado anteriormente, es quiere decir, que los procesadores trabajan en promedio lo mismo. Además de analizar el tiempo de ejecución, es necesario examinar que ocurre con la cantidad de mensajes que se transmite por superstep en cada procesador. De acuerdo a lo observado en la figura 3, el trabajo realizado en cada máquina tiende a 1, lo que implica que la distribución de mensajes esta correcta, i.e., existe un buen balance de carga, los procesadores reciben en promedio la misma cantidad de mensajes a ejecutar. 600 500 P= 1 P= 4 P= 8 P= 16 Tiempo de Ejecucion 400 300 200 100 0 0 0.1 0.2 0.3 0.4 Porcentaje Escrituras 0.5 0.6 0.7 0.6 0.7 Figura 1. Tiempos de Ejecución 1 0.8 Eficiencia 0.6 P= 4 P= 8 P= 16 0.4 0.2 0 0 0.1 0.2 0.3 0.4 Percentaje Escrituras 0.5 Figura 2. Tamaño de los mensajes 1 0.8 Eficiencia 0.6 P= 4 P= 8 P= 16 0.4 0.2 0 0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 Porcentaje Escrituras Figura 3. Balance de carga 6. Conclusiones Con el incremento de la Web, es deseable tener una arquitectura de máquinas de búsqueda capaz de entregar y procesar información de forma eficiente y rápida. Para ello, en este trabajo se analizó el comportamiento del indexador, al momento de recibir información por parte del crawler. Este le enviaba los resúmenes extraidos de las páginas recuperadas (operación equivalente a una escritura) y a su vez recibia las consultas hechas por los usuarios (lecturas). Los datos obtenidos, muestran que el algoritmo paralelo aquı́ planteado entrega óptimos resultados, principalmente por la disminusión de los tiempos de respuesta al usuario. El trabajar con un número considerable de procesadores, refleja que el algoritmo es escalable y se verifica tambien que la distribución de trabajo en cada procesador se encuentra bien balanceada. Por lo tanto, es factible mantener una arquitectura de máquinas de búsqueda, donde el trabajo del indexador sea entregar páginas más frescas al usuario debido al manejo de la concurrencia de las consultas. Referencias [1] R. Baeza-Yates and B. Ribeiro. Modern information retrieval. Addison-Wesley, 1999. [2] C. Castillo and R. Baeza-Yates. A new model for web crawling. 2000. [3] C. Castillo, M. Marı́n, A. Rodriguez, and R. Baeza-Yates. Scheduling algorithms for web crawling. To be submitted, 2004. [4] http://www.bsp worldwide.org. Bsp and worldwide standard. [5] http://www.google.com. Google search engine. [6] http://www.uni paderborn.de/bsp. Bsp pub library at paderborn university. [7] M. Marı́n. Fats concurrency control algorithm for inverted files. To be submitted, 2004. [8] D.B. Skillicorn, J.M.D. Hill, and W.F. McColl. Questions and answers about BSP. Technical Report PRGTR-15-96, Computing Laboratory, Oxford University, 1996. Also in Journal of Scientific Programming, V.6 N.3, 1997. [9] L.G. Valiant. A bridging model for parallel computation. Comm. ACM, 33:103–111, Aug. 1990.