FRAGMENTACIÓN VERTICAL Y ASIGNACIÓN SIMULTANEA EN BDD USANDO ALGORITMOS GENÉTICOS. Edmundo Taddei Zavala Departamento de Ingeniería Civil y Minas Universidad de Sonora Hermosillo, Sonora, México [email protected] Ángel Kuri Morales Centro de Investigación en Computación Instituto Politécnico Nacional México D. F. [email protected] Resumen. La tecnología actual favorece el uso y aplicación de las bases de datos distribuidos (BDD): aquellas BDs en las que la información se encuentra en sitios geográficamente separados. El diseño de la distribución (la fragmentación de las relaciones y su asignación a los sitios de la red) es una de las tareas más complejas involucradas en el diseño de una BDD y, típicamente, no se hace de manera automática. En este trabajo se presenta un Algoritmo Genético (AG) que se aplica a tal diseño. El AG ataca, simultáneamente, el problema de fragmentar verticalmente y asignar los fragmentos a los sitios de manera óptima. La naturaleza evolutiva del AG permite resolver en paralelo la fragmentación y la asignación: problemas que guardan una relación no lineal entre ellos. Palabras clave: Bases de Datos, Distribución, Fragmentación, Algoritmos Genéticos. 1. INTRODUCCIÓN. El diseño de BDDs incluye, además de los problemas de diseño clásicos de bases de datos centralizadas, el problema del diseño de la distribución, cuyo propósito es mejorar el rendimiento global del sistema. El diseño de la distribución, a su vez, está compuesto de la fragmentación y de la asignación de los fragmentos a los diversos sitios de la red. La fragmentación es el proceso mediante el cual una relación global es descompuesta en fragmentos horizontales y/o verticales. Un fragmento vertical atiende al agrupamiento de datos en función de atributos o conjuntos de ellos, mientras que la fragmentación horizontal atiende a dicho agrupamiento en función de tuplas o conjuntos de tuplas. La asignación, por su parte, se refiere al problema de ubicar los fragmentos (ya sean verticales u horizontales) de manera que el acceso a la información se haga de la “mejor” manera posible. Típicamente, los criterios que determinan si la fragmentación y la asignación son óptimas se establecen de manera independiente. Por ello, es frecuente que se trate de optimizar1 en dos pasos. En el primero se busca la “mejor” fragmentación y, en el segundo, se busca la “mejor” ubicación de los fragmentos obtenidos en el paso anterior [CERI84]. La aplicación de un AG permite, entre otras cosas, la optimización simultánea de los criterios de fragmentación de distribución sin presumir independencia de dichos criterios. En este artículo reportamos resultados que se refieren solamente a la fragmentación vertical y a la asignación de dichos fragmentos. La partición vertical es el paso en el cual una relación es dividida en grupos de atributos llamados fragmentos verticales [OZSU97]. La fragmentación vertical de las relaciones, tradicionalmente, se puede hacer desde dos perspectivas diferentes. Una de ellas parte de considerar que todos los atributos están ubicados en un fragmento único y éste se va dividiendo sucesivamente de acuerdo con algún criterio (típicamente heurístico). La otra, supone que cada atributo es un fragmento y a éstos los va agrupando de manera sucesiva de acuerdo también con algún heurístico. Formulado de esta manera, el problema parece ser bastante sencillo. Sin embargo, la metodología propuesta tiene dos limitantes fundamentales. En primer lugar, que el número de posibles soluciones crece exponencialmente con el número de atributos. Por ejemplo, en una relación con 10 atributos, el número de subconjuntos disjuntos que se pueden tener, esto es, el número de fragmentos verticales posibles es de 115, 975. (En una relación de m atributos el número de formas en que pueden éstos ser agrupados está definido por el número de Bell B(m). B(m), se acerca a mm para una m suficientemente grande). En segundo lugar los algoritmos de este estilo usados en la práctica (genéricamente llamados algoritmos best-first) asumen independencia de los eventos considerados. Esta suposición es, en general, inválida; se apela a ella a falta de mejores alternativas. El propósito de la distribución es mejorar el rendimiento global del sistema por lo que tanto la fragmentación como la ubicación de los fragmentos en la red deben estar fuertemente ligados con los requerimientos del sistema mismo. Esto es, las decisiones de qué fragmentos formar y dónde ubicarlos deben ser tomadas de acuerdo con el uso que las diferentes transacciones induzcan en los atributos de la relación [NAVA89]. El resto del trabajo está organizado como sigue: en la sección 2 se comentan los trabajos relacionados. En la sección 3 se expone el algoritmo genético utilizado para la solución el problema. En la sección 4 se presentan los resultados experimentales obtenidos. En la quinta y última sección se incluyen las conclusiones. 2. TRABAJOS RELACIONADOS. El problema de la distribución en BDD ha sido abordado de muchas formas. Así, este problema ha sido modelado como el problema de asignación de archivos, el cual establece, como una premisa, la prohibición de fragmentar las relaciones (en este caso tratadas como 1 Utilizaremos el término “optimizar” y sus derivados para denotar la búsqueda y posible determinación del mejor valor o conjunto de valores en un espacio finito de posible soluciones atendiendo a una medida de desempeño claramente especificada. archivos) y el problema se reduce a asignar las relaciones completas sobre los sitios de la red, con el propósito de minimizar el costo total de accesos locales y remotos [BELL92]. Sin embargo, como se establece en la literatura, esta aproximación no modela correctamente el problema de BDD ya que considerar las relaciones como archivos individuales es inconveniente dado que no representan una unidad de asignación apropiada [APER88]. Un estudio detallado sobre el problema de la asignación de archivos se encuentra en [DOWD82]. En otras propuestas se asume que la fragmentación ha sido realizada como un paso previo a la asignación de los fragmentos. El problema de la fragmentación puede verse en detalle en [CERI84, OZSU97]. En [BRUN94] se asume que las relaciones pueden ser fragmentadas de alguna manera natural en varios bloques de tamaño fijo o grupos de tuplas y el problema reside en dónde ubicar esos fragmentos. Para ello, el algoritmo propuesto, mantiene un contador del número de accesos de cada uno de los sitios a cada uno de los bloques. El contador de accesos a un bloque es actualizado con cada una de las transacciones que accede a una tupla en ese bloque. El bloque o fragmento es asignado al sitio con mayor número de accesos a ese bloque. Un examen del contador de accesos a cada bloque a intervalos regulares, permite hacer una reasignación dinámica de los fragmentos en respuesta a patrones de accesos cambiantes con el tiempo. Ceri y Pelagatti [CERI84] proponen un conjunto de criterios generales para la asignación de fragmentos tomando en cuenta la diferencia de considerar la réplica de datos o no y una medida de costo y beneficio de la asignación de fragmentos es dada en cada caso. Apers [APER88], propone un esquema de fragmentación como el expuesto previamente si una función de costo (tal como el costo de comunicación) será minimizada. A ello le agrega una partición horizontal aleatoria que permita un mayor paralelismo si una función de rendimiento (tal como el tiempo promedio de respuesta) será optimizada. Para minimizar el costo total de transmisión, propone dos esquemas de evaluación de la solución: una basada en árboles de decisión y la otra en un algoritmo voraz (greedy). Un algoritmo de partición vertical de relaciones en BDD con el propósito de maximizar el procesamiento de transacciones locales es propuesto en [NAVA84] y un algoritmo gráfico para la partición vertical en diseño de bases de datos, se desarrolla en [NAVA89]. En [PERE97] se considera que los atributos de una relación, al ubicarse en un nodo dado, formarán el conjunto de elementos del fragmento vertical de la relación en dicho nodo. Además, señalan, se formula una función objetivo sencilla que permite ubicar o reubicar los atributos de la relación en los nodos de la red de manera óptima, minimizando los costos de comunicación. Una extensión del algoritmo anterior es presentada en [PERE99] donde a la función objetivo anterior se le agregan los términos necesarios para considerar el costo de acceder a un fragmento y el costo de almacenar un fragmento en un sitio determinado. En [SHEP95] se utiliza una aproximación de dos fases, las cuales consisten en: 1) formar cúmulos de fragmentos y 2) asignar los cúmulos de fragmentos sobre los nodos de la red. En los trabajos de [CHAK92 y MUTH93] se propone un algoritmo de fragmentación vertical. Aquí el propósito es minimizar los accesos remotos y maximizar los accesos locales sin considerar la réplica de datos. En otras palabras, se pretende que cada sitio sea capaz de procesar las transacciones localmente con un mínimo de accesos a datos localizados en sitios remotos. La meta es lograr un costo de procesamiento mínimo para cualquier transacción originada en cualquier sitio. [SMIT97] reporta los resultados obtenidos de aplicar un algoritmo genético al algoritmo propuesto por [CHAK92 y MUTH93]. 3. UN ALGORITMO GENÉTICO PARA LA FRAGMENTACIÓN VERTICAL Y ASIGNACIÓN SIMULTANEA EN BDD. El algoritmo genético diseñado para la fragmentación vertical y asignación simultanea en BDD (al que llamaremos AGEP), consta de los siguientes cinco componentes: 3.1. Representación de las soluciones. Cuando se fragmenta de manera vertical se tienen B(m) formas distintas de dividir una relación de m atributos. Cada una de esas opciones tiene que ser representada con una cadena de longitud finita sobre algún alfabeto finito [GOLD89], tomando en cuenta las características del problema que se está resolviendo. En este caso los atributos de una relación y el sitio al cual serán asignados éstos deben ser codificados. Para ello, un vector de enteros de longitud igual al número de atributos de la relación será utilizado para representar las posibles soluciones del problema. Este vector tendrá enteros entre 1 y N, donde N indica el número de sitios en la red. De esta manera el vector siguiente representa una posible solución, si consideramos una relación con 10 atributos y una red con 5 sitios. (5 2 4 3 1 3 3 5 2 4) La propuesta de solución anterior debe ser interpretada de la forma siguiente. La posición de vector indica el atributo y los componentes del vector los sitios. Por lo tanto, la solución previa nos dice que la fragmentación y asignación a los sitios respectivos debe ser de acuerdo a la tabla siguiente Sitio 1 2 3 4 5 Atributos en el Fragmento 5 2 4 3 1 9 6 10 8 7 Esta representación es adecuada para este problema ya que la solución incluye tanto la división de la relación en subrelaciones como su asignación a un sitio de la red simultáneamente. 3.2. Población inicial. A diferencia de las técnicas de optimización tradicionales, que basan el proceso de búsqueda del óptimo sobre puntos (es decir, ésta avanza de un punto a otro) los AG buscan la solución pasando de un conjunto de puntos a otro. A cada punto se le llama individuo y al conjunto de puntos se le llama población y es necesario crear una población inicial para el arranque del algoritmo genético. Esta población inicial, generalmente, se crea de manera aleatoria. Para la solución de este problema, un conjunto de vectores enteros como el de la sección 3.1 fue creado para iniciar el algoritmo. 3.3. Función de evaluación. La función de evaluación, también llamada función objetivo, establece una clasificación de los individuos de la población asignándole a cada uno ellos una calificación de acuerdo a su mérito (fitness) [MICH94]. Es decir, los individuos que mejor se comportan obtienen una calificación mayor que aquellos que actúan pobremente. La función objetivo, se define en función de la tarea de optimización que se desea realizar. En este caso, el objetivo de fragmentar y asignar fragmentos es la minimización de los accesos remotos y la maximización de los accesos locales. La función de evaluación propuesta por [MUTH93] EP(i) = EM2 + ER2 evalúa las propuestas de solución con dos términos. El primero de ellos calcula el costo de acceder a atributos locales irrelevantes, mientras que el segundo calcula el costo de acceder a atributos remotos relevantes y para ello usa la matriz de uso de atributos (MUA). La función objetivo usada en este algoritmo es fitness(i) = C – EP(i) En esta ecuación fitness(i) es la calificación asignada a la i-ésima solución propuesta y C es una constante suficientemente grande para evitar fitness negativos. 3.4. Operadores genéticos. Los AG utilizan un conjunto de operadores genéticos para recombinar la población. La recombinación de la población es el proceso de alterar la población actual a partir de la aplicación de los operadores genéticos para obtener la población siguiente. Los operadores genéticos clásicos son la selección, el cruzamiento y la mutación, aunque otros operadores también pueden ser usados [HOLL92]. En este algoritmo se usó la selección proporcional [BACK96], el cruzamiento simple y la mutación uniforme [KURI99]. Durante la selección, los individuos de la población actual son seleccionados aleatoriamente, de acuerdo a la calificación obtenida durante la evaluación, para formar una población intermedia. Cabe aclarar que en este paso un individuo puede ser seleccionado en más de una ocasión. En esta población intermedia se forman parejas para, sobre ellas, aplicar el operador de cruzamiento. Este operador combina dos individuos padres para obtener dos individuos hijos, como se ejemplifica a continuación. Recordando lo expuesto en la sección 3.1, consideremos dos propuestas de solución donde (para la claridad del ejemplo) todos los atributos están en un solo fragmento, pero en sitios diferentes, como sigue (1 1 1 1 1 1 1 1 1 1) (5 5 5 5 5 5 5 5 5 5 ) Si el punto de cruzamiento, obtenido de manera aleatoria, es 5, al cruzar a los individuos anteriores obtenemos como descendientes (1 1 1 1 1 5 5 5 5 5) (5 5 5 5 5 1 1 1 1 1) La mutación uniforme, por su parte, toma una posición en el vector y la cambia de manera aleatoria. El número de posiciones a mutar por generación se obtienen multiplicando la probabilidad de mutación por la longitud del individuo y por el tamaño de población, esto es, Número de posiciones a mutar = Pm * l * Psize Una mutación se realiza seleccionando una posición aleatoria en un vector de la población. Por ejemplo, tomando al primer individuo ilustrado en el párrafo precedente y suponiendo que la posición escogida fue la 3, después de mutar esa posición obtenemos (1 1 4 1 1 1 1 1 1 1) 3.5. Parámetros para el AG. Para la ejecución del AG se requiere de varios parámetros, cuya determinación no es una tarea trivial, en tanto que no puede afirmarse que tales o cuales valores de ellos sean los más apropiados. Si bien no existen valores que sean los mejores en todos los casos, si hay algunas recomendaciones en torno a ello, como en [MITC97]. En la solución de este problema se usan los siguientes parámetros: • • • • • Tamaño de población = 100. Probabilidad de cruzamiento = 0.85. Probabilidad de mutación = 0.005. Número de generaciones a ejecutarse = 100. C = 65 000. 4. RESULTADOS EXPERIMENTALES. Para evaluar la actuación del AGEP, se resolvió el problema siguiente2. Sea R una relación con 10 atributos y 8 transacciones que se ejecutan sobre una base de datos. Considerando que se tienen 10 sitios donde se pueden almacenar los fragmentos resultantes y una matriz de uso de atributos mostrada en la figura 4.1, determinar el esquema de partición óptimo. En el trabajo señalado se realizó una búsqueda exhaustiva y se estableció que el valor mínimo de la función es de 5820. Transacciones 1 25 2 0 3 0 4 0 5 25 6 25 7 0 8 0 0 50 0 35 25 0 0 0 0 50 0 0 25 0 25 15 Atributos 25 0 0 0 0 25 0 0 25 0 25 0 0 0 0 15 0 0 25 0 0 0 0 15 25 0 0 35 25 0 0 0 0 50 0 35 25 0 0 0 0 50 0 0 25 0 25 15 0 0 25 0 0 0 0 15 Figura 4.1. Matriz de Uso de Atributos. 4.1 Experimentos El primer experimento consistió en generar una población inicial aleatoria para empezar la ejecución del AGEP. Para la presentación de los resultados se ejecutó 100 veces el algoritmo, y en base a ello se puede comentar lo siguiente: al promediar los resultados de las 100 ejecuciones se obtuvo un valor mínimo de 5942 y en 75 ocasiones de las 100 corridas se logró alcanzar el valor mínimo, tal como se muestra en las gráficas de la figura 4.2 y 4.3. 13000.00 12000.00 fitness 11000.00 10000.00 9000.00 8000.00 7000.00 6000.00 99 92 85 78 71 64 57 50 43 36 29 22 15 8 1 5000.00 Generaciones Fig. 4.2. Comportamiento del fitness promedio para 100 ejecuciones del AGEP, con 10 sitios disponibles. 2 Este problema se discute y resuelve en [MUTH93] apelando a un algoritmo de enumeración exhaustiva. Otro experimento consistió en cambiar la forma de crear la población inicial y medir de nueva cuenta el rendimiento del AGEP. Cuando la población inicial fue creada de manera que todos los atributos estuvieran contenidos en un mismo fragmento (es decir, un solo sitio mantiene almacenados a todos los atributos) el AGEP redujo su rendimiento pues el valor mínimo promedio de la función objetivo paso a ser de 5978 y solamente encontró el mínimo en 71 ocasiones. 100 90 No. de Mínimos 80 70 60 50 40 30 20 10 97 91 85 79 73 67 61 55 49 43 37 31 25 19 13 7 1 0 Generaciones Fig. 4.3. Número de mínimos encontrados por generación. Un tercer experimento consistió en crear la población inicial en forma tal que cada uno de los atributos estuviera contenido en un sitio diferente. El rendimiento del AGEP estuvo por 12000 11000 10000 fitness 9000 8000 7000 6000 5000 97 91 85 79 73 67 61 55 49 43 37 31 25 19 13 7 1 4000 Generaciones Fig. 4.4. Comportamiento del fitness promedio para 100 ejecuciones del AGEP con 8 sitios disponibles debajo de los dos casos precedentes al pasar a un valor mínimo promedio de la función objetivo de 6049 y encontrar el mínimo en tan solo 59 ocasiones de las 100 corridas del algoritmo. Un hecho importante que se observó es que cuando el número de sitios disponibles para almacenar la información se reduce, el rendimiento del AGEP mejora notablemente, tal como se muestra en las gráficas de las figuras 4.4 y 4.5. Como se aprecia en las gráficas precedentes, el valor promedio del fitness se redujo a 5889 cuando el número de sitios disminuyó a 8 y el número de veces que encontró el valor mínimo de la función aumentó a 85. Un comportamiento similar se produjo cuando el número de sitios fue de 6, ya que el fitness promedio pasó a 5864 y el número de mínimos encontrado fue de 88. 100 90 No. de Mínimos 80 70 60 50 40 30 20 10 97 91 85 79 73 67 61 55 49 43 37 31 25 19 13 7 1 0 Generaciones Fig. 4.5. Número de mínimos encontrados por generación. 5. CONCLUSIONES. A lo largo de este artículo se ha argumentado que el problema de optimizar la fragmentación y asignación de fragmentos sobre los sitios de la red es muy difícil. Sin embargo, también se mostró que cuando se usa un algoritmo genético para resolverlo, se pueden obtener muy buenos resultados con un porcentaje bajo de evaluaciones de la función objetivo. En el problema considerado, si se realiza una búsqueda exhaustiva, se tienen que evaluar 115,975 esquemas de partición diferentes; si el número de atributos de la relación se incrementa una solución enumerativa se vuelve impráctica. Para este problema, el AGEP mostró que con un máximo de 10,000 evaluaciones (esto es 8.6% del total) se alcanza un valor óptimo en la gran mayoría de las veces. Y si se aprecia de nueva cuenta la figura 4.2, se observará que hacia la generación 75 se ha logrado ya un valor muy cercano al óptimo. Esto significa que con aproximadamente el 6% de las evaluaciones del total posible, se obtienen resultados muy buenos. Estos resultados se ven mejorados cuando el número de sitios donde se pueden almacenar los fragmentos se reduce, como se mostró también en la sección anterior. Por otra parte, nuestros experimentos ilustraron el hecho de que, contra lo que pudiera suponerse intuitivamente, el proceso de “sembrar” la población inicial del AG no induce mejorías; por el contrario, entorpece la convergencia. Esto se explica, simplemente, considerando que al sesgar la población inicial, se restringe el espacio de búsqueda de manera negativa. Por otra parte es interesante señalar que este tipo de algoritmos son demostrablemente convergentes. El sesgo mencionado, entonces, tiene impacto en la eficiencia del algoritmo más no en su eficacia. El algoritmo genético mostró ser una alternativa factible para aplicarse en la solución de problemas de fragmentación de BDD en los que se considera la fragmentación vertical y la replicación de datos. Es importante señalar que un algoritmo genético se comportará de manera similar que el aquí presentado, independientemente de la función objetivo que se le defina como se demostró en [RUDO97]. Finalmente, consignamos que esta metodología puede aplicarse prácticamente sin cambios a la solución del problemas más general: la fragmentación horizontal y vertical y la asignación de dichos fragmentos. En trabajos futuros reportaremos los resultados obtenidos al efectuar un tipo de fragmentación mixta. 6. REFERENCIAS. [APER88] [BACK96] [BELL92] [BRUN94] [CERI84] [CHAK92] [DOWD82] Apears Peter M. G. Data Allocation in Distributed Database Systems. ACM Transactions on Database Systems. Vol. 13, No. 3. September 1988. Pages 263-304. Back, T. Evolutinary Algorithms in Theory and Practice.Oxford University Press. 1996. Bell David and Jane Grimson. Distributed Database Systems. AddisonWesley. 1992. Brunstrom Anna, Scott T. Leutenegger and Rahul Simha. Experimental Evaluation of Dynamic Data Allocation Strategies in a Distributed Database With Changing Workloads. 1994. Ceri Stefano and Giuseppe Pelagatti. Distributed Database, Principles & Systems. McGraw-Hill. 1984. Chakravarthy S., J. Muthuraj, R. Varadarajan and S.B. Navathe. An objective Function for Vertically Partitioning Relations in Distributed Database and its Analysis. Technical Report. University of Florida. 1992. Dowdy L.W. and D.V. Foster. Comparative Models of the File Assignment Problem. Computing Surveys, Vol. 14, No. 2. 1982. [GOLD89] [HOLL92] [KURI99] [MICH94] [MITC97] [MUTH93] [NAVA84] [NAVA89] [OZSU97] [PERE97] [PERE99] [RUDO97] [SHEP95] [SMIT97] Goldberg, D. E. Genetic Algorithms in Search, Optimization, and Machine Learning. Addison-Wesley. 1989. Holland, J. Adaptation in Natural and Artificial Systems. MIT Press. 1992. Kuri, A. A Comprehensive Approach to Genetic Algorithms in Optimization and Learning. Theory and Applications. Vol 1. Foundations. IPN 1999. Michalewicz, Z. Genetic Algorithms + Data Structures = Evolution Programs. Springer-Verlag. Second Extended Edition. 1994. Mitchel, M. An Introduction to Genetic Algoritms. MIT Third Printing. 1997. Muthuraj R., S. Chakravarthy, R. Varadajan and S. B. Navathe. A Formal Approach to the Vertical Partitioning Problem in Distributed Database Design. Proceding IEEE, 1993. Navathe S., S. Ceri, G. Wiederhold and J. Dou. Vertical Partitioning Algorithms for Database Design. ACM Transactions on Database Systems. Vol. 9. No. 4, December 1984. Navathe S. And M. Ra. Vertical Partitioning for Database Design: A Graphical Algorithm. ACM 1989. Ozsu Tamer M. And Patrick Valduriez. Principles of Distributed Database Systems. Prentice Hall. 1997. Pérez Joaquín, Rodolfo Pazos, Guillermo Rodríguez, Juan Frausto y Ana Gpe. Vélez. Fragmentación Vertical y Reubicación Dinámica en Base de Datos Distribuidas. 1997. Pérez, Joaquín, David Romero, Rodolfo Pazos, Juan Frausto y Laura Cruz. Integración de la Fragmentación Vertical y Ubicación en Bases de Datos Distribuidas Usando el Algoritmo de Aceptación por Umbral.1999. Rudolph G., Convergence Análisis of Canonical Genetic Algorithms. IEEE Transactions on Neural Networks. 5(1):96-101, January, 1997. Shepherd J., B. Harangsri, H. Ling Chen, A. Ngu. A Two-Phase Approach to Data Allocation in Distributed Database. ftp://ftp.cse.unsw.edu.au/pub/users/andrewt/publications/1995/ Smith John K. Genetic Algorithm in Vertical Partitioning. http://www.ics.hawaii.edu/ jksmith/gavert.html University of Hawaii. 1997.