domingo, 7 de abril de 2013

Mineração de dados utilizando Frameworks Java (Apache Mahout e Hadoop)


Uma aplicação necessita de saber o gosto do cliente, encontrar suas preferencia, temos que gerar um cruzamento de dados, utilização de data mining minerar os dados, etc, etc, etc.
Mas arquitetando uma aplicação, me deparei em uma situação que irá necessitar minerar os dados e conhecer o gosto do usuário (cliente). Será que teremos implementar uma data mining? Era um conhecimento que não tinha ainda. Até em uma das minhas pesquisas encontrei um artigo da revista Mundo J, que fala sobre essa necessidade e cita as duas frameworks que andei estudando Mahout e Hadoop. E como conhecimento adquirido, estarei compartilhando com vocês.

Temos três algoritmos de utilização do Apache Mahout, são elas:

Filtragem colaborativa: A filtragem  é feita de acordo com as decisões do usuário.
Cluster: É a semelhança entre usuário e o próprio produto.
Categorização: Agrupa os dados automaticamente.
A decisão de utiliza-los deve ser avaliada, mediante uma analise dos requisitos do sistema.


Onde vamos armazenar estes dados coletados

É onde entra o Hadoop, os dados que foram processados, ou dados com similaridade já calculados, você irá dizer ao Apache Hadoop se irá gerar um arquivo de dados do sistema ou gravar os dados em um mecanismo de dados distribuídos.
O próprio Apache Hadoop possui uma memoria de dados, mas a quantidade de informação deve sim ser pequena, caso contrario deve-se adicionar dados em sistemas de banco de dados distribuído.

Configuração

Ao criar um projeto Web, devemos fazer um download do Apache Mahout e Apache Hadoop.
Definirmos um banco de dados, para armazenar os dados minerados.
Vamos adicionar as bibliotecas do Mahout e Hadoop no projeto.


E cada caso de uso devemos avisar que nele irá conter uma coleta de dados.

Conclusão

Dessa forma conseguimos gerar dados com similaridades, obter as informações dos usuários.

Qualquer dúvida só entrar em contato.

Referencias:













Geração de Log e Auditoria de dados usando (Hibernate Envers)


A maioria das aplicações de médio e grande porte necessita de geração de Log´s e Auditoria, sempre foi um requisito não funcional para auditar dados sigilosos e importantes. Com a necessidade surgiu a framework que ajuda na construção desses dados auditados (Hibernate Envers), onde neste artigo irei explicar como utiliza-lo.
Usaremos a versão do Hibernate Envers 1.2.2 (compatível com o hibernate 3.3.X), não é uma versão final, e utilizar o JBOSS 5.0.1 GA como servidor e JPA 2. Lembrando que devemos acrescentar o JAR do hibernate envers no JBOSS para funcionar a aplicação.

Configurando o Hibernate Envers


Para cada entidade que deve ser auditada (gerada um log), devemos utilizar a annotation @Audited, nesta anotação você deixa explicito que a entidade X deve ser auditada a cada execução de insert, update e delete, mas falta algo para na configuração que deixa explícitos quais operações a entidade deve ser log, temos a configuração no persistence.xml, segue abaixo:

<property name="hibernate.ejb.event.post-insert" value="org.hibernate.envers.event.AuditEventListener" />
<property name="hibernate.ejb.event.post-update" value="org.hibernate.envers.event.AuditEventListener" />
<property name="hibernate.ejb.event.post-delete" value="org.hibernate.envers.event.AuditEventListener" />
<property name="hibernate.ejb.event.pre-collection-update" value="org.hibernate.envers.event.AuditEventListener" />
<property name="hibernate.ejb.event.pre-collection-remove" value="org.hibernate.envers.event.AuditEventListener" />
<property name="hibernate.ejb.event.post-collection-recreate" value="org.hibernate.envers.event.AuditEventListener" />

Está configuração serve para dizer as operações que Envers irá executar para cada entidade anotada.
Sim é uma situação muito simples de configurar e anotar as entidades, mas deve lembrar que analisar e arquitetar as entidades e verificar que aqueles dados sim são importantes e devem ser auditados, pois nem todos os dados devem ser auditados e pode sim atrapalhar o consumo de dados no banco.

Que ganho tem na minha aplicação


Simples, quando geramos trigger para gerar essas auditorias sempre temos que disparar um gatilho no banco, além de consumir um recurso do banco temos esse GAP para disparo, na aplicação Java o momento de utilização das seguintes operações update, delete e insert é o momento que o Envers irá executar, então estaremos utilizando o mesmo consumo e recurso é como se estivéssemos gravando juntamente com cada operação do banco.

Mas a aplicação pode ficar sobrecarregada


Não, pois a própria framework cuida disso, este problema já havia sido levado em consideração e devemos utilizar entidade apenas para auditoria para que não utilize o mesmo recurso da sessão do JPA e ou Hibernate. Como sabemos ele abre Threads para cada transação, utilizando sempre a mesma conexão, para que não gere concorrência e gere um gargalo da aplicação. Então irá consumir ou sobrecarregar a aplicação? Não.

Como consultar


O Envers possui um processo de Criteria do Hibernate, com os métodos AuditReader e o AuditQuery. O primeiro é para consultas e retorno de dados e o segundo é para construção de query´s mais pesadas.
Vale lembrar que as consultas que possua entidades com listas, todas elas você deverá percorrer, pois o Envers trata os @ManytoMany e @ManytoOne como FetchType como Lazy, caso na consulta você não deixe explicito que necessita que aquele objeto deve ser carregado, irá trazer uma lista não concluída, no momento de acessa-lo irá estourar um erro do próprio Hibernate.

Exemplo de entidade anotada


@Entity
@Audited //Anotação da entidade dizendo que esta devera ser auditada
public class Pessoa {

}

Conclusão


Podemos ter auditoria de dados e logs acoplado no Java, vimos que temos um recurso Java que não consome tanto recurso do banco e que é certamente seguro.

Qualquer dúvida só entrar em contato.

Referencias: