Translate

viernes, 13 de abril de 2018

Estadísticas de las base de datos relacionales.

Para que una base de datos relacional pueda resolver una consulta SQL de forma óptima necesita conocer los datos físicos de cada tabla, índice o cluster que intervienen en ella. Estos datos se almacenan en el diccionario de datos.

En oracle pueden ser consultadas usando las vistas adecuadas: dba_tables, dba_tab_statistics, dba_tab_col_statistics, dba_tab_histograms, dba_indexes, dba_ind_statistics… etc.

En concreto, es el optimizador quién de todos los planes de ejecución posibles analiza estos datos estadísticos para evaluar cuál de todos supone un menor coste en términos de I/O y uso de CPU.

Las estadísticas deben reflejar verazmente el estado físico de los objetos, y conforme vayan sufriendo transformaciones éstas se irán quedando obsoletas. Es por esto por lo que hay que recopilar las estadísticas de nuevo a medida que ya no reflejen la situación real de los objetos a los que describen.

Si una tabla no posee estadísticas, el motor de base de datos puede recopilar ciertos datos dinámicamente en el momento de la consulta. Esto se llama muestreo dinámico “dynamic sampling”.

Las estadísticas se pueden recopilar  manual o automáticamente. Por omisión, Oracle recopila las estadísticas a través del job programado con scheduler en una ventana de tiempo predefinida: por ejemplo de lunes a viernes de 22:00 a 6:00 y sábados y domingos completos. Durante esta recopilación automática se toman datos de tablas sin estadísticas o con estadísticas obsoletas (que han sufrido más de 10% de modificaciones desde la anterior toma de datos) pero antes debe haberse configurado el parámetro STATISTICS_LEVEL a un valor distinto de BASIC.

En oracle para seguir el número de registros modificados existe la vista existe all_tab_modifications. Ésta muestra el número aproximado de inserciones, modificaciones, borrados y truncados que ha sufrido la tabla desde la última recopilación. La vista es consultable por el usuario pero hay que tener en cuenta que estos datos no son visibles inmediatamente. Existe un retardo de unos minutos para evitar que la escritura interfiera en el rendimiento.

Para recopilar las estadísticas manualmente hay diferentes funciones dependiendo el motor por ejemplo en oracle hay que usar el paquete DBMS_STATS. Dicho paquete tiene métodos para:

  • Recopilar estadísticas.
  • Borrar estadísticas.
  • Guardar y asignar estadísticas.
  • Crear o borrar tablas donde guardar juegos de estadísticas.
  • Bloquear y desbloquear las estadísticas de las tablas.
  • Retornar las estadísticas que tenía una tabla en un momento dado.

En Oracle podemos ejecutar las estadísticas para todos los esquemas de la siguiente forma:

SQL> exec dbms_stats.gather_database_stats;
Procedimiento PL/SQL terminado correctamente.

En Postgres por ejemplo existe una herramienta llamada ANALYZE que permite correr las estadísticas de forma manual :

ANALYZE [ VERBOSE ] [ table_name [ ( column_name [, ...] ) ] ]

Como se puede ver hay diferentes modos de correr esto pero lo más común sería:

ANALYZE VERBOSE users;

En sql server, tambien podemos actualizar las estadísticas utilizando UPDATE STATISTICS o el  stored procedure sp_updatestats, veamos unos ejemplos:

USE AdventureWorks2012;
GO

UPDATE STATISTICS Sales.SalesOrderDetail;
GO

La actualización de estadísticas garantiza que las consultas compilan con estadísticas actualizadas. Sin embargo, actualizar las estadísticas hace que las consultas se recompilen. Por lo tanto puede haber una compensación de rendimiento entre la mejora de los planes de consulta y el tiempo que lleva recompilar las consultas.

Y por ultimo, algo muy importante es hacer backup tambien de las estadísticas, dado que si pasa algo con la base de datos, no solo vamos a querer restaurarla sino tambien que sea usable. Por lo tanto a la hora de hacer backup incluyamos las estadísticas.

jueves, 12 de abril de 2018

Y si , ya se esta hablando de Java 11...


Java 10 no pudo traer otra cosa que los rumores de lo que se viene en java 11.

Primera noticia es que CORBA, Java EE, and JavaFX, ya no tendrán soporte en esta versión. Java 11 también está configurado para perder algunas capacidades mediante la eliminación de los módulos CORBA y Java EE (recientemente renombrado Jakarta EE), así como la eliminación de JavaFX.

Y las nuevas características planificadas incluyen:

  • Epsilon como Java garbage collector , Epsilon manejará la asignación de memoria sin implementar ningún mecanismo de recuperación de memoria. 
  • Una  nueva sintaxis de variable local para parámetros lambda, dado que se debe alinear la sintaxis de una declaración de parámetro formal en una expresión implícitamente tipada con la sintaxis de una declaración de variable local. Esto permitiría usar var cuando se declaran parámetros formales de una expresión lambda implícitamente tipada.
  • El formato de archivo de clase Java se ampliará para soportar un nuevo de grupo constantes, CONSTANT_Dynamic. El objetivo es reducir el costo y la interrupción del desarrollo de nuevas formas de restricciones de archivos de clase materializables.

Como conclusión podemos afirmar que no va ha ver ningún gran cambio en Java 11, solo unos cambios que permitirán mejorar el desempeño del ecosistema java.

Dejo link:
https://www.javaworld.com/article/3266372/core-java/java-11-roadmap-the-new-features-you-can-expect.html

miércoles, 11 de abril de 2018

Tipo de Variables compartidas en Spark



Spark provee 2 tipos de variables compartidas para hacer más eficiente correr spark en un cluster. Hay variables broadcasts y accumutators.

La variable broadcasts, permite a los desarrolladores tener las variables de solo lectura almacenadas en caché en cada máquina en local. Se pueden usar para dar más eficientemente copias de conjuntos de datos de entrada grande a los nodos en el clúster.

Variable accumutators, usan una operación asociativa y, por lo tanto, pueden ser soportados de manera eficiente en paralelo. Se pueden usar para implementar contadores (como en MapReduce) o sumas. Las tareas que se ejecutan en el clúster pueden agregarse a una variable de acumulador mediante el método de agregar. Sin embargo, no pueden leer su valor. Solo el programa del controlador puede leer el valor del acumulador.

martes, 10 de abril de 2018

Entendiendo EXPLAIN PLAN de Oracle


Dado que SQL es un lenguaje declarativo, nosotros no le decimos como hacer las cosas, solo le decimos que hacer. Por lo tanto el motor de base de datos, decide que camino tomar.

Si tenemos un problema de performace en alguna consulta, lo que podemos hacer es pedirle a oracle que nos explique que esta haciendo, y de esta manera ver si le falta un indice o si la podemos ayudar.

La instrucción EXPLAIN PLAN muestra los planes de ejecución elegidos por el optimizador de Oracle para las instrucciones SELECT, UPDATE, INSERT y DELETE. El plan de ejecución de una declaración es la secuencia de operaciones que Oracle realiza para ejecutar la instrucción.

Muestra la siguiente información:
  • Un orden de las tablas a las que hace referencia la consulta o update
  • Un método de acceso para cada tabla mencionada en la consulta o update
  • Un método de combinación para tablas afectadas por operaciones de combinación de la instrucción.
  • Operaciones de datos como filtro, clasificación o agregación
Además la tabla de plan contiene información sobre lo siguiente:
  • Optimización, como el costo y la cardinalidad de cada operación
  • Particionamiento, como el conjunto de particiones accedidas
  • Ejecución paralela
Los resultados de EXPLAIN PLAN le permiten determinar si el optimizador selecciona un plan de ejecución particular, como por ejemplo, bucles anidados. También nos ayuda a comprender las decisiones del optimizador, como por qué el optimizador eligió una unión de bucles anidados en lugar de una combinación de hash, y le permite comprender el rendimiento de una consulta.

Para ejecutar el EXPLAIN PLAN debemos ejecutar por ejemplo esta query:

EXPLAIN PLAN FOR
  SELECT last_name FROM employees;
En este caso se escribio el plan de ejecución en una vista por lo que si queremos verlo, podemos hacer: 

SELECT PLAN_TABLE_OUTPUT FROM TABLE(DBMS_XPLAN.DISPLAY());
Luego podemos escribir otros post que nos enseñen como entender los query plans. Pero eso es todo por ahora. 




sábado, 7 de abril de 2018

Problema de database locking usando hibernate

Tuve un problema de database locking (loqueo en una búsqueda de castellanización) en la aplicación que estoy trabajando, el tema era que nadie debería escribir en la tabla que se loqueaba.

Lo primero que hice es ver el log de hibernate y pedirle que me muestre el sql, eso se logra cambiando el parámetro "show_sql". Analizando los sql, cuando se consultaba esta entidad hibernate hacia unos update y deletes que eran rarísimos, porque solo era una consulta. Es decir no debía hacer eso.

Luego de un analisis del codigo de consulta no encontre nada raro... Por lo tanto me puse a ver el mapeo y tampoco, nada raro...

Luego de caer en un pozo depresivo, vi la luz. Al parecer esta entidad estaba contenida por otra entidad, la cual en el método get ordenaba la lista. Parece ilógico, pero no lo es.

Cuando se hacia un get de esta lista, la aplicación ordenaba la lista y hibernate asumia que esta lista había cambiado, claro el no sabe que ya se había guardado ordenada. Por lo tanto cada vez que se hacia un get, hibernate removía la lista vieja y guardaba una nueva, sin importar si había cambios o no.

No se si esto se arreglo en futuras versiones de hibernate, pero como linea general traten siempre que usen hibernate que los métodos get no hagan nada (solo lo que deben hacer, retornar el valor)

Como lo solucione? muy fácil, hice un método get que no ordenaba, es decir el típico get y hice otro método getSorted que lo use en mi código. Y listo!

Espero que les sirva. 

viernes, 6 de abril de 2018

Libros gratuitos

Me llegaron ests libros de java geeks :

Get schooled by Java Code Geeks

Download Dev Guides!

 
Microsoft Azure is now more than seven years old. Like all seven-year-olds, Azure has been through some memorable teething troubles over the years, as well as some incredible growth and change. Microsoft still faces some significant challenges in increasing the adoption of its Azure platform. As Azure continues to evolve to meet the needs of modern app development processes and systems, developers will need to stay up to date with the latest changes in order to keep using the platform as efficiently as possible. In this eBook, we’ll look back at the history of Microsoft Azure and you’ll learn how to stay up to speed with Microsoft’s latest updates to Azure. You’ll also learn about the effect of the recent .NET Core release, as well as new considerations for app developers working with Azure and new ways they can use the platform to facilitate their app development processes. Finally, we’ll take a look at what’s new with Azure, exploring the innovations that could change the way developers work across platforms, both on-premises and in the cloud.
 
 
The primary intended audience for this document is any expert in professional services who needs to assure the health of SharePoint and systems connected to it. If you’re a systems architect, you can gain understanding of SharePoint components and how other applications can take advantage of SharePoint. If you’re an independent consultant, you’ll learn about the elements of comprehensive coverage and total visibility into operations with prebuilt monitoring configurations. Everything in this eBook is based on real-world examples and configurations where AppDynamics was deployed to monitor SharePoint. There’s no private or identifying information here, but it is not designed for the average SharePoint user. The level of detail can be overwhelming and not very useful for non-technical colleagues. This book can be used to help guide users through specific problems, but make sure that you work through those issues first and do not confuse the user with topics that take more specialized technical knowledge and experience.
 
 
IntelliJ IDEA is a Java integrated development environment (IDE) for developing computer software. It is developed by JetBrains, and is available as an Apache 2 Licensed community edition, and in a proprietary commercial edition. The IDE provides for integration with build/packaging tools like grunt, bower, gradle, and SBT. It supports version control systems like GIT, Mercurial, Perforce, and SVN. Databases like Microsoft SQL Server, ORACLE, PostgreSQL, and MySQL can be accessed directly from the IDE. IntelliJ supports plugins through which one can add additional functionality to the IDE. One can download and install plugins either from IntelliJ’s repository website or through IDE’s inbuilt plugin install feature. 
 
 
Hibernate ORM (Hibernate in short) is an object-relational mapping framework, facilitating the conversion of an object-oriented domain model to a traditional relational database. Hibernate solves the object-relational impedance mismatch problems by replacing direct persistence-related database accesses with high-level object handling functions. Hibernate is one of the most popular Java frameworks out there. For this reason we have provided an abundance of tutorials here at Java Code Geeks, most of which can be found here. Now, we wanted to create a standalone, reference post to provide a framework on how to work with Hibernate and help you quickly kick-start your Hibernate applications. Enjoy!
 

