Cloudant a empresa por trás do CouchDB liberou uma versão do Java View Server para o CouchDB. Isto significa que não apenas Erlang e linguagens interpretadas como Javascript e Python podem ser usadas para escrever Map-Reduce jobs mas também linguagens baseadas na JVM. A abordagem será discutida no encontro da comunidade CouchDB neste semana. Atualmente ele pode ser somente usado no serviço BigCouch hospedado pela própria Cloudant.
A principal vantagem que é citada é a grande quantidade de bibliotecas Java que estão disponíveis para todos os tipos de funcionalidades que podem ser relevantes em tarefas de map reduces. A segunda vantagem é uma maior segurança com aspecto dos tipos estáticos.
Uma comparação de performance seria interessante, mas ainda não existem benchmark de performance para isto. É experado que a performance seja mais baixa do que em linguagens nativas como o Erlang (Java e Erlang pode ser juntadas em uma única view). Existe uma certa sobrecarga no processo de serialização e deserialização pelo uso da biblioteca org.json.
Para usar as views de Map Reduce baseadas no Java basta apenas implementar uma simples JavaView Interface que oferece callbacks para map, reduce e rereduce. Por exemplo, uma simples view que agregue palavras em campos de um JSON.
{ "_id":"_design/splittext", "language":"java", "views" : { "title" : {"map":"{\"classname\":\"com.cloudant.javaviews.SplitText\",\"configure\":\"title\"}","reduce":"com.cloudant.javaviews.SplitText"}, } }
InfoQ falou com David Hardtke, o diretor de busca da Cloudant, que é responsável pelo projeto.
InfoQ: CouchDB roda sobre o Erlang, como é esta iteração com código da JVM? Quais foram os desafios na implementação?
David: O Java View Servers, como todos das views do CouchDB (exceto a nativa em Erlang), rodam como processos externos. Existe um protocolo bem definido para a comunicação entre CouchDB e os view servers. Normalmente, a comunição acontece através de padrões de io, mas nós na verdade usamos a biblioteca OptErlang java-erlang por razões de performanvce (permite múltiplas threads).
InfoQ: Quais limitações no código e bibliotecas podem ser usadas neste contexto?
David: O principal desafio foi a segurança, tanto no nível de sistema quanto no nível do usuário. Nós estamos rodando em um cluster compartilhada. Nós usamos class loading dinâmico para carregar as bibliotecas do usuário. O clas loader tem um sistema de segurança bem rídigo que restringe chamadas maliciosas. Não existe acesso ao FS e um número limitado de chamadas ao System são permitadas.
A arquitetura atual deste view server é completamente simples, ele utiliza apenas threads java que são direcionadas pelas chamadas das instâncias do CouchDB baseado em Erlang. Se o servidor Java falha ele é apenas parado e ligado novamente. Abordagens interessantes para tal seria o servidor usar o framework baseado Akka framework ou as requisições não blocantes do Jetty.
Um grande potencial reside no uso de linguagens como Clojure, Scala ou Groovy para fazer um trabalho que ficará muito mais conciso e poderoso que em Java, pelo fato de odar em qualquer JVM. De acordo com David um servidor baseado em Clojure está em desenvolvimento.
Para avaliar o novo Java View Server uma conta gratuita está disponível no site do Cloudant e pode ser usada. instruções detalhadas pode ser encontradas no couchjava github.