miércoles, 4 de abril de 2018

Spark web console


Cuando corres spark en cualquier modo, se pueden ver los jobs y otras estadísticas en la consola web que se encuentra en : localhost:4040

Esta consola tiene los siguientes tabs: Jobs, Stages, Storage, Environment y Executors.

lunes, 2 de abril de 2018

Ur, un lenguaje funcional puro

Ur es un lenguaje de programación similar a ML y Haskell, pero presenta un sistema de tipos significativamente más rico. Ur es funcional puro, estáticamente tipado y estricto. Ur soporta metaprogramación basada en el sitema de row types.

Ur/Web es Ur más una biblioteca estándar especial y reglas asociadas para el análisis sintáctico y la optimización web. Ur/Web admite la construcción de aplicaciones web dinámicas respaldadas por bases de datos SQL. Ur/Web utiliza el tipado estatioco de tal manera que las paginas generadas no pueden :

  • Sufrir cualquier tipo de ataque de inyección de código
  • Retornar HTML no válido
  • Contiener enlaces muertos o invalidos dentro de la aplicación
  • Tener desajustes entre formularios HTML y los campos esperados por sus controladores
  • Incluir el código del lado del cliente que hace suposiciones incorrectas sobre los servicios de estilo "AJAX" que proporciona el servidor web remoto
  • Intentar consultas SQL no válidas
  • Usar referencias o bases de datos impropias en la comunicación con bases de datos SQL o entre navegadores y servidores web


Este tipo de seguridad es solo la base de la metodología Ur/Web. También es posible usar la metaprogramación para construir piezas de aplicación significativas mediante el análisis de la estructura de tipos. Por ejemplo, la demostración incluye un functor estilo ML para construir una interfaz de administración para una tabla SQL arbitraria. El sistema de tipo garantiza que la sub-aplicación de interfaz siempre estará libre de los errores mencionados anteriormente, sin importar qué descripción de tabla bien tipada.

El compilador de Ur/Web también produce código de objeto muy eficiente que no utiliza la recolección de elementos no utilizados. Estos programas compilados a menudo serán incluso más eficientes de lo que la mayoría de los programadores se tomarían la molestia de escribir en C. Por ejemplo, el servidor web independiente generado para la demostración utiliza menos memoria RAM que el shell bash. El compilador también genera versiones JavaScript del código del lado del cliente, sin necesidad de escribir esas partes de las aplicaciones en un lenguaje diferente.

Y como esto furra poco la implementación de todo esto es de código abierto.

Dejo link: http://www.impredicative.com/ur/

jueves, 29 de marzo de 2018

Como instalar y correr Apache Spark?


Hay varias formas diferentes de instalar y usar Spark. Podemos instalarlo en una máquina como una aplicación stand-alone o usar una de las imágenes de máquinas virtuales Spark disponibles de proveedores como Cloudera, Hortonworks o MapR. También podemos usar Spark instalado y configurado en la nube (por ejemplo, en Databricks Community Edition).

Cuando instalamos Spark en una máquina local o usamos una instalación basada en la nube, podemos usar algunos modos diferentes para conectarnos al motor Spark.

La siguiente tabla muestra los parámetros principales de URL para los diferentes modos de ejecutar Spark:

  • Local: Corre Spark de forma local con un worker
  • local[k]: Corre Spark de forma local con k workers (lo ideal es que k sea numero de micros)
  • local[*]: Corre Spark de forma local y corre con un numero de workers que se asigna de forma lógica.
  • spark://HOST:PORT: Conecta con un spark standalone cluster master. El puerto debe ser cualquiera que haya sido configurado en el master. Por defecto es 7077.
  • meso://HOST:PORT: Conecta con un Mesos cluster. E El puerto debe ser cualquiera que haya sido configurado en el master. Por defecto es 5050.
  • yarn-client: conecta con clusters YARD en modo cliente, la ubicación del clúster se encontrará en función de la variable HADOOP_CONF_DIR.
  • yarn-cluster:  conecta con clusters YARD en modo cluster, la ubicación del clúster se encontrará en función de la variable HADOOP_CONF_DIR.


Una vez que Spark este funcionando, nosotros podemos connectar usando Spark shell para analisis interactivo de datos. El shell Spark está disponible en los lenguajes Scala y Python. Java no era compatible con un shell interactivo anteriormente, pero está disponible en JDK 9. La herramienta REPL (read-eval-print loop) en Java se llama Jshell.

Se puede utilizar spark-shell para Scala y pyspark para Python.


sábado, 24 de marzo de 2018

Java 10 fue liberado


Si! vamos por java 10,  oracle tomo el control de java y no para de sacar versiones. Esta versión fue 6 meses despues de java 9.

El lanzamiento de Java 10 vuelve obsoleto a Java 9 y no se ofrecerán más versiones gratuitas de Java 9. A partir del 20 de marzo, las únicas versiones de Java con soporte gratuito de Oracle son Java 8 y Java 10. La próxima versión con soporte a largo plazo disponible va ser Java 11, que se lanzará en septiembre de 2018.

La versión final prácticamente no ha cambiado desde el candidato RC1 y no se han agregado características significativas.

La documentación completa de esta versión está disponible, así como el release note.

Entre las características más importantes se encuentra la palabra "var" que permite la inferencia de tipos:

var foo = new ArrayList<String>();

Además de los casos simples, esto realmente permite construcciones de programación que no eran posibles antes:

public class Test {
    public static void main(String[] args) {
        (new Object() {
            public void bar() {
                System.out.println("bar!");
            }
        }).bar();
    }
}

Y gracias a la palabra var y la inferencia de tipos podemos hacer lo siguiente:

var o = new Object() {
    public void bar() {
        System.out.println("bar!");
    }
};

o.bar();

Todavia tengo post sobre java 8 y 9 y oracle lanza Java 10!! En un futuro no muy lejano seguiré escribiendo sobre las nuevas características de java 10.

Dejo link: http://jdk.java.net/10/
https://docs.oracle.com/javase/10/

¿Cómo logra una empresa argentina figurar entre las mejores 100 compañías de outsourcing del mundo?

Como sabrán algunos trabajo en una empresa que se llama hexacta. Esta empresa se encuentra entre las mejores 100 compañías de outsourcing del mundo dado esto la revista digital insider hizo el siguiente reportaje a un socio de hexacta:

http://insiderlatam.com/como-logra-una-empresa-argentina-figurar-entre-las-mejores-100-companias-de-outsourcing-del-mundo

miércoles, 21 de marzo de 2018

Conjuntos de datos distribuidos resistentes en Spark


Conjuntos de datos distribuidos resistentes o Resilient distributed datasets (RDD) esta basado en Resilient Distributed Datasets: A Fault-Tolerant Abstraction for In-Memory Cluster Computing” (Matei et al 2012) este es el concepto base de Apache Spark.

RDD es como una tabla en una base de datos, la cual puede guardar datos de cualquier tipo. Spark guarda datos en RDD en diferentes particiones.

RDD ayudan a reorganizar los cálculos y a optimizar el procesamiento de datos. También son tolerantes a fallas porque el RDD sabe cómo recrear y volver a calcular los conjuntos de datos.

RDDs son inmutables (podemos ver la programación funcional de scala en este aspecto). Es decir se puede procesar un RDD pero esto retornara un nuevo RDD con el resultado de la transformación.

RDD soporta 2 tipos de acciones:

  • Transformaciones: esto no retorna un valor pero retorna un nuevo RDD. Algunas funciones de transformación:  map , filter , flatMap , groupByKey , reduceByKey , aggregateByKey , pipe y coalesce.
  • Acciones: operaciones que retornan un valor. Cuando una acción es llamada los datos son procesados y un valor es retornado. Algunas funciones de acción: reduce , collect , count , first , take , countByKey y foreach.


martes, 20 de marzo de 2018

Cursos Gugler


Como es habitual en el blog, trato de promover los buenos cursos. En este caso quiero aconsejarles los cursos de Gugler.

El Laboratorio de Investigación Gugler de la Facultad de Ciencia y Tecnología (U.A.D.E.R) tiene como Misión: "Promover, capacitar y difundir el uso del Software Libre en la región".

Algo muy importante es que los cursos se pueden hacer presenciales o a distancia.

Acá les dejo más info:




Y el link:
https://inscripciones.gugler.com.ar/
https://www.gugler.com.ar/

domingo, 18 de marzo de 2018

Arquitectura de Apache Spark



Apache Spark esta compuesto por tres componentes:
  • Data store
  • API
  • Framework de gestion de recursos


Data store: Apache Spark utiliza el sistema de archivos de hadoop, es decir utiliza hdfs. Por lo tanto es compatible con almacenamiento de hadoop y framework que utilizan este almacenamiento como hbase, casandra, etc.

API: La API permite crear aplicaciones basadas en Spark, utilizando una interfaz estandar. Spark provee esta API para java, scala, python y R.

Gestion de recursos: Spark puede ser deployado en un servidor stand-alone o sobre una infraestructura distribuida sobre frameworks como Mesos o YARD


Ecosistema Spark



Como hemos dicho anteriormente un ecosistema big data cuenta normalmente con varios productos, los cuales proveen diferentes funcionalidades.

En el caso de spark, no es una excepción. Apache Spark incluye: 

Spark Streaming, Se utiliza para procesar información en tiempo real. Esto apoyados en un pequeño sistema micro-batch. A la vez esto usa Dstream que es una serie de RDDs que se procesan en tiempo real. Y para él que no sabe que es RDD (como yo) RDD es Resilient Distributed Dataset  (RDD), la abstracción básica en Spark. Representa una colección de elementos inmutables y divididos que se pueden operar en paralelo.

Spark SQL permite exponer datos de dataset de spark bajo una API Jdbs y permite ejecutar consultas SQL-like con datos de Spark. Tambie permite estraer datos en diferentes formatos.

Spark MLlib : es una librería de maching learning de spark. Esta consiste en los algoritmos comunes de maching learning y utilidades. 

Spark GraphX : Es la API de Grafos y procesamiento de grafos en paralelo. GraphX amplía a Spark RDD al introducir las propiedades de gráfos distribuidos resistente: un multi-grafo dirigido con propiedades asociadas a cada vértice y borde. Para admitir el cálculo de grafos, GraphX expone un conjunto de operadores fundamentales (por ejemplo, subgraph, joinVertices y aggregateMessages) y una variante optimizada de Pregel API. Además, GraphX incluye una creciente colección de algoritmos y constructores de grafos para simplificar el análisis de grafos.

Aparte de estas librerías, hay otros framework que se integran muy bien con Spark:

Alluxio (anteriormente conocido como Tachyon) es un sistema de archivos distribuidos centrado en memoria, que permite compartir archivos de forma segura en un cluster basado en Spark y mapReduce. Este framework cachea un conjunto de datos en memoria, evitando ir a disco a buscar los conjunto de datos frecuentes. Esto permite acelerar el trabajo con Spark.

BlinkDb: es un motor de consulta aproximada para ejecutar consultas SQL interactivas en grandes volúmenes de datos. Permite a los usuarios intercambiar la precisión de la consulta por el tiempo de respuesta. Funciona en grandes conjuntos de datos ejecutando consultas en muestras de datos y presentando resultados con un rango de error significativas. Las versiones posteriores de BlinkDB se mantienen bajo un nuevo proyecto llamado iOLAP.