<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-6541464271719475452</id><updated>2011-12-15T11:21:54.145Z</updated><category term='map/reduce'/><category term='pig'/><category term='couchdb'/><category term='zookeeper'/><category term='documentation'/><category term='ec2'/><category term='linked data'/><category term='last.fm'/><category term='protocols'/><category term='api'/><category term='hadoop'/><category term='big data'/><category term='fanboys'/><category term='dynamo'/><category term='bigtable'/><category term='amazon'/><category term='visualizaciones'/><category term='Volunteer Computing'/><category term='eficiència'/><category term='dataspora'/><category term='video'/><category term='nosql'/><category term='hive'/><category term='opendata'/><category term='flume'/><category term='data science'/><category term='avro'/><category term='rendiment'/><category term='ogov'/><category term='bittorrent'/><category term='thrift'/><category term='key-value'/><category term='soap'/><category term='p2p'/><category term='rpc'/><category term='java'/><category term='dfs'/><category term='BOINC'/><category term='viz'/><category term='Catalunya'/><category term='huguk'/><category term='bases de dades'/><category term='mongodb'/><category term='rellotges vectorials'/><category term='taller'/><category term='hdfs'/><category term='hfile'/><category term='rest'/><category term='memòria'/><category term='hbase'/><category term='Enllaços de la setmana'/><category term='google'/><title type='text'>Distribuïnt...</title><subtitle type='html'>Blog sobre informática distribuida, ciencia de datos y Linked Data</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://distribuint.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6541464271719475452/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://distribuint.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Marc</name><uri>http://www.blogger.com/profile/05631004736020219907</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://4.bp.blogspot.com/_a84GcWW6wwE/TTcLNqDwGxI/AAAAAAAAAXc/KscglDtW6gI/S220/lant.png'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>39</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-6541464271719475452.post-1809979542005481515</id><published>2011-12-15T11:21:00.001Z</published><updated>2011-12-15T11:21:54.151Z</updated><title type='text'>Es "Big Data" una buzzword?</title><content type='html'>Hace muy poco un amigo mío hizo un tweet:&lt;br /&gt;&lt;i&gt;"Es Big Data la siguiente Buzzword"?&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;br /&gt;Si además ponemos a la mezcla los posts en algunos posts bastante "mainstream" de algunos &lt;i&gt;gurús&lt;/i&gt;&amp;nbsp;de la informática pues ya tenemos una combinación un poco explosiva.&lt;br /&gt;&lt;br /&gt;Mi opinión es que probablemente los comerciales, "gurús" y otros consigan que&amp;nbsp;&lt;i&gt;Big Data&lt;/i&gt;&amp;nbsp; sea una buzzword como lo ha sido &lt;i&gt;cloud computing&lt;/i&gt;, &lt;i&gt;IA, &lt;/i&gt;o &lt;i&gt;grid computing&lt;/i&gt;. Y creo que es una lástima, para mi estas tecnologías tienen un sentido y una utilidad.&lt;br /&gt;&lt;br /&gt;En general me hace gracia que las tecnologías con las que trabajo sean conocidas, me sale la vena &lt;i&gt;hipster&lt;/i&gt;&amp;nbsp;y puedo decir eso de: &lt;i&gt;Yo trabajaba con Hadoop antes de que...&lt;/i&gt;&amp;nbsp;pero llega un momento que el tema se hace cansado.&amp;nbsp;Y lo digo porque de seguro ahora mucha gente va a coger sus productos de siempre y les va a meter "Big Data" para que sean más vendibles, van a empezar a salir "entendidos" y vamos a ver qué más. Hasta que salga la siguiente Buzzword, y a por otra cosa.&lt;br /&gt;&lt;br /&gt;Para mi big data no es una tendencia, es un problema que existe. El cloud, el grid, la IA son metodologías, una mezcla de tecnologías, que han tenido más o menos éxito, que han sido tendencia y que han servido para sacar dinero de subvenciones para proyectos. Uno de los problemas que ha habido (en mi humilde opinión) es que se han intentado encontrar soluciones a problemas que no existían, creándose así un sinfín de tecnologías poco prácticas, flojas y muy poco realistas. Este pues, no es el caso, aquí primero estuvo el problema, luego la solución.&lt;br /&gt;&lt;br /&gt;Big data no es una tendencia, es un problema.&amp;nbsp;&amp;nbsp;Punto y final.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6541464271719475452-1809979542005481515?l=distribuint.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://distribuint.blogspot.com/feeds/1809979542005481515/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://distribuint.blogspot.com/2011/12/es-big-data-una-buzzword.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6541464271719475452/posts/default/1809979542005481515'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6541464271719475452/posts/default/1809979542005481515'/><link rel='alternate' type='text/html' href='http://distribuint.blogspot.com/2011/12/es-big-data-una-buzzword.html' title='Es &quot;Big Data&quot; una buzzword?'/><author><name>Marc</name><uri>http://www.blogger.com/profile/05631004736020219907</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://4.bp.blogspot.com/_a84GcWW6wwE/TTcLNqDwGxI/AAAAAAAAAXc/KscglDtW6gI/S220/lant.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6541464271719475452.post-9044191206009985037</id><published>2011-09-06T12:25:00.000+01:00</published><updated>2011-09-06T12:25:59.412+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='visualizaciones'/><category scheme='http://www.blogger.com/atom/ns#' term='last.fm'/><category scheme='http://www.blogger.com/atom/ns#' term='viz'/><category scheme='http://www.blogger.com/atom/ns#' term='big data'/><title type='text'>Visualizaciones de Big Data</title><content type='html'>Voy a hablar, más o menos, de un tema muy importante, pero que no domino mucho. Más bien, no domino ni de broma, pero debería. Me refiero a las visualizaciones.&lt;br /&gt;&lt;br /&gt;Me paso el día hablando a gente de que Hadoop es la caña, que si terabytes de datos, que si Cassandra por aquí que si HBase por allá, pero siempre hay que "visualizar" los datos no?, si nos curramos todo esto, al menos que se pueda mostrar el trabajo.&lt;br /&gt;&lt;br /&gt;La visualización es todo un mundo, hay que tocar un poco de matemáticas, un poco de estadística, informática y sobretodo arte.&lt;br /&gt;&lt;br /&gt;Voy a intentar hablar un poco más sobre visualizaciones en este blog, pero hoy vengo preparado con un gran ejemplo.&lt;br /&gt;&lt;br /&gt;Uno de mis ex-colegas en last.fm Martin Dittus (&lt;a href="http://dekstop.de/weblog/"&gt;blog&lt;/a&gt;, &lt;a href="http://www.last.fm/user/martind"&gt;last.fm&lt;/a&gt;, &lt;a href="http://twitter.com/#!/dekstop"&gt;twitter&lt;/a&gt;) se ha currado una visualización de todos los scrobbles de todos los trabajadores (y ex-trabajadores de last.fm). En &lt;a href="http://last.fm/user/grindthemall"&gt;mi caso&lt;/a&gt; estamos hablando de la visualización de 129.000 canciones en 7 años.&lt;br /&gt;&lt;br /&gt;Sobre este gran trabajo han aparecido comentarios en algunos lugares de la web, por ejemplo:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://datavis.dekstop.de/last.fm_heatmap_calendars/"&gt;El blog de Martin&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://infosthetics.com/archives/2011/09/revealing_the_listening_habits_of_lastfm_users.html"&gt;Infosthetics&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;Vamos a ver la visualización de mi historia musical:&amp;nbsp;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-8XsomzxZ7wo/TmX7d1brF4I/AAAAAAAAAa0/pGKMe7mI02o/s1600/grind_scrobbles.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-8XsomzxZ7wo/TmX7d1brF4I/AAAAAAAAAa0/pGKMe7mI02o/s1600/grind_scrobbles.jpg" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;http://last.fm/user/grindthemall&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;Vamos a analizarla un poco, en el eje de las X podemos ver los años, empezé a usar last.fm en el 2005, cuando &lt;a href="http://lluisr.blogspot.com/"&gt;un compañero de Gridcat&lt;/a&gt; me lo enseñó. Bueno, durante los primeros meses y hasta el Julio del 2006 podemos ver una historia de scrobbles un poco difusa y repartida por las 24 horas del día, básicamente demostrando que tenía unos horarios un tanto animales durante mis años universitarios.&lt;br /&gt;&lt;br /&gt;De repente los scrobbles se agrupan en 8/9 horas, si señores, empezé a trabajar en el&lt;a href="http://www.bsc.es/plantillaF.php?cat_id=50"&gt; B.S.C.&lt;/a&gt; con horario fijo. &amp;nbsp;Creí que se iba a ver un cambio en 2009, cuando me fui a vivir a Londres, pero parece que el cambio horario (sólo de una hora) no es suficiente como para visualizarse.&lt;br /&gt;&lt;br /&gt;Más temas, interesantes, parece que mantuve una buena disciplina de escuchas durante bastante tiempo. El color ( de verde a rojo ) indica la intensidad de scrobbling, en mi caso se puede mapear fácilmente al tipo de música que escuchaba. Colores más verdes indican pocos scrobbles por hora (escuchando probablemente &lt;a href="http://www.last.fm/tag/dark%20ambient"&gt;Dark Ambient&lt;/a&gt; o &lt;a href="http://www.last.fm/tag/post%20metal"&gt;Post Metal&lt;/a&gt;) y las rojas indican muchos scrobbles por hora, probablemente &lt;a href="http://www.last.fm/tag/grindcore"&gt;Grindcore&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;El próximo tema a destacar es Octubre del 2010 dónde claramente mi actividad baja, qué pasó? pues que me cogí 3 semanas y me fui a Nueva Zelanda. Y finalmente ya llegamos a Mayo de 2011, dónde mi actividad de scrobbles parece que empieza y termina antes, por una o dos horas, pues marca mi vuelta a España, con unos horarios un poco distintos a los que hacía de cuando estaba en el Reino Unido.&lt;br /&gt;&lt;br /&gt;Qué os parece? visualizar 7 años de canciones (y cambios en mi vida) con una sola imagen.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6541464271719475452-9044191206009985037?l=distribuint.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://distribuint.blogspot.com/feeds/9044191206009985037/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://distribuint.blogspot.com/2011/09/visualizaciones-de-big-data.html#comment-form' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6541464271719475452/posts/default/9044191206009985037'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6541464271719475452/posts/default/9044191206009985037'/><link rel='alternate' type='text/html' href='http://distribuint.blogspot.com/2011/09/visualizaciones-de-big-data.html' title='Visualizaciones de Big Data'/><author><name>Marc</name><uri>http://www.blogger.com/profile/05631004736020219907</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://4.bp.blogspot.com/_a84GcWW6wwE/TTcLNqDwGxI/AAAAAAAAAXc/KscglDtW6gI/S220/lant.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-8XsomzxZ7wo/TmX7d1brF4I/AAAAAAAAAa0/pGKMe7mI02o/s72-c/grind_scrobbles.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6541464271719475452.post-7346026972264658639</id><published>2011-09-05T07:54:00.003+01:00</published><updated>2011-09-05T07:54:30.219+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='hdfs'/><category scheme='http://www.blogger.com/atom/ns#' term='taller'/><category scheme='http://www.blogger.com/atom/ns#' term='map/reduce'/><category scheme='http://www.blogger.com/atom/ns#' term='ec2'/><category scheme='http://www.blogger.com/atom/ns#' term='hadoop'/><title type='text'>Taller de Hadoop en Zaragoza</title><content type='html'>El día 31 de Agosto dí una charla en Zaragoza sobre Hadoop, parte de los talleres que organiza &lt;a href="http://cachirulovalley.com/"&gt;Cachirulo Valley&lt;/a&gt;. Hoy quería subir las transparencias a &lt;a href="http://www.slideshare.net/marc.de.palol"&gt;slideshare&lt;/a&gt; cómo de costumbre, pero mirándolas me he dado cuenta de que no tiene mucho sentido ya que parece ser que mis presentaciones son muy gráficas. Así que he decidido hacer un pequeño resumen de la charla y colgarlo aquí. Espero que sirva para aclarar conceptos y como pequeña introducción a Hadoop.&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Qué es Hadoop y para qué sirve ?&amp;nbsp;&lt;/span&gt;&lt;br /&gt;Primero vamos a poner un problema, y luego alguien lo va a solucionar muy bien.&lt;br /&gt;Por allí al 200X Google tenía un problema, y este problema era básicamente una cantidad gigante de datos con que trabajar. Las soluciones que había por aquel entonces o bien no eran lo suficientemente potentes o eran demasiado caras, así que teniendo los recursos, la gente de Google diseñó su propia solución, que finalmente implementó, provó, puso en producción y finalmente, explicó a la comunidad mediante una serie de &lt;a href="http://research.google.com/pubs/papers.html"&gt;papers&lt;/a&gt;:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;MapReduce: Simplified Data Processing on Large Clusters &lt;/b&gt;del que ya hablé en este mismo blog.&lt;/li&gt;&lt;li&gt;&lt;b&gt;The Google File System&lt;/b&gt;.&lt;/li&gt;&lt;/ul&gt;Poco después, Doug Cutting, que estaba participando en un proyecto llamado &lt;a href="http://nutch.apache.org/"&gt;nutch&lt;/a&gt;&amp;nbsp;tuvo el mismo problema, qué hacer con tantos datos? encontró el paper de google y se puso a implementarlo, así de fácil, y así nació Hadoop, la implementación libre de los dos papers de Google.&lt;br /&gt;&lt;br /&gt;Aquí, igual que en el taller me voy a servir de una muy buena definición de Hadoop, de Parand Tony Darugar:&lt;br /&gt;&lt;blockquote&gt;"&lt;i&gt;Flexible infrastructure for large scale computational and data processing on a network of commodity hardware&lt;/i&gt;".&lt;/blockquote&gt;Vamos a analizar la frase:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;i&gt;Data processing: &lt;/i&gt;Hadoop no está pensado para problemas matemáticos, no estamos calculando simulaciones, no estamos calculando grafos. Hadoop es para procesar datos. Si no tienes muchos datos de entrada te estás equivocando de Framework.&amp;nbsp;&lt;/li&gt;&lt;li&gt;&lt;i&gt;Network:&lt;/i&gt;&amp;nbsp;I por qué en una red de ordenadores? pues porqué estás analizando tantos datos que no te caben en una sola máquina. Si los datos te caben en una sola&amp;nbsp;máquina te estás equivocando de Framework.&amp;nbsp;&lt;/li&gt;&lt;li&gt;&lt;i&gt;Large Scale&lt;/i&gt;: Muchos datos y muchas máquinas.&amp;nbsp;&lt;/li&gt;&lt;li&gt;&lt;i&gt;Commodity Hardware&lt;/i&gt;: Tenemos una red de máquinas. El hardware va a fallar, estadísticamente los discos duros van a estropear-se, la RAM se averiará y las placas base se van a fundir. Si tenemos mucho hardware tenemos muchas posibilidades de que hayan desgracias, así que Hadoop está preparado para correr en máquinas "baratas". Si el hardware &lt;b&gt;se va &lt;/b&gt;&amp;nbsp;a estropear y &lt;b&gt;habrá &lt;/b&gt;que reemplazarlo, al menos que sea barato no?&lt;/li&gt;&lt;li&gt;&lt;i&gt;Flexible&lt;/i&gt;: Si sabemos que el hardware se va a estropear durante la ejecución, Hadoop debe estar preparado para soportarlo. Vamos a ver un poco más adelante más detalles de esto, pero para empezar diré que el sistema de ficheros tiene réplicas de los ficheros (por defecto 3), por lo tanto si una máquina se estropea durante la ejecución no pasa nada, el fichero está en 2 otras máquinas, Hadoop se va a enterar, va a clasificar la máquina como "averiada" y va a continuar el job en otra parte.&amp;nbsp;&lt;/li&gt;&lt;/ol&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Qué es Big Data?&amp;nbsp;&lt;/span&gt;&lt;br /&gt;He insistido bastante en los "muchos datos", cuánto es exactamente "muchos datos"? pues es tan fácil como: "BIG DATA es cuando la cantidad de datos es un problema".&lt;br /&gt;&lt;br /&gt;Para alguien serán 100 gb, para alguien serán 1Tb y para algun otro seran petabytes.&lt;br /&gt;&lt;br /&gt;Vamos a profundizar un poco más con el tema del "problema". Yo personalmente creo que hay 3:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;i&gt;Tiempo&lt;/i&gt;: Las herramientas que uso funcionan bien con esta cantidad de datos, pero tarda mucho. Vamos a imaginar que tenemos una base de datos sobre la qual hay que correr una serie de procesos, el departamento de márketing necesita datos actualizados cada 10 horas. Si el proceso finaliza, pero tarda 15 horas tenemos un problema.&lt;/li&gt;&lt;li&gt;&lt;i&gt;Las herramientas dejan de funcionar&lt;/i&gt;: Tenemos un programa que funciona bien, crecen los datos y la herramienta cada vez va más lenta, pero no es un problema. Llega un momento que la herramienta simplemente de queda congelada con el input de datos. Tenemos otro problema.&amp;nbsp;&lt;/li&gt;&lt;li&gt;&lt;i&gt;Los datos no caben en la máquina:&lt;/i&gt; Tenemos 1 Terabyte (o lo que sea) de datos a tratar y simplemente los datos no caben en la máquina y hay que moverlos a trozos por la red.&amp;nbsp;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Worflow de trabajo en Hadoop.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;Ya sabemos qué hace Hadoop y ya sabemos cuándo tiene sentido empezar a utilizarlo. Ahora bien, cómo se trabaja?&lt;br /&gt;Hadoop consta de dos partes (como veremos en más detalle en el siguiente punto), un motor de map/reduce y un sistema de ficheros distribuido. Lo más importante en este punto es que nos imaginemos a Hadoop como una caja negra que es capaz de &lt;b&gt;almacenar&lt;/b&gt;&amp;nbsp;y &lt;b&gt;transformar&lt;/b&gt;&amp;nbsp;datos. Por lo tanto para trabajar lo que tenemos que hacer es:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Poner los datos nuevos en Hadoop (en caso de que haya): Ponemos los logs del día, los usuarios que se han dado de alta hoy, los eventos del día, etc, en el sistema de ficheros.&amp;nbsp;&lt;/li&gt;&lt;li&gt;Tratar los datos con un programa map/reduce.&amp;nbsp;&lt;/li&gt;&lt;li&gt;Sacar los datos del sistema de ficheros para ponerlos a un lugar dónde sean útiles. Vamos a recordar que de momento Hadoop es una caja negra, no es fácil que los del departamento de márketing usen los datos que hay en Hadoop, así que hay que sacarlos de allí y ponerlos en una base de datos, una nosql, una página web, lo que sea.&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Cómo funciona Hadoop? (Map/Reduce y su amigo el DFS)&lt;/span&gt;&lt;br /&gt;Hemos dicho que Hadoop &lt;b&gt;almacena&lt;/b&gt;&amp;nbsp;y &lt;b&gt;transforma&lt;/b&gt;&amp;nbsp;datos, almacena con un sistema de ficheros y trata los datos con un motor de map/reduce, vamos a verlos:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;(H)DFS: Hadoop Distributed File System.&lt;/b&gt;&lt;br /&gt;Vamos a empezar por el sistema de ficheros distribuido. Vamos a dejar claro que un sistema de ficheros distribuido es un tema muy serio y complejo. Nadie quiere poner sus ficheros en un sistema experimental con el riesgo de que desaparezcan ficheros, se corrompan o sean inaccesibles, por lo tanto, el principal requerimiento es su estabilidad y robustez.&lt;br /&gt;&lt;br /&gt;El HDFS fue diseñado a partir del paper del &lt;i&gt;Google File System&lt;/i&gt;, no me voy a liar mucho con la explicación de cómo funciona, pero voy a comentar algunas de sus características más importantes:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Simple by design: Aunque internamente un sistema de ficheros es muy complejo, el HDFS ha sido diseñado y implementado con un conjunto muy básico y limitado de funcionalidades. Así que no nos podemos esperar grandes "virguerías", al menos a nivel de usuario.&lt;/li&gt;&lt;li&gt;Robusto y replicado: Es robusto, recordemos que Hadoop está diseñado para ejecutarse en redes de hardware que puede estropearse en cualquier momento. El sistema de ficheros debe ser capaz de continuar trabajando efectivamente hasta un cierto nivel de error tolerable. Una de las características más importantes es que los ficheros están partidos por bloques, y que cada bloque está replicado 3 veces en el clúster, así que si una máquina cae o un disco duro se estropea no pasa nada, aún tenemos dos copias del bloque del fichero en la red.&lt;/li&gt;&lt;li&gt;Optimizado para Big Data: Los bloques son de 64 mb por defecto, por lo tanto, optimizado para la lectura y escritura de volumenes de datos grandes.&lt;/li&gt;&lt;li&gt;Escalable: El sistema debe escalar horizontalmente, si necesitas más espacio es tan fácil como poner más máquinas o ampliar los discos duros. El máster se va a encargar de repartir los bloques entre los nuevos nodos de forma transparente.&amp;nbsp;&lt;/li&gt;&lt;li&gt;Transparente: Hemos dicho que el sistema es sencillo de cara al usuario y que es robusto y escalable, que es tolerante a fallos y que balancea su carga automáticamente y además, sin que el usuario se entere de lo que está pasando. El nodo máster se encarga de todo de forma totalmente transparence. En caso de que una máquina se estropee, el máster va a encargarse de ponerla en una lista negra y va a mirar qué bloques de ficheros contenía, y va a replicarlos (cogiéndolos de otras máquinas) hasta que el número de replicas vuelva a ser el deseado.&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;A nivel un poco más técnico, todo el sistema de ficheros está controlado por un nodo &lt;i&gt;máster&lt;/i&gt;&amp;nbsp;que se llama el NameNode, podéis ver más información &lt;a href="http://hadoop.apache.org/common/docs/current/hdfs_design.html"&gt;aquí&lt;/a&gt;.&lt;/div&gt;&lt;br /&gt;&lt;b&gt;Map/Reduce&lt;/b&gt;&lt;br /&gt;El motor de map/reduce es la parte que realiza los cálculos y transformaciones sobre los datos. Básicamente se trata de una serie de componentes software que ejecutan un programa, programado en Java (o alguna otra alternativa que veremos más tarde) que sigue el model de programación del mismo nombre (map/reduce).&lt;br /&gt;&lt;br /&gt;Bien, pero qué es esto del map/reduce? pues se trata de un esquema de programación paralela que tiene sus orígenes en la programación funcional. Encontraréis mucha más información por la red, pero lo básico y lo importante ahora mismo es entender un poco el concepto, que es bastante sencillo.&lt;br /&gt;&lt;br /&gt;Tenemos un problema, A, este problema es muy grande y no se puede tratar de forma individual, por lo tanto vamos a coger una función, a la que llamaremos mapper y la vamos a aplicar a trozos de A, de forma que tendremos:&lt;br /&gt;&lt;blockquote&gt;&amp;nbsp;A&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;1 &lt;/span&gt;--&amp;gt;&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt; &lt;/span&gt;&lt;b&gt;Mapper&lt;/b&gt;&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt; &lt;/span&gt;--&amp;gt;&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt; &lt;/span&gt;A'&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;1&lt;/span&gt;&amp;nbsp;&amp;nbsp;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;A&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;2&amp;nbsp;&lt;/span&gt;--&amp;gt;&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;b&gt;Mapper&lt;/b&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;&amp;nbsp;&lt;/span&gt;--&amp;gt;&amp;nbsp;&lt;span class="Apple-style-span" style="font-size: small;"&gt;A'&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;2&lt;/span&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&amp;nbsp; ...&lt;br /&gt;&amp;nbsp;A&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;x&amp;nbsp;&lt;/span&gt;--&amp;gt;&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;Mapper&lt;/b&gt;&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;&amp;nbsp;&lt;/span&gt;--&amp;gt;&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;&amp;nbsp;&lt;/span&gt;A'&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;x&lt;/span&gt;&lt;/blockquote&gt;&lt;br /&gt;Ya tenemos parte del problema resuelto, pero en trozos, ahora toca aplicar el reducer, que es otra función que sabe interpretar y juntar los pequeños resultados que nos ha dado el mapper. De tal modo que:&lt;br /&gt;&lt;blockquote&gt;[A'&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;1&lt;/span&gt;, A'&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;2&lt;/span&gt;, ... , A'&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;x&lt;/span&gt;] --&amp;gt; &lt;b&gt;Reducer&lt;/b&gt; --&amp;gt; Resultado.&lt;/blockquote&gt;No es más que aplicar el 'divide y vencerás' sobre un fichero muy grande. Lógicamente no todos los problemas se pueden resolver con este modelo de programación, es por esto que cale ver si Hadoop es la mejor solución antes de lanzarnos a crear un proyecto.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Ejemplos de código:&amp;nbsp;&lt;/span&gt;&lt;br /&gt;En el taller vimos un par de ejemplos (muy básicos y sencillos cabe decir). Están colgados en &lt;a href="https://github.com/lant/ejercicios_hadoop"&gt;github&lt;/a&gt; y bastante comentados. Otro recurso para tutoriales de programación Java en Hadoop en su &lt;a href="http://hadoop.apache.org/common/docs/current/mapred_tutorial.html"&gt;página oficial&lt;/a&gt;, bastante más completo.&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Clúster virtual en EC2 vs Clúster local.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;Tengo que admitir que soy bastante novato en este aspecto. Siempre he tenido la suerte de trabajar con un &lt;a href="http://www.flickr.com/photos/lastfm/tags/datacenter/"&gt;clúster dedicado&lt;/a&gt;&amp;nbsp;así que eché una ojeada rápida para crear un pequeño clúster virtual en EC2. Según he visto hay 3 possibilidades:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Pico y pala: Creas los nodos manualmente y te instalas Hadoop.&amp;nbsp;&lt;/li&gt;&lt;li&gt;Scripts en el src de Hadoop.&lt;/li&gt;&lt;li&gt;&lt;a href="http://whirr.apache.org/"&gt;Apache Whirr&lt;/a&gt;.&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;Lógicamente escogí la más rápida, en este caso Whirr, que es un proyecto que trata de facilitarnos la creación de clústeres en plataformas de virtualización. El proyecto es bastante joven y aún le falta, pero ya se puede utilizar con unos resultados muy satisfactorios. Con este simple fichero de configuración pude crear un cluster en amazon:&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;blockquote&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;whirr.cluster-name=hadoop&lt;br /&gt;whirr.instance-templates=&lt;br /&gt;&amp;nbsp; 1 hadoop-namenode+hadoop-jobtracker,&lt;br /&gt;&amp;nbsp; 2 hadoop-datanode+hadoop-tasktracker&lt;br /&gt;whirr.provider=aws-ec2&lt;br /&gt;whirr.identity=*************&lt;br /&gt;whirr.credential=***********&lt;br /&gt;whirr.hardware-id=c1.xlarge&lt;br /&gt;whirr.image-id=us-east-1/ami-da0cf8b3&lt;br /&gt;whirr.location-id=us-east-1&lt;/span&gt;&lt;/blockquote&gt;Creo que es bastante autoexplicativo, pero podéis encontrar más detalles en su página web.&lt;br /&gt;&lt;br /&gt;La clara ventaja sobre los clústeres virtuales sobre los clústeres físicos es claramente la inversión inicial ya que no hay que comprar las máquinas (y el espacio en el datacenter), ni pagar mensualmente la electricidad + mantenimiento, bla bla. Aunque sí que tengo que decir que he oído que el rendimiento de un clúster dedicado es mucho mayor a la que nos encontraremos utilizando un clúster virtual. Del orden de 10 veces más rápido, aunque este número tendría que verse de forma un poco más "científica", cómo dije, esto es un rumor que me dijo un usuario de EC2 que se pasó a clúster dedicado.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Ecosistema de Hadoop&lt;/span&gt;&lt;br /&gt;Hasta ahora he hablado del &lt;i&gt;core &lt;/i&gt;de Hadoop. Como se ha visto es muy potente, pero es bastante espartano y no da muchas facilidades amigables al usuario o programador. No obstante el proyecto tuvo una gran adopción, debido a que era software libre y a que básicamente era lo único disponible. Esto causó que muchas empresas pusieran recursos para mejorar el proyecto y crear pequeños proyectos auxiliares que con el tiempo se han convertido en partes importantes de un ecosistema muy activo.&lt;br /&gt;&lt;br /&gt;Podéis encontrar más información sobre los proyectos que considero más interesantes en un post que ya escribí en este mismo &lt;a href="http://distribuint.blogspot.com/2010/09/el-ecosistema-hadoop.html"&gt;blog&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Preguntas?&lt;/span&gt;&lt;br /&gt;Esto ha sido una pequeña introducción a Hadoop, muy a &lt;i&gt;grosso modo&lt;/i&gt;&amp;nbsp;y sin entrar en detalles peliagudos. Como siempre, si tenéis alguna duda no dudéis en preguntarla en la sección de comentarios o bien contactando conmigo.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6541464271719475452-7346026972264658639?l=distribuint.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://distribuint.blogspot.com/feeds/7346026972264658639/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://distribuint.blogspot.com/2011/09/taller-de-hadoop-en-zaragoza.html#comment-form' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6541464271719475452/posts/default/7346026972264658639'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6541464271719475452/posts/default/7346026972264658639'/><link rel='alternate' type='text/html' href='http://distribuint.blogspot.com/2011/09/taller-de-hadoop-en-zaragoza.html' title='Taller de Hadoop en Zaragoza'/><author><name>Marc</name><uri>http://www.blogger.com/profile/05631004736020219907</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://4.bp.blogspot.com/_a84GcWW6wwE/TTcLNqDwGxI/AAAAAAAAAXc/KscglDtW6gI/S220/lant.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6541464271719475452.post-4435647522214782598</id><published>2011-03-29T10:55:00.001+01:00</published><updated>2011-03-29T10:57:09.691+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='hadoop'/><title type='text'>Hadoop NG, o cómo liarla gorda.</title><content type='html'>&lt;div&gt;Hace un tiempo vi en diferentes blogs de Yahoo! su propuesta para una reimplementación de una parte bastante importante de Hadoop. Una propuesta interesante, pero que creí bastante teórica. Bueno, pues la semana pasada pude ir a otra edición del grupo de usuarios de hadoop del reino unido, en el que Owen O'malley mismo presentó estas mismas ideas a la comunidad, podéis ver la página del evento así como las presentaciones en:&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://lanyrd.com/2011/an-evening-with-hadoop/"&gt;http://lanyrd.com/2011/an-evening-with-hadoop/&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Entrando un poco más en detalle. Esta propuesta (que está en fase de testing en Yahoo! por lo tanto, de teórico nada) se trata de sustituir el JobTracker de Hadoop (la parte que lanza los jobs a los diferentes nodos que forman el cluster de Hadoop) por dos nuevos elementos:&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Un Resource Manager / Scheduler: &lt;/b&gt;El cual cogerá los requerimientos del job en concreto y buscará un nodo capaz de poder realizarlo.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Un Node Manager en cada nodo&lt;/b&gt;: El cual monitorizará el nodo y informará al Resource Manager. Dentro de este nodo el Node Manager será capaz de crear un container, dentro del qual se ejecutará el mapper, el reducer, y lo que es más interesante: o lo que sea. Ya que este diseño pretende hacer de Hadoop un framework de programación distribuido general.&amp;nbsp;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;podéis encontrar más información ( y mucho más detallada ) en:&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://developer.yahoo.com/blogs/hadoop/posts/2011/03/mapreduce-nextgen-scheduler/"&gt;http://developer.yahoo.com/blogs/hadoop/posts/2011/03/mapreduce-nextgen-scheduler/&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://developer.yahoo.com/blogs/hadoop/posts/2011/02/mapreduce-nextgen/"&gt;http://developer.yahoo.com/blogs/hadoop/posts/2011/02/mapreduce-nextgen/&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Mis primeras impresiones fueron bastante negativas. En primer lugar porque estamos sustituiendo un elemento QUE FUNCIONA de Hadoop por otro de mucho más complejo. Y en segudo lugar por la complejidad de este segundo elemento. No quisiera parecer conservador pero mis temores se fundamentan en la experiencia que tuve con otros middlewares de computación distribuida, en los que estabas más tiempo definiendo las características del job en un "&lt;i&gt;formato simple de definición genérica de jobs&lt;/i&gt;" en XML que programando el job en sí mismo.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Otro aspecto es que como ya he dicho anteriormente este Node Manager permitiría no sólo crear containers con mappers o reducers, sino otro tipo de containers (implementados por la comunidad) en los que se podría lanzar otro tipo de procesos (intensivos de CPU, MPI, ...). Tampoco me hizo mucha gracia esto, y otra vez fue por culpa de alguna mala experiencia. Lo que me gustó de Hadoop desde el principio es que era un framework que sólo hacía una cosa, pero que la hacía muy bien. Cosa que no hacían otros, que intentaban hacer muchas cosas diferentes y no hacían nada bien.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Aproveché la ronda de cervezas del final de la reunión para ver más opiniones acerca de estos cambios, las conclusiones que saqué es que la gente es muy optimista, frases que oí mucho:&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;i&gt;La comunidad hadoop será capaz de hacerlo bien.&lt;/i&gt;&lt;/li&gt;&lt;li&gt;&lt;i&gt;Asi podremos aprovechar el cluster para más cosas.&amp;nbsp;&lt;/i&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;Veremos qué tal la primera, espero que si :) en cuando a la segunda, es pura verdad.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Estoy viendo muchos clústers dedicados 100% a hadoop/map reduce. Esto no es necesariamente malo, pero como no me canso de decir, Map Reduce es un modelo de programación y va muy bien para unas cosas y va muy mal para otras. El hecho de que sólo haya instalado Hadoop en un cluster hace que todo tenga que estar programado siguiendo una estrategia map/reduce o tengamos que instalar otro framework &amp;nbsp;(&lt;a href="http://www.cs.wisc.edu/condor/"&gt;Condor&lt;/a&gt;/&lt;a href="http://www.globus.org/toolkit/"&gt;Globus&lt;/a&gt;/...) en las mismas máquinas. Por ejemplo he sido testigo de un intento (que acabó en nada) de implementar un Load Tester con Hadoop, cuando claramente map/reduce no es el modelo más apropiado (que se puede hacer ojo!, simplemente digo que hay cosas mejores).&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Si la comunidad Hadoop consigue hacerlo bien Hadoop se puede convertir en un framework de sistemas distribuidos &lt;i&gt;_genérico_&lt;/i&gt;, cosa que facilitaría mucho la tarea de administradores de sistema, ya que sólo tendríamos que tener Hadoop instalado. Pero bueno, estamos hablando de largo plazo.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Asi que más o menos, cambié de opinión, aún me quedan dudas sobre la complejidad de estos nuevos componentes.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6541464271719475452-4435647522214782598?l=distribuint.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://distribuint.blogspot.com/feeds/4435647522214782598/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://distribuint.blogspot.com/2011/03/hace-un-tiempo-vi-en-diferentes-blogs.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6541464271719475452/posts/default/4435647522214782598'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6541464271719475452/posts/default/4435647522214782598'/><link rel='alternate' type='text/html' href='http://distribuint.blogspot.com/2011/03/hace-un-tiempo-vi-en-diferentes-blogs.html' title='Hadoop NG, o cómo liarla gorda.'/><author><name>Marc</name><uri>http://www.blogger.com/profile/05631004736020219907</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://4.bp.blogspot.com/_a84GcWW6wwE/TTcLNqDwGxI/AAAAAAAAAXc/KscglDtW6gI/S220/lant.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6541464271719475452.post-7495003165800017927</id><published>2011-03-17T10:47:00.000Z</published><updated>2011-03-17T10:47:17.918Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='opendata'/><title type='text'>Open Data Manual</title><content type='html'>Me acabo de encontrar esto por los Internets:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://opendatamanual.org/"&gt;http://opendatamanual.org/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Se trata de un documento que pretende, cito:&lt;br /&gt;&lt;blockquote&gt;This report discusses legal, social and technical aspects of open data. The manual can be used by anyone but is especially designed for those seeking to open up data. It discusses the why, what and how of open data — why to go open, what open is, and the how to ‘open’ data&lt;/blockquote&gt;Muy interesante el contenido (aún no he tenido oportunidad de leerlo todo, pero bueno) y también el formato, dónde te permite hacer comentarios y discusiones en cada parágrafo.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6541464271719475452-7495003165800017927?l=distribuint.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://distribuint.blogspot.com/feeds/7495003165800017927/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://distribuint.blogspot.com/2011/03/open-data-manual.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6541464271719475452/posts/default/7495003165800017927'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6541464271719475452/posts/default/7495003165800017927'/><link rel='alternate' type='text/html' href='http://distribuint.blogspot.com/2011/03/open-data-manual.html' title='Open Data Manual'/><author><name>Marc</name><uri>http://www.blogger.com/profile/05631004736020219907</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://4.bp.blogspot.com/_a84GcWW6wwE/TTcLNqDwGxI/AAAAAAAAAXc/KscglDtW6gI/S220/lant.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6541464271719475452.post-2248328209112943262</id><published>2011-03-12T17:56:00.000Z</published><updated>2011-03-12T17:56:48.488Z</updated><title type='text'>Dev Fort</title><content type='html'>Aunque este post salga bastante de la temática del blog creo que es interesante.&lt;br /&gt;&lt;br /&gt;Últimamente he estado dando vueltas al tema de la productividad. Que si metodologías ágiles, que si buen equipo informático, que si las herramientas idóneas. Sí muy bien, pero no sería mejor meterse con el equipo de desarrollo durante una semana en castillo en una isla sin Internet ?&lt;br /&gt;&lt;br /&gt;Pues esto existe y se llama &lt;a href="http://devfort.com/"&gt;/dev/fort&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;La idea es muy sencilla, se trata de ponerse con el grupo de desarrollo (diseñadores/programadores) en un lugar aislado, sin ningún tipo de conexión a Internet y concentrarse en una sóla idea y a implementarla.&lt;br /&gt;&lt;br /&gt;La idea de desarrollar sin conexión a la red puede ser un poco chocante al principio, esto significa que tienes que ir bien preparado, con librerías, documentaciones y programas de desarrollo en el portátil, pero es sin duda una muy buena idea. Si contara las horas de productividad que he perdido en Reddit/Wikipedia/Twitter... en fin.&lt;br /&gt;&lt;br /&gt;Volviendo al /dev/fort, unos compañeros de trabajo participaron en la quinta edición y hicieron esto: &lt;a href="http://spacelog.org/"&gt;http://spacelog.org&lt;/a&gt; , la parte curiosa es que compraron el dominio en el aeropuerto de vuelta a l&lt;i&gt;a civilización&lt;/i&gt; mientras subían todo el código a &lt;a href="http://www.github.com/"&gt;github&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;En fin, no deja de ser una idea interesante y curiosa. A lo mejor convierto casa mis padres en un castillo por el próximo desafío &lt;a href="http://www.abredatos.es/"&gt;Abredatos&lt;/a&gt; :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6541464271719475452-2248328209112943262?l=distribuint.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://distribuint.blogspot.com/feeds/2248328209112943262/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://distribuint.blogspot.com/2011/03/dev-fort.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6541464271719475452/posts/default/2248328209112943262'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6541464271719475452/posts/default/2248328209112943262'/><link rel='alternate' type='text/html' href='http://distribuint.blogspot.com/2011/03/dev-fort.html' title='Dev Fort'/><author><name>Marc</name><uri>http://www.blogger.com/profile/05631004736020219907</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://4.bp.blogspot.com/_a84GcWW6wwE/TTcLNqDwGxI/AAAAAAAAAXc/KscglDtW6gI/S220/lant.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6541464271719475452.post-3330693029501502859</id><published>2011-03-09T13:59:00.000Z</published><updated>2011-03-09T13:59:21.032Z</updated><title type='text'>Experimento (Data Science y España)</title><content type='html'>LinkedIn te da una gráfica en la que se muestra el número de veces que tu perfil sale en las búsquedas. Yo tengo un perfil bastante acorde a "data science" y lógicamente, la localización es Londres.&lt;br /&gt;&lt;br /&gt;El otro día decidí hacer un experimento y cambiar la localización a Barcelona.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://lh3.googleusercontent.com/-TDbS6XrV_JY/TXeHRlChWZI/AAAAAAAAAZE/6H5gaPQvEgs/s1600/linkedin_search.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="207" src="https://lh3.googleusercontent.com/-TDbS6XrV_JY/TXeHRlChWZI/AAAAAAAAAZE/6H5gaPQvEgs/s320/linkedin_search.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Puede, el avispado lector, adivinar qué día cambié la localización?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6541464271719475452-3330693029501502859?l=distribuint.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://distribuint.blogspot.com/feeds/3330693029501502859/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://distribuint.blogspot.com/2011/03/experimento-data-science-y-espana.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6541464271719475452/posts/default/3330693029501502859'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6541464271719475452/posts/default/3330693029501502859'/><link rel='alternate' type='text/html' href='http://distribuint.blogspot.com/2011/03/experimento-data-science-y-espana.html' title='Experimento (Data Science y España)'/><author><name>Marc</name><uri>http://www.blogger.com/profile/05631004736020219907</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://4.bp.blogspot.com/_a84GcWW6wwE/TTcLNqDwGxI/AAAAAAAAAXc/KscglDtW6gI/S220/lant.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='https://lh3.googleusercontent.com/-TDbS6XrV_JY/TXeHRlChWZI/AAAAAAAAAZE/6H5gaPQvEgs/s72-c/linkedin_search.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6541464271719475452.post-624401884284309359</id><published>2010-12-17T17:51:00.000Z</published><updated>2010-12-17T17:51:01.664Z</updated><title type='text'>Mi presentación en el Huguk #7</title><content type='html'>&lt;div style="text-align: left;"&gt;Y como ya anuncié en un post anterior, aquí teneis el video de mi presentación:&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;iframe frameborder="0" height="300" src="http://player.vimeo.com/video/17617661" width="400"&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;a href="http://vimeo.com/17617661"&gt;HUGUK#7 - Using HFile outside HBase by Marc de Palol (Last.fm)&lt;/a&gt; &amp;nbsp;on &lt;a href="http://vimeo.com/"&gt;Vimeo&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6541464271719475452-624401884284309359?l=distribuint.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://distribuint.blogspot.com/feeds/624401884284309359/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://distribuint.blogspot.com/2010/12/mi-presentacion-en-el-huguk-7.html#comment-form' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6541464271719475452/posts/default/624401884284309359'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6541464271719475452/posts/default/624401884284309359'/><link rel='alternate' type='text/html' href='http://distribuint.blogspot.com/2010/12/mi-presentacion-en-el-huguk-7.html' title='Mi presentación en el Huguk #7'/><author><name>Marc</name><uri>http://www.blogger.com/profile/05631004736020219907</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://4.bp.blogspot.com/_a84GcWW6wwE/TTcLNqDwGxI/AAAAAAAAAXc/KscglDtW6gI/S220/lant.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6541464271719475452.post-2269086203701108067</id><published>2010-11-25T17:29:00.000Z</published><updated>2010-11-25T17:29:10.093Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='opendata'/><category scheme='http://www.blogger.com/atom/ns#' term='ogov'/><category scheme='http://www.blogger.com/atom/ns#' term='Catalunya'/><category scheme='http://www.blogger.com/atom/ns#' term='linked data'/><title type='text'>OpenData en Catalunya</title><content type='html'>Hace poco la Generalitat se sumó a las iniciativas de otros gobiernos para la apertura de datos y abrió un nuevo portal: &lt;a href="http://opendata.gencat.cat/"&gt;http://opendata.gencat.cat&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Como me interesa mucho el tema decidí hacer una buena ojeada al portal y explicar aquí mis opiniones al respecto. Y aquí están (más vale tarde que nunca).&lt;br /&gt;&lt;br /&gt;Asi que vamos a ver las secciones del portal, luego los datos y finalmente algunas conclusiones que se me ocurren:&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Secciones:&lt;/span&gt;&lt;br /&gt;El portal está dividido en tres secciones: El catálogo, el proyecto en sí y además otra sección que habla del Open Data.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Vamos a ver la sección de catálogo:&lt;/b&gt;&lt;br /&gt;Está muy bien organizada, los datos están en subsecciones bien clasificadas y con datos destacados. De momento 12 conjuntos de datos. Lógicamente son pocos, pero también estamos hablando de un portal nuevo que tiene poco tiempo de vida, sin duda vamos a ver como se van añadiendo más.&lt;br /&gt;&lt;br /&gt;El siguiente punto es una lista de aplicaciones ya hechas. Esto es muy importante de cada al ciudadano ya que permite demostrar que la apertura de datos es útil y que realmente aporta valor. Todas las aplicaciones (al menos eso me parece) están hechas por la Generalitat. Realmente me ha gustado que incorporaran esta sección ya que si no se corre el riesgo de que se haga la pregunta: &lt;i&gt;"Y esto, para qué sirve?"&lt;/i&gt;, aquí tienes la respuesta en forma de 8 aplicaciones prácticas. Espero que pronto pueda participar yo también!&lt;br /&gt;&lt;br /&gt;Por si esta subsección no fuera suficiente para demostrar la utilidad del opendata para el ciudadano de a pie tenemos otra subsección con enlaces a proyectos en curso, unas quince aplicaciones más que utilizan los datos (todas impulsadas por la Generalitat parece).&lt;br /&gt;&lt;br /&gt;&lt;b&gt;El proyecto:&lt;/b&gt;&lt;br /&gt;La siguiente sección es bastante sencilla, se explica qué es el proyecto y también una explicación del acuerdo de gobierno que ha hecho posible la creación del porta. Bueno muy bien, supongo que tenía que salir a algún lado, pero vamos a la sección &lt;s&gt;interesante&lt;/s&gt;&amp;nbsp;importante, la licencia.&lt;br /&gt;&lt;br /&gt;No soy ningún experto, pero creo que son las que deben ser. Agradecería si algún experto en el tema me lo pudiera confirmar, pero lo más importante es para mi:&lt;br /&gt;&lt;blockquote&gt;&lt;i&gt;Reconeixement (by): Es permet qualsevol explotació de l'obra, incloent-hi una finalitat comercial, així com la creació d'obres derivades, la distribució de les quals també està permesa sense cap restricció&lt;/i&gt;.&lt;/blockquote&gt;y&lt;br /&gt;&lt;blockquote&gt;&lt;i&gt;Reconeixement - SenseObraDerivada (by-nd): Es permet l'ús comercial de l'obra però no la generació d'obres derivades.&lt;/i&gt;&lt;/blockquote&gt;Las dos Creative Commons.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Qué es Open Data&lt;/b&gt;&lt;br /&gt;La última sección es un poco más de información sobre que es el Open Data, los diferentes formatos que existen y experiencias en otros paises, temas de los que ya &lt;a href="http://distribuint.blogspot.com/search/label/ogov"&gt;he ido hablando en este blog&lt;/a&gt;, por lo que no me voy a enrollar mucho más. Vamos a otro tema más interesante, los datos que el portal ofrece:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Los Datos&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;Tenemos ocho secciones:&lt;br /&gt;&lt;br /&gt;&lt;i&gt;&lt;b&gt;Trámites y procedimientos administrativos:&amp;nbsp;&lt;/b&gt;&lt;/i&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Tenemos 2 datasets, uno para trámites ciudadanos y otro para trámites de empresas, los dos en RDF. Después de echarle una ojeada al fichero veo que utilizan un redireccionador para las ontologías de términos (&lt;a href="http://purl.org/"&gt;http://purl.org&lt;/a&gt;, yo no lo conocía pero está bien la idea). El fichero RDF está muy bien hecho, como dijo alguien en Twitter (ahora no me lo hagáis buscar por favor) el fichero está tan bien que se puede leer. Esto es mucho, recordad que hablamos de ficheros RDF.&amp;nbsp;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;b&gt;&lt;i&gt;Datos estadísticos: &lt;/i&gt;&lt;/b&gt;Esta sección nos ofrece unos links a la API REST de Idescat. Hice un wrapper de esta API en Java, la podéis encontrar en &lt;a href="https://github.com/lant/idescat-java"&gt;Github&lt;/a&gt; y la intento mantener al día con los cambios de la API (y lógicamente doy la bienvenida a cualquier tipo de colaboraciones).&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="color: #666666;"&gt;Indicadores económicos:&lt;/span&gt; Diferentes datos económicos.&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="color: #666666;"&gt;Poblaciones y muncipios de Catalunya: &lt;/span&gt;Lista de las poblaciones de Catalunya.&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="color: #666666;"&gt;Rectificaciones de Idescat: &lt;/span&gt;Y rectificaciones de datos.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;b&gt;&lt;i&gt;Datos geográficos y cartográficos:&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="color: #666666;"&gt;Equipamientos de Catalunya&lt;/span&gt;: Otro fichero RDF (cuidadín que es grande, si lo intentais abrir con el navegador a lo mejor os fríe la máquina). Este fichero contiene los datos sobre 26000 equipamientos (escuelas, hospitales, bibliotecas...) como son teléfonos, horarios, direcciones. Un lujo vaya.&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="color: #666666;"&gt;Cartografía de Catalunya&lt;/span&gt;: Mapas, muchos mapas, en formatos que yo desconozco.&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="color: #666666;"&gt;Servicios de posicionamiento geodésico:&lt;/span&gt; También formatos muy raros :P&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;b&gt;&lt;i&gt;Datos visuales:&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="color: #666666;"&gt;Imágenes y videos de Catalunya&lt;/span&gt;: Links a una API y una página web dónde puedes decargarte fotos y videos sobre Catalunya.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;b&gt;&lt;i&gt;Datos lingüsticos:&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="color: #666666;"&gt;Terminologia Abierta&lt;/span&gt;: Aquí podemos encontrar muchos XML's clasificados en areas temáticas con su traducción al catalán, español, francés e inglés.&amp;nbsp;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;b&gt;&lt;i&gt;Datos Metereologicos:&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="color: #666666;"&gt;Predicciones&lt;/span&gt;: Ficheros XML con las predicciones metereológicas en diferentes zonas de Catalunya.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;b&gt;&lt;i&gt;Datos de actualidad:&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="color: #666666;"&gt;Noticias:&lt;/span&gt;&amp;nbsp;RSS's con las noticias de las diferentes areas de la Generalitat.&amp;nbsp;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;b&gt;&lt;i&gt;Tránsito y mobilidad:&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="color: #666666;"&gt;Transporte público&lt;/span&gt;: RSS's con las noticias de diferentes linias de Regionales (de la Generalitat)&amp;nbsp;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Mis conclusiones:&amp;nbsp;&lt;/span&gt;&lt;br /&gt;Estoy muy contento que la Generalitat haya realizado este esfuerzo, lógicamente aún está muy lejos de monstruos com &lt;a href="http://data.gov.uk/"&gt;data.gov.uk&lt;/a&gt; (del Reino Unido) o &lt;a href="http://data.gov/"&gt;data.gov&lt;/a&gt; (de U.S.A.) es un primer paso.&lt;br /&gt;&lt;br /&gt;Los datos, aunque pocos aún, están muy bien estructurados y los formatos son los que tocan, de momento no me he encontrado ninguna sorpresa ni&lt;a href="http://twitter.com/#!/lant/status/24220849097"&gt; ninguna macro&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Sin duda ahora lo que toca es crear una buena comunidad que aporte ideas y lo más importante, aplicaciones reales para mejorar la situación ciutadana.&lt;br /&gt;&lt;br /&gt;A raiz de esto estoy pensando en ampliar mi proyecto en github para hacerlo un poco más general y aportar mi granito de arena al #opendata Catalán. Si alguien se anima ya sabe a dónde encontrarme!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6541464271719475452-2269086203701108067?l=distribuint.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://distribuint.blogspot.com/feeds/2269086203701108067/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://distribuint.blogspot.com/2010/11/opendata-en-catalunya.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6541464271719475452/posts/default/2269086203701108067'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6541464271719475452/posts/default/2269086203701108067'/><link rel='alternate' type='text/html' href='http://distribuint.blogspot.com/2010/11/opendata-en-catalunya.html' title='OpenData en Catalunya'/><author><name>Marc</name><uri>http://www.blogger.com/profile/05631004736020219907</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://4.bp.blogspot.com/_a84GcWW6wwE/TTcLNqDwGxI/AAAAAAAAAXc/KscglDtW6gI/S220/lant.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6541464271719475452.post-3210469845661047838</id><published>2010-11-22T17:48:00.000Z</published><updated>2010-11-22T17:48:05.129Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='hfile'/><category scheme='http://www.blogger.com/atom/ns#' term='hbase'/><category scheme='http://www.blogger.com/atom/ns#' term='huguk'/><category scheme='http://www.blogger.com/atom/ns#' term='hadoop'/><title type='text'>Presentación en el HUGUK #7</title><content type='html'>La semana pasada hice una presentación en una de las reuniones de usuarios de &lt;a href="http://huguk.org/"&gt;Hadoop UK&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Se trató de utilizar el formato &lt;a href="http://hbase.apache.org/docs/r0.20.4/api/org/apache/hadoop/hbase/io/hfile/HFile.html"&gt;HFile&lt;/a&gt;&amp;nbsp;fuera de su entorno, que es HBase. Os dejo la presentación en slideshare:&lt;br /&gt;&lt;br /&gt;&lt;div id="__ss_5863380" style="width: 425px;"&gt;&lt;object height="355" id="__sse5863380" width="425"&gt;&lt;param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=hfile-101122111812-phpapp01&amp;stripped_title=hfile-5863380&amp;userName=marc.de.palol" /&gt;&lt;param name="allowFullScreen" value="true"/&gt;&lt;param name="allowScriptAccess" value="always"/&gt;&lt;embed name="__sse5863380" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=hfile-101122111812-phpapp01&amp;stripped_title=hfile-5863380&amp;userName=marc.de.palol" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;div style="padding: 5px 0 12px;"&gt;&lt;br /&gt;Espero que en poco tiempo pueda poner un link al video.&amp;nbsp;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6541464271719475452-3210469845661047838?l=distribuint.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://distribuint.blogspot.com/feeds/3210469845661047838/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://distribuint.blogspot.com/2010/11/presentacion-en-el-huguk-7.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6541464271719475452/posts/default/3210469845661047838'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6541464271719475452/posts/default/3210469845661047838'/><link rel='alternate' type='text/html' href='http://distribuint.blogspot.com/2010/11/presentacion-en-el-huguk-7.html' title='Presentación en el HUGUK #7'/><author><name>Marc</name><uri>http://www.blogger.com/profile/05631004736020219907</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://4.bp.blogspot.com/_a84GcWW6wwE/TTcLNqDwGxI/AAAAAAAAAXc/KscglDtW6gI/S220/lant.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6541464271719475452.post-952207965840165568</id><published>2010-09-29T22:19:00.002+01:00</published><updated>2010-09-29T22:22:47.059+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='avro'/><category scheme='http://www.blogger.com/atom/ns#' term='flume'/><category scheme='http://www.blogger.com/atom/ns#' term='dfs'/><category scheme='http://www.blogger.com/atom/ns#' term='hive'/><category scheme='http://www.blogger.com/atom/ns#' term='pig'/><category scheme='http://www.blogger.com/atom/ns#' term='hbase'/><category scheme='http://www.blogger.com/atom/ns#' term='zookeeper'/><category scheme='http://www.blogger.com/atom/ns#' term='hadoop'/><title type='text'>El Ecosistema Hadoop.</title><content type='html'>&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;Hadoop es sin duda uno de los proyectos que más acogida últimamente ha tenido entre la comunidad de software libre y es también uno de los responsables del auge de la ciencia de datos.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;Hadoop es un framework, aunque hoy en día se puede hablar de todo un ecosistema de proyectos alrededor del nucleo, vamos a intentar explicar en este post los distintos componentes de forma senzilla:&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;vamos a empezar por el principio,&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif; font-size: x-large;"&gt;Hadoop&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;Con Hadoop nos referimos a la parte central del sistema, que es el sistema de ficheros distribuido (HDFS) y el motor de Map/Reduce. Si echamos un vistazo a la &lt;/span&gt;&lt;a href="http://hadoop.apache.org/"&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;página del proyecto&lt;/span&gt;&lt;/a&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt; veremos que hay 3 subproyectos, calma y tranquilidad!, a efectos prácticos van totalmente juntos y es una separación que se hizo por temas de código fuente:&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;Hadoop MapReduce.&lt;/span&gt;&lt;/i&gt;&lt;/li&gt;&lt;li&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;HDFS.&lt;/span&gt;&lt;/i&gt;&lt;/li&gt;&lt;li&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;Hadoop - Commons.&lt;/span&gt;&lt;/i&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;Una vez aclarado el tema de la separación. Qué es Hadoop? Pues es la combinación de:&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;un sistema de ficheros distribuido (diferentes discos duros en diferentes máquines se ven como uno solo) (&lt;/span&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;HDFS)&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;de un modelo de programación que se llama Map/Reduce, con su API en Java (&lt;/span&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;Hadoop MapReduce&lt;/span&gt;&lt;/b&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;)&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;y un componente software que ejecuta los programas que hemos programado con la API en un cluster, usando asi el sistema de ficheros distribuido.&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-style: normal;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;y una serie de classes comunas&lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt; &lt;/span&gt;&lt;/b&gt;&lt;span class="Apple-style-span" style="font-style: normal;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;(&lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;&lt;b&gt;Hadoop - Commons&lt;/b&gt;)&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;Esto es lo básico que debemos instalar en el clúster para obtener la funcionalidad. De este modo podemos meter datos en el sistema de ficheros y tratarlos con nuestros programas programados con el API de Hadoop.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;Vamos a ver qué más hay:&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif; font-size: x-large;"&gt;HBase&lt;/span&gt;&lt;br /&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;Una vez tenemos los datos procesados en Hadoop seguramente nos interesará tenerlos fácilmente accesibles para diferentes tipos de consultas, algo así como una base de datos con los resultados de Hadoop. Aquí es donde entra &lt;/span&gt;&lt;a href="http://hbase.apache.org/"&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;HBase&lt;/span&gt;&lt;/a&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt; &lt;/i&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt; &lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;HBase es una implementación libre del Bigtable de Google, es una de las famosas bases de datos NoSql. Como el nombre indica, no usa Sql, sinó que tiene una API, además el model de datos no es tabular, sinó que está basado en columnas de n&amp;nbsp;dimensiones. Ya hablé de este modelo de datos en &lt;/span&gt;&lt;a href="http://distribuint.blogspot.com/2009/05/bigtable.html"&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;un post anterior&lt;/span&gt;&lt;/a&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;.&lt;/span&gt;&lt;br /&gt;&lt;i&gt; &lt;/i&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;A efectors prácticos, se tratan los datos en Hadoop mediante Map/Reduce y se escriben en HBase (importante saber que HBase está totalmente integrado con Hadoop, y que por lo tanto, HBase entiende perfectamente el sistema de ficheros de Hadoop asi como el formato de los ficheros), que puede estar en el mismo clúster que Hadoop o en otro, para que otras aplicaciones puedan utilizar los datos en tiempo real.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;Zookeeper&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;Tanto HBase como Hadoop son sistemas distribuidos en los que el sistema debe controlar y saber en cada momento lo que está pasando en procesos que están en otras máquinas. Si hemos programado alguna vez este tipo de sistemas sabremos que eso no es una tarea fácil, nos vamos a encontrar todo tipos de problemas.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;i&gt; &lt;/i&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt; &lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;a href="http://hadoop.apache.org/zookeeper/"&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;Zookeeper&lt;/span&gt;&lt;/a&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt; aparece justamente para solucionarlos. Igual que HBase es la implementación libre de un paper de google, en este caso de &lt;/span&gt;&lt;a href="http://labs.google.com/papers/chubby.html"&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;Google Chubby&lt;/span&gt;&lt;/a&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;i&gt; &lt;/i&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;Básicamente es un sistema de locks&amp;nbsp;distribuido y de consenso (utilizando &lt;/span&gt;&lt;a href="http://en.wikipedia.org/wiki/Paxos_algorithm"&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;Paxos&lt;/span&gt;&lt;/a&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;), no hace mucho los ingenieros de LinkedIn lo usaron para un sistema interno y hicieron un post muy interesante, en el que utilizaron la siguiente definición, muy acertada en mi opinión:&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;ZK&amp;nbsp;has a very simple, file system like API. One can create a path, set the value of a path, read the value of a path, delete a path, and list the children of a path. ZK does a couple of more interesting things:&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;(a) one can register a watcher on a path and get notified when the children of a path or the value of a path is changed,&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; (b) a path can be created as ephemeral, which means that if the client that created the path is gone, the path is automatically removed by the ZK server.&lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;/blockquote&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;de:&amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;&lt;a href="http://sna-projects.com/blog/2010/08/zookeeper-experience/"&gt;http://sna-projects.com/blog/2010/08/zookeeper-experience/&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;i&gt; &lt;/i&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;Asi que ya tenemos otra pieza del puzzle, si hay que sincronizar sistemas distribuidos (que utilizen o no Hadoop), podemos utilizar ZooKeeper.&lt;/span&gt;&lt;br /&gt;&lt;i&gt; &lt;/i&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;Ahora toca el turno de &lt;/span&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;hive&lt;/span&gt;&lt;/b&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;, pero atención porqué después viene &lt;/span&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;pig&lt;/span&gt;&lt;/b&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;&amp;nbsp;y aunque vamos a ver que son bastante diferentes, los dos proyectos pretenden solucionar un problema muy similar:&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;i&gt; &lt;/i&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt; &lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;Hive&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;La principal incomodidad&amp;nbsp;que tiene Hadoop es que para hacer una simple consulta de datos hay que escribir un programa completo en Java, y esto, no es rápido, es un poco difícil de debuggear&amp;nbsp;y puede llegar a ser frustrante.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;i&gt; &lt;/i&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;Pongamos el caso en que tenemos 500 Gb de datos del tipo:&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;i&gt; &lt;/i&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;Key: Integer&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;Value: Objecto(Id: Integer, valor1: Integer, valor2: Integer)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;i&gt; &lt;/i&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;y que en un momento dado queremos un listado de todos los pares Key/Value dónde valor2 &amp;gt; 500.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;i&gt; &lt;/i&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;Si los datos estuvieran guardados en una base de datos podriamos hacer una senzilla consulta Sql con un where. En Hadoop tocaría escribir un programa en Java. Pues bien, &lt;/span&gt;&lt;a href="http://hadoop.apache.org/hive/"&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;Hive&lt;/span&gt;&lt;/a&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt; al rescate.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;i&gt; &lt;/i&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;Se trata básicamente de una infraestructura de data warehousing&amp;nbsp;encima de Hadoop. Y esto que significa? pues básicamente se trata de crear unos metadatos encima de los directorios de HDFS describiendo el formato de los ficheros, asi pues creamos una estructura tabular virtual encima de Hadoop.&amp;nbsp;Hive también tiene un intérprete de comandas sql, por lo tanto podemos escribir una consulta sql de toda la vida en la command line, luego hive coge el sql, lo convierte automáticamente en jobs Map/Reduce&amp;nbsp;y estos son ejecutados de forma transparente en el clúster como jobs normales.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt; &lt;/i&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;Si quereis más información, anteriormente hice &lt;/span&gt;&lt;a href="http://distribuint.blogspot.com/2009/07/aquest-post-parlo-de-hive-una-eina-que.html"&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;un post&lt;/span&gt;&lt;/a&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt; hablando de hive con más detalle.&lt;/span&gt;&lt;br /&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt; &lt;/i&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;Pig&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;Otro modo de ver el anterior problema es: en vez de escribir un programa en Java para hacer una consulta de unos datos, voy a hacerlo con nserta aquí tu lenguaje de scripting favorito&amp;gt;. Hadoop tiene como parte del Hadoop Core una opción de streaming. Básicamente te permite especificar como parámetro dos scripts (uno que hace de mapper y otro que hace de reducer) que leen y escriben por la entrada y salida estándar. Esto es práctico pero te limita a unos programas muy sencillos y poco aplicables a la vida real.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;i&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-style: normal;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt; Pues bien, &lt;/span&gt;&lt;/span&gt;&lt;a href="http://hadoop.apache.org/pig/"&gt;&lt;span class="Apple-style-span" style="font-style: normal;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;Pig&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span class="Apple-style-span" style="font-style: normal;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt; es un lenguage de programación (tipo scripting) para Hadoop, y&lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-style: normal;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;&amp;nbsp;por lo que estoy viendo parece que tiene una muy buena aceptación en la comunidad Hadoop (pero que &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-style: normal;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;muy&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;span class="Apple-style-span" style="font-style: normal;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;&amp;nbsp;buena aceptación).&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-style: normal;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;  &lt;br /&gt;&lt;/span&gt; &lt;span class="Apple-style-span" style="font-style: normal;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;Avro&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-style: normal;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;&lt;br /&gt;Una de los puntos fuertes del ecosistema Hadoop es que facilita trabajar con grandes cantidades de datos. &amp;nbsp;Estos datos están guardados en el HDFS, pero cómo? pues se pueden guardar en diferentes formatos, el más simple es el de texto plano, pero normalmente se recomienda usar serialización.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-style: normal;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-style: normal;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;Qué es la serialización? pues se trata de como almacenamos la información internamente de un objeto a disco (o memoria), podemos &lt;/span&gt;&lt;a href="http://es.wikipedia.org/wiki/Serializaci%C3%B3n"&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;leer más en la wikipedia.&lt;/span&gt;&lt;/a&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;&amp;nbsp;Para Hadoop lo más interesante son los formatos binarios, que son los más rápidos y comprimidos, el problema es que un humano no los puede leer, pero en este caso no nos importa.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-style: normal;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-style: normal;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;Tenemos diferentes formatos:&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-style: normal;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;i&gt;&lt;/i&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;i&gt;&lt;/i&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;i&gt;&lt;ul&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-style: normal;"&gt;&lt;a href="http://code.google.com/apis/protocolbuffers/"&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;Protocol Buffers&lt;/span&gt;&lt;/a&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;, creado por Google.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-style: normal;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;&lt;a href="http://incubator.apache.org/thrift/"&gt;Thrift&lt;/a&gt;, creado por Facebook.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: normal;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;y otros dos, creados por los programadors de Hadoop:&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://hadoop.apache.org/common/docs/current/api/org/apache/hadoop/record/package-summary.html#package_description"&gt;&lt;span class="Apple-style-span" style="font-style: normal;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;RecordIO&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span class="Apple-style-span" style="font-style: normal;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;: Hasta hace pronto el formato de serialización de facto en Hadoop, bastante interesante en su implementación, pero con algunos problemas en temas de mantenimiento a largo plazo (los objetos generados son estáticos, esto significa que si modificamos las características del objeto (introducimos un nuevo campo) el objeto nuevo será incompatible con el viejo). Si echamos una ojeada a la documentación veremos que está deprecated by... si señor:&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-style: normal;"&gt;&lt;a href="http://avro.apache.org/docs/current/"&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;Avro&lt;/span&gt;&lt;/a&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: normal;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;Tiene unas características muy interesantes, básicamente:&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-style: normal;"&gt;&lt;i&gt;&lt;i&gt;&lt;div style="display: inline !important;"&gt;&lt;div style="display: inline !important;"&gt;&lt;div style="display: inline !important;"&gt;&lt;span class="Apple-style-span" style="font-style: normal;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;Permite almacenar estructuras de datos simples y complejas (desde números hasta objectos con listas y maps)&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/i&gt;&lt;/i&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-style: normal;"&gt;&lt;i&gt;&lt;i&gt;&lt;div style="display: inline !important;"&gt;&lt;div style="display: inline !important;"&gt;&lt;div style="display: inline !important;"&gt;&lt;span class="Apple-style-span" style="font-style: normal;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;Es compacto, rápido y binario. (Esto no es mucha novedad)&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/i&gt;&lt;/i&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-style: normal;"&gt;&lt;i&gt;&lt;i&gt;&lt;div style="display: inline !important;"&gt;&lt;div style="display: inline !important;"&gt;&lt;div style="display: inline !important;"&gt;&lt;span class="Apple-style-span" style="font-style: normal;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;Tiene un format de fichero propio.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/i&gt;&lt;/i&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-style: normal;"&gt;&lt;i&gt;&lt;i&gt;&lt;div style="display: inline !important;"&gt;&lt;div style="display: inline !important;"&gt;&lt;div style="display: inline !important;"&gt;&lt;span class="Apple-style-span" style="font-style: normal;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;Tiene una especificación de RPC. (como Thrift)&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/i&gt;&lt;/i&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-style: normal;"&gt;&lt;i&gt;&lt;i&gt;&lt;div style="display: inline !important;"&gt;&lt;div style="display: inline !important;"&gt;&lt;div style="display: inline !important;"&gt;&lt;span class="Apple-style-span" style="font-style: normal;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;Y lo más interesante: El esquema de serialización (el índice que dice que tipo de datos está en cada posición del fichero) está incluido en el fichero en si. Esto permite que la generación de código por parte del precompilador sea opcional y lo que es más importante, hace que podamos canviar la estructura interna de los objectos almacenados sin perder la compatibilidad con ficheros viejos.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/i&gt;&lt;/i&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span class="Apple-style-span" style="font-style: normal;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;Por lo tanto, si trabajais con Hadoop, a serializar los datos con Avro desde ya.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-style: normal;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/i&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt; &lt;/span&gt;&lt;span class="Apple-style-span" style="font-style: normal;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;Flume&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;span class="Apple-style-span" style="font-style: normal;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt; &lt;span class="Apple-style-span" style="font-style: normal;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-style: normal;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;The "new kid in town". &lt;/span&gt;&lt;/span&gt;&lt;a href="http://github.com/cloudera/flume"&gt;&lt;span class="Apple-style-span" style="font-style: normal;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;Flume&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span class="Apple-style-span" style="font-style: normal;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt; fue liberado por Cloudera no hace ni medio año y ya ha tenido una gran adopción.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-style: normal;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt; &lt;span class="Apple-style-span" style="font-style: normal;"&gt;&lt;/span&gt; &lt;/span&gt;&lt;span class="Apple-style-span" style="font-style: normal;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt; &lt;/span&gt;&lt;span class="Apple-style-span" style="font-style: normal;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;La idea es muy sencilla, se trata de una pipe al HDFS.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-style: normal;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt; &lt;span class="Apple-style-span" style="font-style: normal;"&gt;&lt;/span&gt; &lt;/span&gt; &lt;span class="Apple-style-span" style="font-style: normal;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;Lógicamente para trabajar con Hadoop debemos tener los datos en el HDFS, y tenemos diferentes herramientas para poner los ficheros allí, el problema es que cuando tenemos diferentes fuentes de datos (el syslog de muchos servidores web por ejemplo) hay que construir una infraestructura que se asegure que los logs se van subiendo periódicamente y que no falte ninguno. Pues bien, Flume es exactamente esto. Además utiliza ZooKeeper, por lo tanto es:&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-style: normal;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;&amp;nbsp;tolerante a fallos ( si un nodo cae de la red, cuando se vuelva a conectar sabrá que tiene que enviar de nuevo ),&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-style: normal;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;tiene configuración distribuida (puede reconfigurar los nodos cliente a partir de un nodo máster)&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-style: normal;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/i&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"&gt; Y no se acaba aquí! hay más, mucho más en Hadoop, pero creo que estos son los proyectos más interesantes y que estás más ligados a Hadoop.&lt;br /&gt;&lt;br /&gt;Echáis en falta alguno?&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6541464271719475452-952207965840165568?l=distribuint.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://distribuint.blogspot.com/feeds/952207965840165568/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://distribuint.blogspot.com/2010/09/el-ecosistema-hadoop.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6541464271719475452/posts/default/952207965840165568'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6541464271719475452/posts/default/952207965840165568'/><link rel='alternate' type='text/html' href='http://distribuint.blogspot.com/2010/09/el-ecosistema-hadoop.html' title='El Ecosistema Hadoop.'/><author><name>Marc</name><uri>http://www.blogger.com/profile/05631004736020219907</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://4.bp.blogspot.com/_a84GcWW6wwE/TTcLNqDwGxI/AAAAAAAAAXc/KscglDtW6gI/S220/lant.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6541464271719475452.post-4928615593741829463</id><published>2010-09-12T23:50:00.000+01:00</published><updated>2010-09-12T23:50:18.592+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='nosql'/><category scheme='http://www.blogger.com/atom/ns#' term='hbase'/><category scheme='http://www.blogger.com/atom/ns#' term='big data'/><category scheme='http://www.blogger.com/atom/ns#' term='hadoop'/><title type='text'>El ciclo de los datos, de la generación al uso.</title><content type='html'>Trabajar con grandes cantidades de datos es complicado.&amp;nbsp;Muchas empresas están incorporando&amp;nbsp;Map/Reduce, básicamente su implementación libre, Hadoop para el tratamiento de sus datos. El ecosistema de herramientas de Hadoop va creciendo también, y cada vez es más complejo, ya que tiene que solucionar muchos casos, pero aún le falta alguna pieza para completar el ciclo total de los datos.&lt;br /&gt;&lt;br /&gt;Con "ciclo total de los datos" me refiero a las diferentes fases del proceso, en Hadoop normalmente:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;b&gt;Ingestión de datos en el sistema de ficheros: &lt;/b&gt;Hadoop trabaja sobre DFS (normalmente), así pues tenemos que enviar los datos al clúster.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Tratamiento de datos:&lt;/b&gt; Operaciones Map/Reduce en Hadoop.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Visualización o acceder a los datos:&lt;/b&gt; Una vez tenemos los resultados de los trabajos, hay que sacar los datos del DFS para poder presentarlos.&lt;/li&gt;&lt;/ol&gt;El primer punto es bastante interesante. Hadoop es útil cuando trabajamos con muchos datos (&amp;gt;Gbs), ahora bien, los datos deben estar en el DFS, esto puede ser un problema. El framework ofrece diferentes comandas para insertar ficheros, en mi caso un poco de scripting combinado con estos comandos siempre ha sido suficiente. Aunque estoy empezando a considerar usar &lt;a href="http://github.com/cloudera/flume"&gt;Flume&lt;/a&gt;, un proyecto de &lt;a href="http://www.cloudera.com/"&gt;Cloudera&lt;/a&gt; muy interesante que inserta datos en el sistema de ficheros distribuido como si fueran Pipes de Unix.&lt;br /&gt;&lt;br /&gt;El segundo punto es bastante sencillo, ya que es el nucleo de Hadoop. Una vez finalizado estamos en el tercer punto, algunas veces el volumen de datos de salida será mucho inferior respecto a la entrada, a veces similar, y otras muy mayor.&lt;br /&gt;&lt;br /&gt;Lógicamente nos interesan estos datos de salida, y la mayoría de veces necesitaremos sacarlos del DFS para poderlos estudiar, visualizar, o como es mi caso, servir a través de un servicio web.&lt;br /&gt;&lt;br /&gt;Por qué hay que sacar los datos del DFS? por qué no los puedo usar desde allí?&lt;br /&gt;&lt;br /&gt;Básicamente el problema viene del diseño del DFS en sí mismo, el sistema de ficheros está optimizado para los trabajos de Hadoop, que leen sequencialmente todo el fichero, esto significa que el sistema es muy lento leyendo posiciones aleatorias en un fichero. A efectos prácticos esto significa que haya mucha latencia y que no sea factible servir datos de forma rápida.&lt;br /&gt;&lt;br /&gt;La solución más viable si no queremos (o no podemos) mover los datos es usar &lt;a href="http://hbase.apache.org/"&gt;HBase&lt;/a&gt;, aunque de momento no es considerado como la mejor opción para servir las peticiones de una página web con un volumen importante de datos, aunque la comunidad está poniendo muchos esfuerzos para mejorar este tipo de rendimiento (lectura en posiciones aleatorias de ficheros) así como la estabilidad. Pero bueno, esto es otra historia.&lt;br /&gt;&lt;br /&gt;Así pues, qué se hace para solucionar este tercer punto?&lt;br /&gt;&lt;br /&gt;Lo más común es volcar los contenidos de los ficheros de DFS a una base de datos o a una K/V Store. Aunque tampoco es trivial.&lt;br /&gt;&lt;br /&gt;El primer caso, sacar los ficheros y insertar el contenido a una RDBMS, &amp;nbsp;caso plantea unos problemas bastante interesantes, básicamente se pueden hacer dos cosas:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Meterle caña a la base de datos: &lt;/b&gt;Una vez tenemos los ficheros del DFS se pueden convertir a SQL, luego se sube este fichero a la base de datos (con un &lt;i&gt;copy&lt;/i&gt;&lt;b&gt;)&lt;/b&gt;, se crea una tabla nueva y se hace un swap. El problema? pues que si la nueva tabla ocupa 90 Gbytes y lo tienes que hacer cada día a lo mejor el administrador de la base de datos te viene chillando como un poseso (comprobado).&lt;/li&gt;&lt;li&gt;&lt;b&gt;Insertar sólo las deltas: &lt;/b&gt;Esta solución puede parecer más diplomática. Se trata de calcular (si se puede) las diferencias que hay entre la salida de Hadoop con el contenido de la base de datos, el resultado será una bateria de &lt;i&gt;inserts&lt;/i&gt;, otra de &lt;i&gt;updates&lt;/i&gt; y otra de &lt;i&gt;deletes&lt;/i&gt;. Esta solución no es senzilla programáticamente y tiene el problema que hay que volcar los contenidos de la base de datos a Hadoop para que se pueda ver que ha cambiado.&amp;nbsp;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;Nótese que en ningún momento estoy recomendando hacer las operaciones contra la base de datos desde los reducers de Hadoop, a no ser que queramos hacer un DDoS a nuestra base de datos (o que odiemos al DBA).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;El segundo caso (utilizar una K/V Store en vez de una base de datos relacional) dependerá mucho de la K/V Store que utilizemos, pero la idea es la misma, podemos intentar actualizar los datos desde Hadoop y arriesgarnos a que se caiga todo o crear un fichero para que la K/V lo lea, en este caso jugamos un poco con ventaja ya que el movimiento NoSQL ha ido muy ligado al movimento Hadoop. Esto significa que muchas bases de datos no relacionales ya tienen un "conector".&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Algunos ejemplos:&lt;/div&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;&lt;a href="http://cassandra.apache.org/"&gt;Apache Cassandra&lt;/a&gt;: &lt;/b&gt;Se puede utilizar un &lt;i&gt;OutputFormat&lt;/i&gt;&amp;nbsp;especial para que la salida de los jobs de Hadoop sea totalmente compatible con los ficheros de almacenamiento que usa Cassandra, asi pues, sólo se trata de crear estos ficheros, enviarlos a los nodos de Cassandra para que los lean. Feature un poco experimental a día de hoy.&lt;/li&gt;&lt;li&gt;&lt;b&gt;&lt;a href="http://www.mongodb.org/"&gt;MongoDB&lt;/a&gt;: &lt;/b&gt;También hay un &lt;i&gt;OutputFormat&lt;/i&gt;&amp;nbsp;, en este caso escribe el resultado del tratamiento en Hadoop en BSON. El formato no forma parte de la distribución de MongoDB a día de hoy, está en un proyecto en &lt;a href="http://github.com/novus/luau"&gt;github&lt;/a&gt;&amp;nbsp;(no he podido probarlo aún, pero me muero de ganas).&amp;nbsp;&lt;/li&gt;&lt;li&gt;&lt;b&gt;&lt;a href="http://project-voldemort.com/"&gt;Voldemort&lt;/a&gt;: &lt;/b&gt;Fue creada por los chicos de LinkedIn justamente para solucionar este problema, tiene soporte de Hadoop por defecto.&lt;/li&gt;&lt;li&gt;&lt;b&gt;&lt;a href="http://hbase.apache.org/"&gt;HBase&lt;/a&gt;: &lt;/b&gt;Aunque he dicho que no es la mejor solución para servir datos &lt;i&gt;online&lt;/i&gt;&amp;nbsp;cabe decir que tiene soporte de leer ficheros generados por Hadoop por defecto.&lt;/li&gt;&lt;/ul&gt;Recientemente he estado trabajando mucho en este tema y he estado modificando un servicio web para solucionar en parte este problema. Voy a presentarlo en la séptima reunión del &lt;a href="http://huguk.org/"&gt;HUGUK&lt;/a&gt;&amp;nbsp;el próximo 7 de noviembre (creo), espero poder colgar las transparencias y hacer un post aquí cuando lo tenga todo listo.&lt;br /&gt;&lt;br /&gt;Mientras, hay alguien que tenga alguna sugerencia para solucionar todo este follón ?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6541464271719475452-4928615593741829463?l=distribuint.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://distribuint.blogspot.com/feeds/4928615593741829463/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://distribuint.blogspot.com/2010/09/el-ciclo-de-los-datos-de-la-generacion.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6541464271719475452/posts/default/4928615593741829463'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6541464271719475452/posts/default/4928615593741829463'/><link rel='alternate' type='text/html' href='http://distribuint.blogspot.com/2010/09/el-ciclo-de-los-datos-de-la-generacion.html' title='El ciclo de los datos, de la generación al uso.'/><author><name>Marc</name><uri>http://www.blogger.com/profile/05631004736020219907</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://4.bp.blogspot.com/_a84GcWW6wwE/TTcLNqDwGxI/AAAAAAAAAXc/KscglDtW6gI/S220/lant.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6541464271719475452.post-1540046580838508359</id><published>2010-09-03T14:09:00.001+01:00</published><updated>2010-09-03T14:12:10.309+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ogov'/><category scheme='http://www.blogger.com/atom/ns#' term='linked data'/><title type='text'>Linked Data y Government 2.0</title><content type='html'>Hace poco se publicó la página web &lt;a href="http://www.legislation.gov.uk/"&gt;http://www.legislation.gov.uk/&lt;/a&gt; del gobierno inglés. Se trata (como podemos leer en &lt;a href="http://data.gov.uk/blog/legislationgovuk-api"&gt;http://data.gov.uk/blog/legislationgovuk-api&lt;/a&gt;) de una lugar en dónde se pueden consultar todas las leyes que afectan a Inglaterra, Gales, Irlanda del Norte y Escocia así como sus cambios a través del tiempo.&lt;br /&gt;&lt;br /&gt;Qué gracia tiene? &amp;nbsp;pues dos:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Incluye una API para que terceros desarrollen aplicaciones y&lt;/li&gt;&lt;li&gt;Cada ley está identificada únicamente por una URL, y está descrita con RDF, por tanto, es un resource de &lt;a href="http://en.wikipedia.org/wiki/Linked_Data"&gt;Linked Data&lt;/a&gt;.&lt;/li&gt;&lt;/ol&gt;A efectos prácticos (técnicos) esto significa que una aplicación con conocimiento semántico pueda interpretar las leyes y que estas sean únicas y referenciables siempre, un requisito de la Web de Datos ( o 3.0).&lt;br /&gt;&lt;br /&gt;A efectos prácticos (no técnicos) esto significa que el gobierno británico continúa adelante con su apuesta por abrir sus datos para desarrolladores y colabora a la construcción de la Web Semántica.&lt;br /&gt;Recordemos que el gobierno británico, juntamente con el americano, son los que están apostando más con lo que se llama el Gobierno 2.0 (o Open Government, o e-Gobernment, o ...). La página &lt;a href="http://data.gov.uk/"&gt;http://data.gov.uk/&lt;/a&gt; es simplemente espectacular.&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;Y en España?&lt;/span&gt;&lt;br /&gt;En España el tema no está nada mal, podría ser peor lógicamente, pero tenemos algunos gobiernos autonómicos (como el basco) que están publicando sus &lt;a href="http://opendata.euskadi.net/w79-home/es"&gt;datos&lt;/a&gt; y Institutos de Estadística que también lo hacen (&lt;a href="http://github.com/lant/idescat-java"&gt;yo mismo hice una implementación en Java&lt;/a&gt; de la &lt;a href="http://api.idescat.cat/"&gt;API del Idescat&lt;/a&gt;). Y también aparecen iniciativas como las del concurso &lt;a href="http://www.abredatos.es/"&gt;Abredatos 2010&lt;/a&gt;, de las que salieron proyectos muy interesantes.&lt;br /&gt;&lt;br /&gt;Durante el concurso Abredatos, participé con un amigo y la principal dificultad (&lt;i&gt;bueno, la segunda, nuestra principal dificultad fue el CSS de la página&lt;/i&gt;) fue sacar los datos de diferentes páginas. El INE ofrece datos, pero desgraciadamente es muy difícil parsearlos, los datos están pensados para visualizarlos desde la web, o para descargarlos con excel (cada fichero con un formato diferente &amp;nbsp;por cierto).&lt;br /&gt;&lt;br /&gt;Es en este sentido que la apertura de datos en España podría mejorar mucho, &amp;nbsp;mis requerimientos para una apertura de datos &lt;i&gt;real&lt;/i&gt; serían:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Abrir los datos con una licencia no restrictiva.&lt;/li&gt;&lt;li&gt;Publicarlos via API&lt;/li&gt;&lt;li&gt;Describir los datos semánticamente.&lt;/li&gt;&lt;/ol&gt;En la conferencia &lt;a href="http://distribuint.blogspot.com/2010/05/resum-de-la-nosql-eu-2010.html"&gt;NoSql - EU 2010&lt;/a&gt; vi una presentación de unos programadores de T&lt;a href="http://www.guardian.co.uk/"&gt;he Guardian&lt;/a&gt;, en ella explicaban sus experiencias con bases de datos no relacionales, uno de los ejemplos (con Redis) se trató del escándalo de los gastos de los ministros en Inglaterra.&lt;br /&gt;&lt;br /&gt;El gobierno publicó en pdf miles de documentos con las facturas de los ministros. Lógicamente se tardaría mucho en poder revisarlos uno por uno, lo que hiciero fue crear una página web dónde los ciudadanos podían ver facturas aleatorias, y seguidamente clasificar la factura como "escandalosa" (para que un reportero del diario la revisara) o como "aceptable". He aquí un muy buen ejemplo de lo que se puede ganar la ciudadanía con las nuevas tecnologías y la apertura de datos y lo que pueden perder algunas personas que están muy bien acostumbradas.&lt;br /&gt;&lt;br /&gt;Por cierto, esta es la presentación de The Guardian (el tema de los gastos empieza en la página 46):&lt;br /&gt;&lt;br /&gt;&lt;div id="__ss_3802982" style="width: 425px;"&gt;&lt;object height="355" id="__sse3802982" width="425"&gt;&lt;param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=nosql-100421081331-phpapp01&amp;stripped_title=nosql-presentation" /&gt;&lt;param name="allowFullScreen" value="true"/&gt;&lt;param name="allowScriptAccess" value="always"/&gt;&lt;embed name="__sse3802982" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=nosql-100421081331-phpapp01&amp;stripped_title=nosql-presentation" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;div style="padding: 5px 0 12px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6541464271719475452-1540046580838508359?l=distribuint.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://distribuint.blogspot.com/feeds/1540046580838508359/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://distribuint.blogspot.com/2010/09/linked-data-y-government-20.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6541464271719475452/posts/default/1540046580838508359'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6541464271719475452/posts/default/1540046580838508359'/><link rel='alternate' type='text/html' href='http://distribuint.blogspot.com/2010/09/linked-data-y-government-20.html' title='Linked Data y Government 2.0'/><author><name>Marc</name><uri>http://www.blogger.com/profile/05631004736020219907</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://4.bp.blogspot.com/_a84GcWW6wwE/TTcLNqDwGxI/AAAAAAAAAXc/KscglDtW6gI/S220/lant.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6541464271719475452.post-2465674256231513143</id><published>2010-08-28T22:29:00.000+01:00</published><updated>2010-08-28T22:29:20.074+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='nosql'/><category scheme='http://www.blogger.com/atom/ns#' term='fanboys'/><category scheme='http://www.blogger.com/atom/ns#' term='big data'/><title type='text'>Cuidado con los fanboys!</title><content type='html'>&lt;span class="Apple-style-span" style="font-family: 'Lucida Grande';"&gt;Hadoop, Big Data, NoSql y compañía han tenido bastante repercusión. Es fácil encontrar noticias relacionadas en las portadas de algunos de los medios más importantes, se han creado muchas startups relacionadas y ha habido mucha controversía y algunas que otras discusiones poco sanas entre algunos expertos.&amp;nbsp;&lt;/span&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Lucida Grande';"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Lucida Grande';"&gt;Y lógicamente, ha pasado lo que tenía que pasar, han aparecido los fanboys.&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Lucida Grande';"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Lucida Grande';"&gt;NoSql está muy bien, Hadoop también, pero estos softwares, arquitecturas, modelos de programación son soluciones para problemas muy concretos, y recordemos, son relativamente jóvenes, vayamos con cuidado, tienen sus limitaciones.&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Lucida Grande';"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Lucida Grande';"&gt;Os dejo con un video muy representativo de lo que no tendría que pasar (pero pasa), en este caso una discusión entre un osito fanboy de &lt;a href="http://www.mongodb.org/"&gt;MongoDB&lt;/a&gt; (una base de datos genial por cierto) y un osito con dos dedos de frente.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;object height="390" width="480"&gt;&lt;param name="movie" value="http://www.xtranormal.com/site_media/players/jwplayer.swf"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;param name="flashvars"value="height=390&amp;width=480&amp;file=http://newvideos.xtranormal.com/web_final_lo/574b3910-afc9-11df-914b-003048d69c21_27_web_final_lo_web_finallo-flv.flv&amp;image=http://newvideos.xtranormal.com/web_final_lo/574b3910-afc9-11df-914b-003048d69c21_27_web_final_lo_poster.jpg&amp;link=http://www.xtranormal.com/watch/6995033&amp;searchbar=false&amp;autostart=false"/&gt;&lt;embed src="http://www.xtranormal.com/site_media/players/jwplayer.swf" width="480" height="390" allowscriptaccess="always" allowfullscreen="true" flashvars="height=390&amp;width=480&amp;file=http://newvideos.xtranormal.com/web_final_lo/574b3910-afc9-11df-914b-003048d69c21_27_web_final_lo_web_finallo-flv.flv&amp;image=http://newvideos.xtranormal.com/web_final_lo/574b3910-afc9-11df-914b-003048d69c21_27_web_final_lo_poster.jpg&amp;link=http://www.xtranormal.com/watch/6995033&amp;searchbar=false&amp;autostart=false"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;object height="390" width="480"&gt;&lt;param name="movie" value="http://www.xtranormal.com/site_media/players/embedded-xnl-stats.swf"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.xtranormal.com/site_media/players/embedded-xnl-stats.swf" width="1" height="1" allowscriptaccess="always"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6541464271719475452-2465674256231513143?l=distribuint.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://distribuint.blogspot.com/feeds/2465674256231513143/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://distribuint.blogspot.com/2010/08/cuidado-con-los-fanboys.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6541464271719475452/posts/default/2465674256231513143'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6541464271719475452/posts/default/2465674256231513143'/><link rel='alternate' type='text/html' href='http://distribuint.blogspot.com/2010/08/cuidado-con-los-fanboys.html' title='Cuidado con los fanboys!'/><author><name>Marc</name><uri>http://www.blogger.com/profile/05631004736020219907</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://4.bp.blogspot.com/_a84GcWW6wwE/TTcLNqDwGxI/AAAAAAAAAXc/KscglDtW6gI/S220/lant.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6541464271719475452.post-2783951921683545168</id><published>2010-08-27T19:01:00.000+01:00</published><updated>2010-08-27T19:01:53.153+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='dataspora'/><category scheme='http://www.blogger.com/atom/ns#' term='data science'/><category scheme='http://www.blogger.com/atom/ns#' term='big data'/><title type='text'>Comentarios sobre el artículo "the seven secrets of successful data scientists" de Dataspora.</title><content type='html'>Acabo de leer el siguiente artículo:&amp;nbsp;&lt;a href="http://dataspora.com/blog/the-seven-secrets-of-successful-data-scientists/"&gt;"The seven secrets of successful data scientists", de Dataspora&lt;/a&gt;&amp;nbsp;(blog muy recomendable por cierto), definitivamente no podría estar más de acuerdo. Resume muy bien algunos de los problemas que he descubierto "a batacazos" durante los dos años en los que he estado trabajando con &lt;i&gt;Big data.&amp;nbsp;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;V&lt;/i&gt;eamos los puntos:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Choose The Right-Sized Tool (Usa la herramienta que toque): &lt;/b&gt;Muy importante. Hadoop está muy bien, pero sólo tiene sentido si realmente tienes gigabytes de datos. Si tienes pocos datos usa macros de vim, si tienes unos pocos más con las herramientas estándar de Unix y algún lenguaje de scripting bastará.&lt;br /&gt;&lt;b&gt;&lt;/b&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;b&gt;Compress Everything (Comprímelo todo): &lt;/b&gt;Tengo un post pendiente que habla de esto desde hace mucho tiempo. Cuando se trabaja con datos normalmente la CPU no es el problema. La mayoría de veces es el disco (ya que se usa mucho para sustituir la falta de memoria), la solución es comprimir.&lt;br /&gt;&lt;b&gt;&lt;/b&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;b&gt;Split Up Your Data (Parte los datos): &lt;/b&gt;Divide y vencerás, pues eso, de hecho se llama "sharding", pero cuidadín al elegir cómo partes los datos.&lt;br /&gt;&lt;b&gt;&lt;/b&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;b&gt;Sample Your Data (Samplea, estadísticamente hablando, claro): &lt;/b&gt;Un paso importante del desarrollo del software es la parte de testing. Lógicamente muchas veces no se puede disponer de todo el conjunto de datos de entrada, la solución será poder coger &lt;i&gt;un subconjunto estadísticamente representativo &lt;/i&gt;de la entrada para probar el programa.&lt;br /&gt;&lt;b&gt;&lt;/b&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;b&gt;Smart Borrows, But Genius Uses Open Source (usa código abierto): &lt;/b&gt;Nada a decir aquí, antes de redescubrir la rueda pásate por &lt;i&gt;github&lt;/i&gt; o &lt;i&gt;google code&lt;/i&gt; a dar un vistazo.&lt;br /&gt;&lt;b&gt;&lt;/b&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;b&gt;Keep Your Head in the Cloud (Mantén tu cabeza en la nuve, o trabaja en local, dónde quiera que sea "local"):&lt;/b&gt; Fallo muy clásico, estamos hablando de muchos datos. Cuando debas manipularlos quieres hacerlo localmente, no quieres mover Terabytes de datos de una máquina a la otra porque la otra tiene un poco más de memoria.&lt;br /&gt;&lt;b&gt;&lt;/b&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;b&gt;Don’t Be Clever (No te pases de listo): &lt;/b&gt;No se hasta qué punto estoy de acuerdo con este punto, supongo que muy personal, aunque me gusta la última conclusión: mantén el diseño simple.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6541464271719475452-2783951921683545168?l=distribuint.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://distribuint.blogspot.com/feeds/2783951921683545168/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://distribuint.blogspot.com/2010/08/comentarios-sobre-el-articulo-seven.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6541464271719475452/posts/default/2783951921683545168'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6541464271719475452/posts/default/2783951921683545168'/><link rel='alternate' type='text/html' href='http://distribuint.blogspot.com/2010/08/comentarios-sobre-el-articulo-seven.html' title='Comentarios sobre el artículo &quot;the seven secrets of successful data scientists&quot; de Dataspora.'/><author><name>Marc</name><uri>http://www.blogger.com/profile/05631004736020219907</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://4.bp.blogspot.com/_a84GcWW6wwE/TTcLNqDwGxI/AAAAAAAAAXc/KscglDtW6gI/S220/lant.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6541464271719475452.post-7830339055041535896</id><published>2010-07-12T23:17:00.002+01:00</published><updated>2010-07-12T23:20:01.697+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='nosql'/><category scheme='http://www.blogger.com/atom/ns#' term='mongodb'/><title type='text'>Cheat Sheet per Nosql.</title><content type='html'>Us deixo aquí un link molt interessant amb una 'Cheat Sheet' amb un resum del que són i per què s'utilitzen les tecnologies Nosql, a més amb exemples de MongoDB:&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://refcardz.dzone.com/refcardz/getting-started-nosql-and-data"&gt;http://refcardz.dzone.com/refcardz/getting-started-nosql-and-data&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6541464271719475452-7830339055041535896?l=distribuint.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://distribuint.blogspot.com/feeds/7830339055041535896/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://distribuint.blogspot.com/2010/07/chead-sheet-per-nosql.html#comment-form' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6541464271719475452/posts/default/7830339055041535896'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6541464271719475452/posts/default/7830339055041535896'/><link rel='alternate' type='text/html' href='http://distribuint.blogspot.com/2010/07/chead-sheet-per-nosql.html' title='Cheat Sheet per Nosql.'/><author><name>Marc</name><uri>http://www.blogger.com/profile/05631004736020219907</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://4.bp.blogspot.com/_a84GcWW6wwE/TTcLNqDwGxI/AAAAAAAAAXc/KscglDtW6gI/S220/lant.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6541464271719475452.post-4899367836686901950</id><published>2010-07-03T15:55:00.015+01:00</published><updated>2010-07-06T23:03:59.007+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='hadoop'/><title type='text'>Hadoop Summit 2010</title><content type='html'>Sembla ser que el jet-lag comença a desaparèixer, per tant em poso a explicar el meu viatge a San Francisco per estar al Hadoop Summit 2010, fer una visiteta a alguns ex-companys de feina i unes visites a les oficines de &lt;a href="http://twitter.com/"&gt;Twitter&lt;/a&gt;, &lt;a href="http://www.facebook.com/"&gt;Facebook&lt;/a&gt;, &lt;a href="http://www.linkedin.com/"&gt;LinkedIn&lt;/a&gt; i &lt;a href="http://www.cloudera.com/"&gt;Cloudera&lt;/a&gt;. &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Algo sèrio, bé, comencem pel començament: &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="font-size:large;"&gt;Dia 1: LinkedIn + Cloudera.&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="font-size:large;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;Vam visitar el "data team" de LinkedIn, una gent molt interessant, apart de treballar en Hadoop (i per cert, ténen uns clusters bastant grossos) són els que han fet &lt;/span&gt;&lt;a href="http://blog.linkedin.com/2009/03/20/project-voldemort-scaling-simple-storage-at-linkedin/"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;Voldemort&lt;/span&gt;&lt;/a&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;, una K/V store en la qual serveixen les dades a la pàgina. &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;A més, ens van donar la oportunitat d'explicar com utilitzem &lt;/span&gt;&lt;a href="http://www.slideshare.net/klbostee/hadoop-at-lastfm"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;Hadoop a last.fm&lt;/span&gt;&lt;/a&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; i esmorzar :).&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;A la tarda vam anar cap a Cloudera, a on organitzaven un Hackaton de temes relacionats amb Hadoop. Més que els hacks en sí va ser interessant conèixer a la gent de Cloudera i altres que s'havien acostat a l'event, gent d'&lt;/span&gt;&lt;a href="http://infochimps.org/"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;Infochimps&lt;/span&gt;&lt;/a&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; i d'&lt;/span&gt;&lt;a href="http://www.opscode.com/"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;Opscode&lt;/span&gt;&lt;/a&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; entre d'altres.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:large;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="font-size:large;"&gt;Dia 2: Hadoop Summit 2010.&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="font-size:large;"&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_a84GcWW6wwE/TC_JwoD8y8I/AAAAAAAAAWI/OYAWkM2kR8w/s1600/IMG_7710.JPG"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://4.bp.blogspot.com/_a84GcWW6wwE/TC_JwoD8y8I/AAAAAAAAAWI/OYAWkM2kR8w/s320/IMG_7710.JPG" border="0" alt="" id="BLOGGER_PHOTO_ID_5489828308012813250" /&gt;&lt;/a&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;El plat principal del viatge. Van vendre totes les entrades, hi havia aproximadament 1000 persones i les xerrades estaven repartides en 3 tracks diferents, aplicacions, desenvolupament i investigació. El hashtag era &lt;/span&gt;&lt;a href="http://twitter.com/#search?q=%23hadoopsummit"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;#hadoopsummit&lt;/span&gt;&lt;/a&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; .&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;Tinc 8 folis de llibreta de notes que vaig pendre, per tant intentaré fer un resum del que vaig trobar més interessant, però primer, parlaré del que em va sorprendre més: la barreja de gent que hi havia. &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;Hi vaig trobar dos grans grups de persones, els que ja utilitzaven Hadoop i que per tant els interesava saber què s'està fent i com continuarà el projecte i els que volien començar a utilitzar Hadoop. &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;En aquest subgrup em vaig trobar i vaig parlar amb molta gent de consultories, de bancs i d'empreses d'assegurances. El seu cas és bastant curiós, els seus departaments d'IT han vist que Hadoop els pot ajudar molt en moltes de les seves activitats de mineria de dades i de processament, però els managers no s'acaben de fiar de que sigui software lliure. Una mica la història de sempre, gent que està més preocupada en escalar posicions dins de l'empresa que d'estar al corrent del que passa al món real. &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;Però bé, tornant a l'event en sí. &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;Com ja he dit, no faré un resum exhaustiu de tot el que es va parlar, però algunes de les idees més interessants: &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:large;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:large;"&gt;&lt;b&gt;Novetats dins Hadoop:&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;Facebook, Cloudera i Yahoo! estan començant a emmagatzemar Petabytes d'informació i estan creixent de forma exponencial. I en general molta gent utilitza Hadoop com a Data Warehouse.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;La majoria d'empreses que ténen els seus propis clusters utilitza màquines amb 12 discs durs (la majoria de vegades d'1 Tb), per tant, 12 Tb per màquina.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;Facebook i Yahoo! (les dues empreses ténen gent dedicada al 100% a desenvolupar Hadoop) estan invertint la majoria d'hores de commiters a millorar el DFS i el Namenode (el sistema que s'encarrega d'administrar el sistema de fitxers), bàsicament a fer-lo més estable (més encara ) i a permetre rèpliques i un possible Namenode secundari.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;Hadoop ara incorpora seguretat (de forma opcional) amb certificats Kerberos. El projecte mai havia tingut en compte la seguretat, però hi ha moltes empreses usuaries (bancs, departaments de defensa (si si, departaments de defensa), consultories ) han apretat molt perquè Hadoop fos compatible amb Kerberos i tecnologies similars. &lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;Facebook crearà la seva propia distribució de Hadoop.&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:large;"&gt;&lt;b&gt;Hadoop i Amazon AWS:&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:large;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;No sóc  usuari dels Amazon Web Services, bàsicament perquè mai n'he tingut la necessitat, sempre he treballat en companyies que tenien les seves pròpies màquines, però en sóc un gran fan. Des de fa un temps Amazon ofereix màquines virtuals amb Hadoop instal·lat, em va sorprendre la quantitat d'empreses que ho utilitza dia a dia. Els punts més interessants: &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;La imatge de Hadoop que ve instal·lada amb les màquines incorpora de sèrie Hadoop, Pig i Hive, s'està treballant per incorporar HBase.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;Permet ampliar i reduïr la mida del cluster en calent. Hi ha moltes empreses que ho utilitzen, per exemple, ténen un cluster de 4 màquines durant els dies de setmana per còrrer els seus treballs diaris i llavors per processar els treballs del cap de setmana (molt més grossos) amplien el cluster a 10 màquines, i quan els treballs estan acabats, tornen a les 4. Molt interessant, sobretot pel punt de vista econòmic.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;Empreses com Netflix ténen tota la seva infrastructura de Data Warehousing a Amazon. Així no han de mantenir el seu propi cluster i poden dedicar més esforços a altres temes.&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;En general però la impressió que m'estic enduent és que cada vegada hi ha més empreses (de noves tecnologies i d'altres) utilitzant Hadoop, ja sigui en les seves pròpies màquines o bé en clústers virtuals, a més, estan apareguent empreses com Cloudera, Datameer i Karmasphere que dónen suport i eines relacionades en Hadoop, un fet que prova que Hadoop està sient acceptat per la comunitat i per les empreses.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:large;"&gt;&lt;b&gt;Dia 3: Twitter + Facebook.&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:large;"&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;L'últim dia vam anar a Twitter, a veure a &lt;/span&gt;&lt;a href="http://blog.oskarsson.nu/"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;Johan Oskarson&lt;/span&gt;&lt;/a&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;, ex-Last.fm. Està a l'equip d'analytics desenvolupant la integració de Cassandra amb Hadoop. Ens va portar a fer un tour per les oficines i ens van convidar a dinar. &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Cap a la tarda a les oficines de Facebook, al grup d'usuaris de HBase, que és la implementació de Google Bigtable que ha fet la gent de Hadoop i que Facebook utilitza bastant ( té 3 enginyers només dedicats al seu desenvolupament). &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;A la reunió es van presentar les novetats d'HBase per la nova versió (0.9). De nou, es podria fer tot un post sobre el que es va dir, però intentaré resumir-ho en uns pocs punts:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;img src="http://1.bp.blogspot.com/_a84GcWW6wwE/TC_GcobFz6I/AAAAAAAAAWA/MikWtRZP4H0/s320/IMG_7718.JPG" style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;width: 320px; height: 240px;" border="0" alt="" id="BLOGGER_PHOTO_ID_5489824665977606050" /&gt;S'ha treballar per la estabilitat del codi (abans era bastant inestable)&lt;/li&gt;&lt;li&gt;S'ha treballat en millorar la rèplica entre datacenters i la tolerància a fallades.&lt;/li&gt;&lt;li&gt;La velocitat de HBase és semblant a la Cassandra. Això són paraules gruixudes ja que sempre s'havia catalogat HBase com incapaç de servir dades per una pàgina web. Es veu que ara si (jo no ho he provat).&lt;/li&gt;&lt;li&gt;Facebook deixarà Cassandra (recordem que Cassandra surt de Facebook justament) per utilitzar HBase. Això també són paraules gruixudes. Molt gruixudes.&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="font-size:large;"&gt;Enllaços relacionats:&lt;/span&gt;&lt;/b&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Aquí podeu trobar més enllaços sobre el summit: &lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;http://perspectives.mvdirona.com/2010/07/03/HadoopSummit2010.aspx&lt;/li&gt;&lt;li&gt;http://mndoci.com/2010/06/30/massive-data/&lt;/li&gt;&lt;li&gt;http://www.r-bloggers.com/my-experience-at-hadoop-summit-2010-hadoopsummit/&lt;/li&gt;&lt;li&gt;...&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6541464271719475452-4899367836686901950?l=distribuint.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://distribuint.blogspot.com/feeds/4899367836686901950/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://distribuint.blogspot.com/2010/07/hadoop-summit-2010.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6541464271719475452/posts/default/4899367836686901950'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6541464271719475452/posts/default/4899367836686901950'/><link rel='alternate' type='text/html' href='http://distribuint.blogspot.com/2010/07/hadoop-summit-2010.html' title='Hadoop Summit 2010'/><author><name>Marc</name><uri>http://www.blogger.com/profile/05631004736020219907</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://4.bp.blogspot.com/_a84GcWW6wwE/TTcLNqDwGxI/AAAAAAAAAXc/KscglDtW6gI/S220/lant.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_a84GcWW6wwE/TC_JwoD8y8I/AAAAAAAAAWI/OYAWkM2kR8w/s72-c/IMG_7710.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6541464271719475452.post-1240804450834339037</id><published>2010-06-14T15:24:00.003+01:00</published><updated>2010-06-14T15:30:38.403+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Enllaços de la setmana'/><category scheme='http://www.blogger.com/atom/ns#' term='rendiment'/><category scheme='http://www.blogger.com/atom/ns#' term='eficiència'/><title type='text'>Enllaços de la setmana (II)</title><content type='html'>Un parell d'enllaços que he trobat durant la setmana: &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://queue.acm.org/detail.cfm?id=1814327"&gt;You're doing it wrong&lt;/a&gt;: Article molt interessant de &lt;a href="http://people.freebsd.org/~phk/"&gt;Poul-Henning Kamp&lt;/a&gt;, de &lt;a href="http://www.freebsd.org/"&gt;FreeBSD&lt;/a&gt;, creador d'entre d'altres, de la llicència &lt;a href="http://en.wikipedia.org/wiki/Beerware"&gt;Beerware&lt;/a&gt;, sobre la repercusió de la memòria virtual i la paginació en els algorismes. &lt;/li&gt;&lt;li&gt;&lt;a href="http://code.google.com/p/javasimon/"&gt;Java Simon&lt;/a&gt;: Una llibreria de Java per monitoritzar el rendiment de les aplicacions. Molt senzilla d'usar. &lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6541464271719475452-1240804450834339037?l=distribuint.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://distribuint.blogspot.com/feeds/1240804450834339037/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://distribuint.blogspot.com/2010/06/enllacos-de-la-setmana-ii.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6541464271719475452/posts/default/1240804450834339037'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6541464271719475452/posts/default/1240804450834339037'/><link rel='alternate' type='text/html' href='http://distribuint.blogspot.com/2010/06/enllacos-de-la-setmana-ii.html' title='Enllaços de la setmana (II)'/><author><name>Marc</name><uri>http://www.blogger.com/profile/05631004736020219907</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://4.bp.blogspot.com/_a84GcWW6wwE/TTcLNqDwGxI/AAAAAAAAAXc/KscglDtW6gI/S220/lant.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6541464271719475452.post-1391729918928386512</id><published>2010-06-06T21:18:00.003+01:00</published><updated>2010-06-07T10:20:08.278+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='Enllaços de la setmana'/><category scheme='http://www.blogger.com/atom/ns#' term='data science'/><category scheme='http://www.blogger.com/atom/ns#' term='eficiència'/><title type='text'>Enllaços de la setmana (I)</title><content type='html'>&lt;div&gt;Obro una "nova secció" al blog, cada setmana intentaré posar els links més interessants que he anat trobant. Ja aviso que no tot seran novetats dins el món de la informàtica distribuïda, però sempre hi tindran (espero) alguna cosa a veure. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Comencem amb la primera setmana: &lt;/div&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.jcp.org/en/jsr/all"&gt;Java Community Process&lt;/a&gt;: No té res de nou, però és la pàgina principal per fer investigacions sobre com funciona el llenguatge Java i la màquina virtual &lt;i&gt;under the hood.&lt;/i&gt;&lt;/li&gt;&lt;li&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-style: normal; "&gt;&lt;a href="http://mailinator.blogspot.com/2010/02/how-i-sped-up-my-server-by-factor-of-6.html"&gt;Article molt interessant sobre eficiència en servidors multiprocessadors en Java&lt;/a&gt;: Més Java, aquest link és un article bastant tècnic sobre les millores d'eficiència quan es fan còrrer diversos (o alguns) processos Java en un sol processador en comptes d'un multiprocessador. És lectura obligada per programadors de servidors en Java, i promet discussió.&lt;/span&gt;&lt;/i&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://radar.oreilly.com/2010/06/what-is-data-science.html"&gt;Article d'Oreilly sobre què és la &lt;/a&gt;&lt;i&gt;&lt;a href="http://radar.oreilly.com/2010/06/what-is-data-science.html"&gt;Data Science&lt;/a&gt;: &lt;/i&gt;Ja n'he parlat alguna altra vegada de la Data Science. Aquest és un article/explicació que va ser molt popular la setmana pasada per Internet.&lt;/li&gt;&lt;li&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-style: normal; "&gt;&lt;a href="http://answers.oreilly.com/topic/1571-a-data-science-cheat-sheet/"&gt;Vídeo molt interessant sobre &lt;/a&gt;&lt;i&gt;&lt;a href="http://answers.oreilly.com/topic/1571-a-data-science-cheat-sheet/"&gt;Data Science&lt;/a&gt;: &lt;/i&gt;I més Data Science, aquesta vegada en format vídeo d'una de les enginyeres de &lt;a href="http://bit.ly"&gt;bit.ly&lt;/a&gt;&lt;/span&gt;&lt;/i&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6541464271719475452-1391729918928386512?l=distribuint.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://distribuint.blogspot.com/feeds/1391729918928386512/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://distribuint.blogspot.com/2010/06/enllacos-de-la-setmana-i.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6541464271719475452/posts/default/1391729918928386512'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6541464271719475452/posts/default/1391729918928386512'/><link rel='alternate' type='text/html' href='http://distribuint.blogspot.com/2010/06/enllacos-de-la-setmana-i.html' title='Enllaços de la setmana (I)'/><author><name>Marc</name><uri>http://www.blogger.com/profile/05631004736020219907</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://4.bp.blogspot.com/_a84GcWW6wwE/TTcLNqDwGxI/AAAAAAAAAXc/KscglDtW6gI/S220/lant.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6541464271719475452.post-230292302890857494</id><published>2010-05-28T14:04:00.001+01:00</published><updated>2010-05-28T14:06:17.755+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rest'/><category scheme='http://www.blogger.com/atom/ns#' term='api'/><category scheme='http://www.blogger.com/atom/ns#' term='soap'/><title type='text'>Rest vs Soap (II)</title><content type='html'>Us deixo un enllaç molt interessant sobre l'estat de les API de serveis d'Internet al 2009 i 2010: &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://www.readwriteweb.com/cloud/2010/05/pen-api-madness-the-party-has.php"&gt;http://www.readwriteweb.com/cloud/2010/05/pen-api-madness-the-party-has.php&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Fixeu-vos en la gràfica que mostra el número de crides REST vs SOAP.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6541464271719475452-230292302890857494?l=distribuint.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://distribuint.blogspot.com/feeds/230292302890857494/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://distribuint.blogspot.com/2010/05/rest-vs-soap-ii.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6541464271719475452/posts/default/230292302890857494'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6541464271719475452/posts/default/230292302890857494'/><link rel='alternate' type='text/html' href='http://distribuint.blogspot.com/2010/05/rest-vs-soap-ii.html' title='Rest vs Soap (II)'/><author><name>Marc</name><uri>http://www.blogger.com/profile/05631004736020219907</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://4.bp.blogspot.com/_a84GcWW6wwE/TTcLNqDwGxI/AAAAAAAAAXc/KscglDtW6gI/S220/lant.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6541464271719475452.post-6763333307592412532</id><published>2010-05-25T07:16:00.002+01:00</published><updated>2010-05-25T07:32:11.082+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='memòria'/><category scheme='http://www.blogger.com/atom/ns#' term='rendiment'/><title type='text'>La màquina virtual de java (I)</title><content type='html'>&lt;div&gt;Aquests últims dies he estat intentant informar-me de quines són les millor tècniques per optimitzar processos Java. Hi ha molta informació a la web, la majoria està a la pàgina oficial de &lt;strike&gt;Sun&lt;/strike&gt; Oracle. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;He intentat fer un petit resum per si a algú li interessa. Lògicament és una petita introducció amb molts de links a les pàgines amb la documentació oficial. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Primer, unes consideracions sobre optimitzacions i "benchmarks" que crec que són importants: &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Java SE 6 no va introduïr moltes novetats pel que fa a la API. Bàsicament és una actualització que atacava la performance de Java. Podem veure algunes gràfiques comparant els diferents rendiments a [&lt;a href="http://java.sun.com/performance/reference/whitepapers/6_performance.html#2.3"&gt;7&lt;/a&gt;]. Per tant, és important que ens assegurem que sempre tinguem la última versió de Java instal·lada al sistema. Un altre tema és que la informació que trobareu aquí parla exclusivament de la VM Hotspot (de Sun). Hi ha altres VM, amb altres rendiments, com podeu veure a [&lt;a href="http://www.usenix.org/event/jvm02/full_papers/jacob/jacob_html/node12.html"&gt;8&lt;/a&gt;].&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;En quant a les monitoritzacions, sempre que provem alguna cosa cal que les dades i l'estat de la màquina sigui el mateix. Tot i això en java cal tenir en compte: &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Warmup: &lt;/b&gt;La JVM funciona interpretant codi compil·lat. Segons la modalitat en que s'estigui executant (&lt;i&gt;client&lt;/i&gt; o &lt;i&gt;server&lt;/i&gt;) detectarà mètodes hot (que s'usen molt sovint) i els compilarà a codi natiu de la màquina per millorar-ne el temps d'execució. Això fa que el rendiment millori a mesura que s'executa el programa.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Garbage collection (GC):&lt;/b&gt; He pogut comprovar que la majoria de tècniques d'optimització en Java tenen a veure amb la gestió del GC i de la memòria. Malauradament el tema és molt complexe i es mereix un post ( o un llibre ) per si sól.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Mesurament de temps:&lt;/b&gt; En cas de que volguem pendre mesures de temps del programa i que no tinguem un profiler a mà Java ofereix dues crides que retornen temps. Es veu però que la &lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;System.currentTimeMillis()&lt;/span&gt; no és del tot fiable (sobretot en sistemes operatius Windows) i es recomana utilitzar la &lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;System.nanoTime()&lt;/span&gt;.&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;Finalment tenim la interpretació de resultats. No hi ha prou en executar-lo una vegada. Si es pot s'hauria de fer un anàlisi estadístic (més sobre tot això en un pròxim post). &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Un cop feta la introducció al tema, comentaré alguns dels links més interessants que he trobat: &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Java Tuning Whitepaper [&lt;a href="http://java.sun.com/performance/reference/whitepapers/tuning.html"&gt;1&lt;/a&gt;], tot i que sigui del 2005, és un molt bon recurs introductori. Molt genèric i fàcil d'entendre. Com ja he dit abans, bàsicament es parla de memòria i de GC.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;La màquina virtual de Java té les opcions que formen part dels &lt;i&gt;Ergonomics&lt;/i&gt;, que són les opcions que permeten modificar el comportament a l'hora d'executar els divesos programes, les opcions més conegudes són:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Xms:&lt;/b&gt; La quantitat de memòria inicial del programa. Si no donem una mida inicial aquesta serà de 2 Mb.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Xmx:&lt;/b&gt; La quantitat màxima de memòria que la màquina virtual estarà permesa a utilitzar.&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;Lògicament, hem de vigilar a l'hora d'asignar aquests valors, ja que influiran molt en el rendiment del programa, com més memòria millor, ara bé, com més memòria més haurà de treballar el GC i menys quedarà pel sistema operatiu, cosa que pot ocasionar que el rendiment general del sistema es vegi perjudicat. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Algunes opcions relacionades amb el GC [&lt;a href="http://java.sun.com/docs/hotspot/gc5.0/gc_tuning_5.html"&gt;2&lt;/a&gt;]:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;The -XX:+UseParallelGC parallel (throughput) garbage collector.&lt;/li&gt;&lt;li&gt;The -XX:+UseConcMarkSweepGC concurrent (low pause time) garbage collector (also known as CMS)&lt;/li&gt;&lt;li&gt;The -XX:+UseSerialGC serial garbage collector (for smaller applications and systems)&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;Una de les opcions que no coneixia d'abans és la de canviar la mida de les pàgines de memòria, bàsicament modificarem la mida de la &lt;a href="http://en.wikipedia.org/wiki/Translation_lookaside_buffer"&gt;TLB&lt;/a&gt; (Translation-Lookaside Buffer) que és la part de memòria que manté les traduccions de memòria virtual a memòria física. Ampliant la mida de les pàgines també ampliarem la mida de la TLB, i per tant seran menys fallades a l'hora de buscar adreces de memòria. Pot millorar l'eficiència d'aplicacions que utilitzin molta memòria. Cal tenir en compte que es pot afectar negativament l'eficiència del sistema, ja que l'aplicació pot fer un us execessiu de memòria fent que la resta del sistema es quedi curt, a més no és fàcil de configurar (s'ha de fer canvis a nivell del SO) podeu trobar instruccions aquí [&lt;a href="http://java.sun.com/javase/technologies/hotspot/largememory.jsp"&gt;3&lt;/a&gt;].&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I més opcions llistades a [&lt;a href="http://java.sun.com/javase/technologies/hotspot/vmoptions.jsp#PerformanceTuning"&gt;4&lt;/a&gt;], de les quals destacaria:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;XX:+UseFastAccessorMethods:&lt;span class="Apple-style-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/b&gt;Use optimized versions of Get&lt;primitive&gt;Field.&lt;/primitive&gt;&lt;/li&gt;&lt;li&gt;&lt;primitive&gt;&lt;/primitive&gt;&lt;b&gt;XX:+StringCache&lt;span class="Apple-style-span" style="white-space: pre;"&gt;: &lt;/span&gt;&lt;/b&gt;Enables caching of commonly allocated strings.&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;El document també té una secció molt interessant amb exemples explicats [&lt;a href="http://java.sun.com/performance/reference/whitepapers/tuning.html#section4.2"&gt;5&lt;/a&gt;].&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Finalment us deixo una llista de links bastant interessants sobre la JVM:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;Referències.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;[1] &lt;a href="http://java.sun.com/performance/reference/whitepapers/tuning.html"&gt;http://java.sun.com/performance/reference/whitepapers/tuning.html&lt;/a&gt;&lt;/div&gt;&lt;div&gt;[2] &lt;a href="http://java.sun.com/docs/hotspot/gc5.0/gc_tuning_5.html"&gt;http://java.sun.com/docs/hotspot/gc5.0/gc_tuning_5.html&lt;/a&gt;&lt;/div&gt;&lt;div&gt;[3]&lt;a href="http://java.sun.com/javase/technologies/hotspot/largememory.jsp"&gt; http://java.sun.com/javase/technologies/hotspot/largememory.jsp&lt;/a&gt;&lt;/div&gt;&lt;div&gt;[4] &lt;a href="http://java.sun.com/javase/technologies/hotspot/vmoptions.jsp#PerformanceTuning"&gt;http://java.sun.com/javase/technologies/hotspot/vmoptions.jsp#PerformanceTuning&lt;/a&gt;&lt;/div&gt;&lt;div&gt;[5] &lt;a href="http://java.sun.com/performance/reference/whitepapers/tuning.html#section4.2"&gt;http://java.sun.com/performance/reference/whitepapers/tuning.html#section4.2&lt;/a&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;&lt;/div&gt;&lt;div&gt;[6] &lt;a href="http://java.sun.com/performance/reference/whitepapers/6_performance.html"&gt;http://java.sun.com/performance/reference/whitepapers/6_performance.html&lt;/a&gt;&lt;/div&gt;&lt;div&gt;[7] &lt;a href="http://java.sun.com/performance/reference/whitepapers/6_performance.html#2.3"&gt;http://java.sun.com/performance/reference/whitepapers/6_performance.html#2.3&lt;/a&gt;&lt;/div&gt;&lt;div&gt;[8] &lt;a href="http://www.usenix.org/event/jvm02/full_papers/jacob/jacob_html/node12.html"&gt;http://www.usenix.org/event/jvm02/full_papers/jacob/jacob_html/node12.html&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6541464271719475452-6763333307592412532?l=distribuint.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://distribuint.blogspot.com/feeds/6763333307592412532/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://distribuint.blogspot.com/2010/05/la-maquina-virtual-de-java-i.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6541464271719475452/posts/default/6763333307592412532'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6541464271719475452/posts/default/6763333307592412532'/><link rel='alternate' type='text/html' href='http://distribuint.blogspot.com/2010/05/la-maquina-virtual-de-java-i.html' title='La màquina virtual de java (I)'/><author><name>Marc</name><uri>http://www.blogger.com/profile/05631004736020219907</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://4.bp.blogspot.com/_a84GcWW6wwE/TTcLNqDwGxI/AAAAAAAAAXc/KscglDtW6gI/S220/lant.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6541464271719475452.post-1545307256372481077</id><published>2010-05-18T21:12:00.002+01:00</published><updated>2010-05-18T21:15:06.632+01:00</updated><title type='text'>Nou disseny!</title><content type='html'>Bé, com que n'estava bastant fins als nassos del disseny vell, i sobretot dels problemes que tenia amb les fonts, els paràgrafs i els espais he decidit canviar de plantilla. Espero que aquesta sigui més agradable. &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;M'ha anat d'un pèl a no muntar el blog a un altre sistema com wordpress o postero.us. &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6541464271719475452-1545307256372481077?l=distribuint.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://distribuint.blogspot.com/feeds/1545307256372481077/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://distribuint.blogspot.com/2010/05/nou-disseny.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6541464271719475452/posts/default/1545307256372481077'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6541464271719475452/posts/default/1545307256372481077'/><link rel='alternate' type='text/html' href='http://distribuint.blogspot.com/2010/05/nou-disseny.html' title='Nou disseny!'/><author><name>Marc</name><uri>http://www.blogger.com/profile/05631004736020219907</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://4.bp.blogspot.com/_a84GcWW6wwE/TTcLNqDwGxI/AAAAAAAAAXc/KscglDtW6gI/S220/lant.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6541464271719475452.post-1316970990281432025</id><published>2010-05-17T17:29:00.015+01:00</published><updated>2010-05-18T13:40:26.855+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='bases de dades'/><category scheme='http://www.blogger.com/atom/ns#' term='key-value'/><category scheme='http://www.blogger.com/atom/ns#' term='nosql'/><title type='text'>Resum de la NoSQL EU 2010</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_a84GcWW6wwE/S_G9yjJ-0tI/AAAAAAAAAVE/_fQaXRsPZPU/s1600/nosql.png"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 294px; height: 75px;" src="http://4.bp.blogspot.com/_a84GcWW6wwE/S_G9yjJ-0tI/AAAAAAAAAVE/_fQaXRsPZPU/s400/nosql.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5472363698360079058" /&gt;&lt;/a&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;Fa temps que tenia pendent un post sobre les bases de dades "nosql". Les he tractat una mica per sobre en anteriors posts, i aprofitant que el mes passat vaig poder anar a la &lt;/span&gt;&lt;a href="http://nosqleu.com/"&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;NoSQL EU 2010&lt;/span&gt;&lt;/a&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt; crec que és un bon moment per reprendre el tema.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'trebuchet ms';"&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;Primer de tot, posem-nos en contexte i comencem pel principi.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:large;"&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;Què són les bases de dades #Nosql?&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;Ja n'he parlat en &lt;/span&gt;&lt;a href="http://distribuint.blogspot.com/search/label/bases%20de%20dades"&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;posts anteriors&lt;/span&gt;&lt;/a&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;, però podem dir de forma resumida que són unes bases de dades que no segueixen el &lt;/span&gt;&lt;a href="http://en.wikipedia.org/wiki/Relational_model"&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;model relacional&lt;/span&gt;&lt;/a&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;, i que per tant, no intenten seguir les normes &lt;/span&gt;&lt;a href="http://en.wikipedia.org/wiki/ACID"&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;ACID&lt;/span&gt;&lt;/a&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;Aquestes bases de dades han sorgit d'un seguit de necessitats molt lligades a uns grans volums d'informació, i per tant, a la distribució i escalabilitat dels sistemes. És per això que molt sovint estan relacionades a frameworks com Hadoop, del qual també n'he parlat en aquest &lt;/span&gt;&lt;a href="http://distribuint.blogspot.com/2009/03/hadoop.html"&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;blog&lt;/span&gt;&lt;/a&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;. &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;Hi ha diverses categories de Nosql, ràpidament: &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;Key-Value stores:&lt;/span&gt;&lt;/b&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt; Són taules de hash gegants. Volen ser molt ràpides. &lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;Document stores:&lt;/span&gt;&lt;/b&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt; Contenen informació sense esquema, normalment representada en json i indexada per qualsevol tipus dels seus valors. &lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;Column stores:&lt;/span&gt;&lt;/b&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt; Model &lt;/span&gt;&lt;a href="http://distribuint.blogspot.com/2009/05/bigtable.html"&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;Bigtable&lt;/span&gt;&lt;/a&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;. &lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;Graph databases:&lt;/span&gt;&lt;/b&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt; Representen un graf amb els seus nodes i connexions. &lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:large;"&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;De què es va parlar a la NoSQL EU 2010.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;La conferència va ser organitzada de tal manera que fos més un punt de trobada de programadors interessats en aquesta tecnologia que una conferència de classes magistrals.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;Van haver-hi una sèrie de discussions sobre què és aquesta tecnologia i sobretot, què &lt;/span&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;no&lt;/span&gt;&lt;/b&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt; és, ja que no ha sigut gaire ben rebuda per alguns sectors del món informàtic. S'ha d'admetre que el nom de NOSQL no és que estigui molt ben triat, certament dona una impressió potser una mica massa agresiva, però sembla que s'hagi muntat una espècie de guerra religiosa, en la qual, lògicament no penso entrar. [&lt;/span&gt;&lt;a href="http://www.youtube.com/watch?v=LhnGarRsKnA&amp;amp;feature=player_embedded"&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;1&lt;/span&gt;&lt;/a&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;] [&lt;/span&gt;&lt;a href="http://cacm.acm.org/blogs/blog-cacm/50678-the-nosql-discussion-has-nothing-to-do-with-sql/fulltext"&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;2&lt;/span&gt;&lt;/a&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;] [&lt;/span&gt;&lt;a href="http://i.imgur.com/37WNs.png"&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;3&lt;/span&gt;&lt;/a&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;] &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;Dins d'aquest "bloc" més general de la conferència hi va haver una explicació sobre les diferents categories i models de dades i una xerrada molt interessant a càrrec de Werner Vogels  (&lt;/span&gt;&lt;a href="http://twitter.com/werner"&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;@Werner&lt;/span&gt;&lt;/a&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;), CTO d'Amazon, un dels creadors de Dynamo, i probablement una de les persones més importants dins del món dels sistemes distribuïts (&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;opinió personal, feel free a opinar :&lt;/span&gt;&lt;/i&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;) . &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;El tema més tractat i el que va ser més interessant per tothom va ser sens subte els casos d'ús d'aquesta tecnologia i experiències reals, on es va explicar com funcionen aquests sistemes en producció a la BBC, The Guardian i Twitter entre d'altres, com s'han fer per escalar, sobre quins tipus de màquines corren, la càrrega i els problemes que havien tingut els equips que les havien desplegat. &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:large;"&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;Sensacions de les sessions i idees a destacar.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;Bé, sens cap mena de dubte el plat fort va ser la xerrada de Werner Vogels. Molt genèrica sobre sistemes distribuïts, la seva dificultat d'implementació i la seva història, però així mateix molt interessant. Els punts que em van agradar més: &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;Va destacar la importància de la col·laboració entre l'academia i la industria, per aconseguir tenir els punt de vista teòric i pràctic per finalment poder arribar a un sistema real i utilitzable.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;La dificultat dels sistemes, i que no hi ha un sistema perfecte, ni hi serà.&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;I guardo pel final el que em va agradar més i el que em va fer pensar més també: &lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;Un sistema (distribuït, en producció i crític) ha de ser anti tot. Volent dir que s'ha de fer de tal manera que el sistema aguanti TOT el que li caigui. En uns límits lògicament. Ha d'aguantar caigudes de xarxa, net splits, data centers que es queden sense conexió (això pasa, no m'ho creia, però us puc assegurar que pasa), sistemes de fitxers que es corrompen i bases de dades (relacionals o no) que es queden penjades.  Va utilitzar la següent frase per resumir-ho: &lt;/span&gt;&lt;blockquote&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;"&lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;Si hi ha un problema el dissabte a la nit, el sistema hauria de ser capaç a mantenir-se funcionant fins que l'encarregat del sistema vagi a treballar el dilluns a les 9 del matí".&lt;/span&gt;&lt;/i&gt;&lt;/blockquote&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;Vaig tornar a pensar amb aquesta frase quan el fa dos dissabtes em va sonar el mòbil a les 4 de la matinada (fet verídic).&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:large;"&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;Si algú vol més informació sobre el tema pot obtenir més informació en els següents links: &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;Presentacions de la conferència a &lt;/span&gt;&lt;a href="http://www.slideshare.net/search/slideshow?searchfrom=header&amp;amp;q=nosqleu"&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;slideshare&lt;/span&gt;&lt;/a&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;. (&lt;/span&gt;&lt;a href="http://www.slideshare.net/timanglade/a-nosql-overview"&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;la més introductòria&lt;/span&gt;&lt;/a&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;)&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://nosql.mypopescu.com/"&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;My Popescu&lt;/span&gt;&lt;/a&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;. Un blog amb noticies sobre el moviment #nosql&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;El grup de discussió a &lt;/span&gt;&lt;a href="http://groups.google.com/group/nosql-discussion"&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;google groups&lt;/span&gt;&lt;/a&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;. &lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;I lògicament, qualsevol dubte, ja sabeu a on em podeu trobar!&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:large;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6541464271719475452-1316970990281432025?l=distribuint.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://distribuint.blogspot.com/feeds/1316970990281432025/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://distribuint.blogspot.com/2010/05/resum-de-la-nosql-eu-2010.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6541464271719475452/posts/default/1316970990281432025'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6541464271719475452/posts/default/1316970990281432025'/><link rel='alternate' type='text/html' href='http://distribuint.blogspot.com/2010/05/resum-de-la-nosql-eu-2010.html' title='Resum de la NoSQL EU 2010'/><author><name>Marc</name><uri>http://www.blogger.com/profile/05631004736020219907</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://4.bp.blogspot.com/_a84GcWW6wwE/TTcLNqDwGxI/AAAAAAAAAXc/KscglDtW6gI/S220/lant.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_a84GcWW6wwE/S_G9yjJ-0tI/AAAAAAAAAVE/_fQaXRsPZPU/s72-c/nosql.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6541464271719475452.post-5120015775675307212</id><published>2010-01-20T22:40:00.005Z</published><updated>2010-05-17T14:39:34.943+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='rpc'/><title type='text'>Implementant servidors RPC</title><content type='html'>Recentment he implementat un servidor a la feina. Es tracta d'un programa relativament senzill que presenta una API en &lt;a href="http://incubator.apache.org/thrift/"&gt;thrift&lt;/a&gt;, a on cada mètode retorna una llista de valors. A on és la gràcia? doncs la gràcia és la càrrega que ha d'aguantar aquest servidor, i saber i tenir en compte quins tipus de recursos hardware utilitzarà més.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Primer de tot ens hem de fer unes preguntes sobre el que li caurà a sobre: &lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Què aguantarà normalment, o sigui, quantes peticions per segon haurà de contestar?&lt;/li&gt;&lt;li&gt;Quantes peticions de mitjana?&lt;/li&gt;&lt;li&gt;Quantes peticions rebrà a l'hora punta?&lt;/li&gt;&lt;li&gt;Hi haurà algun cas excepcional (però que igualment s'haurà de cobrir) a on les peticions per segon es disparin?&lt;/li&gt;&lt;li&gt;Quin timeout tindrà el client que l'utilitzarà. &lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;b&gt;Següent, quins tipus de recursos hardware seran el coll d'ampolla?&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-weight: normal; "&gt;Utilitzarà molta RAM?&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-weight: normal; "&gt;Farà moltes lectures a disc (el disc és local o bé remot?)&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-weight: normal; "&gt;Utilitzarà molta CPU?&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-weight: normal; "&gt;Utilitza recursos remots, com bases de dades?&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/b&gt;&lt;br /&gt;Lògicament això depen totalment del tipus de servei que estem implementant, tots són diferents, però en el meu cas es tracta d'un servei a on el coll d'ampolla és el disc. Estic llegint de diferents fitxers de text gegants, que canvien periòdicament i sense repetició de peticions del mateix valor, ah, i també necessito valors d'una base de dades remota. Què vol dir això?&lt;br /&gt;&lt;ul&gt;&lt;li&gt;El fet de que siguin fitxers gegants i bastants vol dir que no es poden llegir una vegada i tenir-los guardats a memòria. Per tant, cada vegada s'haurà de llegir de disc i…&lt;/li&gt;&lt;li&gt;Si mai es requereix el mateix valor vol dir que sempre s'hauran de llegir posicions diferents (i aleatòries) del fitxers i que per tant no val la pena tenir "valors populars" a la memòria cau perquè com a màxim es llegiran una vegada. &lt;/li&gt;&lt;li&gt;I de regal en la majoria d'invocacions he de consultar un valor en una base de dades. &lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Bé, tinguent en compte tot això… ho implementem. Uns dies després, s'haurà de provar.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Com ho proves un servei d'aquests?&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;Lògicament el servei tindrà una sèrie de testos unitaris i una sèrie de comprovacions. Però en aquest cas no em refereixo als testos d'integritat de dades i de funcionalitat. Em refereixo als testos de càrrega. Perquè no podem posar un servei en viu sense saber perfectament que aguantarà el que hagi d'aguantar. Oi?&lt;br /&gt;&lt;br /&gt;La solució immediata és implementar un client que utilitzi l'API del servei. Una cosa tant senzilla com un bucle que invoqui mètodes i controlar els temps de resposta, amb això aconseguirem un nivel de càrrega baix, però ja tindrem per començar. Els següent pas és paral·lelitzar aquest client, fer que crei diferents threads, i que cada thread faci les seves peticions al servidor, aquí ja podem aconseguir un nivell de càrrega decent, tot i que dependrà de l'ample de banda de la màquina a on estiguem corrent el client. El següent pas és utilitzar aquest client en diverses màquines a l'hora contra el mateix servidor, aquesta és la única manera amb la que es podrà recrear un volum de trànsit "real".&lt;br /&gt;&lt;br /&gt;Ara bé, a l'hora d'implementar el client, uns punts que s'han de tenir _molt_ en compte:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;S'han d'invocar &lt;i&gt;_tots_&lt;/i&gt; els mètodes del servidor, amb paràmetres &lt;i&gt;_reals_&lt;/i&gt; i vàlids. Així recrearem les peticions òptimes que hauria de rebre el servidor.&lt;/li&gt;&lt;li&gt;S'han d'invocar &lt;i&gt;_tots_&lt;/i&gt; els mètodes del servidor, amb paràmetres &lt;i&gt;_reals_&lt;/i&gt; i &lt;i&gt;_invàlids_&lt;/i&gt;. Un cop tinguis el servidor instal·lat i de "cara al públic" mai sabràs el que t'arribarà. No té sentit optimitzar el servidor si llavors un paràmetre fora d'ordre o fora de rang fa que saltin excepcions de forma interna o bé que es bloquegi. En el món real arribaran peticions invàlides, s'han de tenir en compte. &lt;/li&gt;&lt;li&gt;S'ha de provar el servidor a poder ser amb dades reals o bé de la mateixa magnitut de les dades amb que treballarà. El programa no tardarà el mateix en llegir un fitxer de 2Mb que un de 200Gb, depen del que facis fins i tot es pot quedar sense memòria. De la mateixa manera que si s'utilitza una base de dades no és el mateix fer una consulta a una taula amb 100 files d'una base de dades de test local que a una taula de centenars de milions de files en una base de dades en producció amb diversos usuaris utilitzant-la de forma concurrent. &lt;/li&gt;&lt;/ul&gt;En el meu cas vaig programar un client multithread en java amb tota una bateria de peticions vàlides i invàlides, que anava cridant de forma aleatòria, vaig tenir la sort de poder provar el servidor amb dades reals, ja que és només de lectura en una màquina exactament igual a la màquina de producció. &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Pel tema de provar el client a l'hora en diverses màquines vaig poder utilitzar 40 màquines a l'hora amb 100 threads cadascunta, això son 4000 threads fontent canya al servidor :) . &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Ah, una eina molt pràctica i senzilla per paral·lelitzar comandes en bash és &lt;a href="http://publib.boulder.ibm.com/infocenter/clresctr/vxrx/index.jsp?topic=/com.ibm.cluster.csm16.cmds.doc/am7cm_dsh.html"&gt;dsh&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Vaja, tarda molt, es queda sense memòria o es penja.&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;Bé, el servidor funciona bé amb un thread, ja li costa més amb 100 threads i deixa de respondre en 4000. Què passa?&lt;br /&gt;&lt;br /&gt;Això ja depén bastant del llenguatge d'implementació. En el meu cas vaig utilitzar Java i una molt bona eina per trobar problemes d'eficiència és &lt;a href="http://java.sun.com/j2se/1.5.0/docs/tooldocs/share/jstack.html"&gt;jstack&lt;/a&gt; que permet veure volcats de la pila d'una aplicació corrent sense matar-la.&lt;br /&gt;&lt;br /&gt;Bàsicament es tracta d'executar aquesta aplicació al servidor i llavors buscar entra els volcats de pila dels diversos threads el que estan BLOCKED, en cas de que n'hi hagi vol dir que són threads que estan en l'espera d'alguna cosa. Això pot donar pistes de llocs a on es pot optimitzar el codi.&lt;br /&gt;&lt;br /&gt;i finalment, us deixo amb:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;les receptes de l'àvia per optimització en Java.&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;Algunes coses que convé recordar a l'hora de programar en Java (tot i que algunes són de calaix):&lt;br /&gt;&lt;ol&gt;&lt;li&gt;En cas de que s'utilitzi bases de dades. És important que les connexions estiguin en un "pool" i que no es crein/destrueixin cada vegada. En cas d'utilitzar &lt;a href="http://www.springsource.org/"&gt;Spring&lt;/a&gt;/&lt;a href="https://www.hibernate.org/"&gt;Hibernate&lt;/a&gt;, cal saber què s'està fent. Aquests frameworks ténen moltes classes i cadascuna fa una cosa, convé utilitzar la que toca. &lt;/li&gt;&lt;li&gt;També en cas de que s'utilitzi una base de dades. Vulguis o no, pot ser costós, sobretot si es fa moltes vegades. Cal pensar sobre el resultat que n'obtenim. Spring/Hibernate utilitzen &lt;a href="http://ehcache.org/"&gt;Cache&lt;/a&gt; per emmagatzemar valors de forma transparent, això és una cosa que també es pot fer a nivell d'aplicació. Abans d'anar a la capa de dades, pensem-ho dues vegades, si ja hem buscat exactament allò a la base de dades quina és la probabilitat de que hagi canviat? si és poca, no cal fer la consulta. Posem el resultat en cache i ja ho preguntarem de nou al cap de 1 minut, 10 minuts o 1 hora. &lt;/li&gt;&lt;li&gt;Utilitzem llistes? LinkedList o ArrayList? Utilitzem conjunts? HashSet o TreeSet? la elecció de l'estructura de dades òptima pot tenir implicar unes diferències de recursos i de velocitat impressionants. Ah, i lògicament si sabem més o menys la mida que tindrà la llista resultat, inicialitzem la talla de la llista al crear-la. En aquest cas, &lt;a href="http://java.sun.com/javase/6/docs/api/"&gt;la api de sun&lt;/a&gt; és la vostra amiga. &lt;/li&gt;&lt;li&gt;Estem concatenant strings? doncs StringBuilder.&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;Espero que l'article sigui clar i que almenys el &lt;i&gt;checklist&lt;/i&gt; de coses a provar estalvïi problemes a algú :)&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6541464271719475452-5120015775675307212?l=distribuint.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://distribuint.blogspot.com/feeds/5120015775675307212/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://distribuint.blogspot.com/2010/01/implementant-servidors-rpc.html#comment-form' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6541464271719475452/posts/default/5120015775675307212'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6541464271719475452/posts/default/5120015775675307212'/><link rel='alternate' type='text/html' href='http://distribuint.blogspot.com/2010/01/implementant-servidors-rpc.html' title='Implementant servidors RPC'/><author><name>Marc</name><uri>http://www.blogger.com/profile/05631004736020219907</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://4.bp.blogspot.com/_a84GcWW6wwE/TTcLNqDwGxI/AAAAAAAAAXc/KscglDtW6gI/S220/lant.png'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6541464271719475452.post-8599723359292372604</id><published>2009-11-08T12:17:00.002Z</published><updated>2009-11-08T12:26:24.751Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='thrift'/><category scheme='http://www.blogger.com/atom/ns#' term='soap'/><category scheme='http://www.blogger.com/atom/ns#' term='rpc'/><title type='text'>SOAP fail</title><content type='html'>&lt;p&gt;Estic veient una tendència a la xarx&lt;a href="http://github.com/blog/531-introducing-bert-and-bert-rpc"&gt;a?&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://github.com/blog/531-introducing-bert-and-bert-rpc"&gt;Blog de Github, post sobre RPC's&lt;/a&gt;: &lt;/p&gt;&lt;p&gt;"&lt;em&gt;XML-RPC, SOAP, and other XML based protocols are hardly even worth mentioning. They are unnecessarily verbose and complex. XML is not convertible to a simple unambiguous data structure in any language I’ve ever used. I’ve wasted too many hours of my life clumsily extracting data from XML files to feel anything but animosity towards the format&lt;/em&gt;."&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.turnleafdesign.com/trends-rest-to-over-take-soap"&gt;Un altre&lt;/a&gt;, blog que es lamenta dels SOAP's.&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.google.co.uk/url?sa=t&amp;amp;source=web&amp;amp;ct=res&amp;amp;cd=1&amp;amp;ved=0CAcQFjAA&amp;amp;url=http%3A%2F%2Fincubator.apache.org%2Fthrift%2Fstatic%2Fthrift-20070401.pdf&amp;amp;ei=1bf2StuNLor44Ab0pLzUAw&amp;amp;usg=AFQjCNF29t5bh8YPcxmDvC79N9HnxsJtVg&amp;amp;sig2=xM26HO60inFzxdH5Z1ZX0w"&gt;Del paper sobre Thrift (by Facebook)&lt;/a&gt;: Thrift és un RPC que han fet els de Facebook per ús intern, al paper on n'expliquen les bases fan una comparació amb altres frameworks i dónen els motius pels quals no els han utilitzat, en cas de SOAP, simplement: &lt;/p&gt;&lt;p&gt;"&lt;em&gt;SOAP. XML-based. Designed for web services via HTTP, excessive XML parsing overhead.&lt;/em&gt;"&lt;/p&gt;&lt;p&gt;Estic convençut d'haver llegit més històries recentment, però vaig ser massa mandrós per anar-les apuntant. &lt;/p&gt;&lt;p&gt;En definitiva. No utilitzeu SOAP Web Services. Algun dia explicaré perquè els hi tinc tanta mania. &lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6541464271719475452-8599723359292372604?l=distribuint.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://distribuint.blogspot.com/feeds/8599723359292372604/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://distribuint.blogspot.com/2009/11/soap-fail.html#comment-form' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6541464271719475452/posts/default/8599723359292372604'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6541464271719475452/posts/default/8599723359292372604'/><link rel='alternate' type='text/html' href='http://distribuint.blogspot.com/2009/11/soap-fail.html' title='SOAP fail'/><author><name>Marc</name><uri>http://www.blogger.com/profile/05631004736020219907</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://4.bp.blogspot.com/_a84GcWW6wwE/TTcLNqDwGxI/AAAAAAAAAXc/KscglDtW6gI/S220/lant.png'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6541464271719475452.post-3499883723968792621</id><published>2009-10-29T22:09:00.003Z</published><updated>2009-10-29T22:52:00.201Z</updated><title type='text'>Spring killed the Java star.</title><content type='html'>&lt;p&gt;Un títol suggerent no ? &lt;/p&gt;&lt;p&gt;Els que em coneixen sabran que mai he sigut un fan ni de Spring ni d'altres frameworks ni convencions de programació. No sé, sempre he sigut &lt;em&gt;de la vella escola&lt;/em&gt;. &lt;/p&gt;&lt;p&gt;Anem en compte. Són uns grans frameworks i realment ajuden en el desenvolupament, sobretot d'aplicacions d'un nivell avançat i complicat. I tot i que els utilitzo poc, els utilitzo. &lt;/p&gt;&lt;p&gt;Actualment a &lt;a href="http://last.fm"&gt;last.fm&lt;/a&gt; estem buscant gent, tenim dues posicions obertes: &lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.last.fm/about/jobs#job_Java+Data+Engineer"&gt;Enginyer de Dades&lt;/a&gt;: Necessitem un enginyer que es manegui bé treballant amb moltes dades (Terabytes) i Java. &lt;/li&gt;&lt;li&gt;&lt;a href="http://www.last.fm/about/jobs#job_Java+Developer+-+Catalogue"&gt;Enginyer de Catàleg&lt;/a&gt;: Hauria de tenir un nivell avançat de Java + SQL + Postgres. &lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Que ho sapigueu. &lt;/p&gt;&lt;p&gt;Bé, estem fent entrevistes de feina i tenim alguns problemes. Bàsicament tenim moltes aplicacions de gent que sap &lt;a href="https://www.hibernate.org/"&gt;Hibernate&lt;/a&gt;, però no domina SQL i sap &lt;a href="http://www.springsource.org/"&gt;Spring&lt;/a&gt;, però no domina Java. Fatal.&lt;/p&gt;&lt;p&gt;Per què? doncs per els següents motius:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Bases de dades:&lt;/strong&gt; Hibernate es una solució meravellosa. Un cop tens tota la història configurada et permet accedir a la base de dades de forma còmoda, sense històries i sense SQL. Meravellós oi? doncs sí. Ara bé! què passa quan hi ha una urgència i s'han de fer &lt;em&gt;queries &lt;/em&gt;complicades a la base de dades des d'un terminal per ssh. Ja l'hem liada. Doncs no pot ser. &lt;/li&gt;&lt;li&gt;&lt;strong&gt;Java&lt;/strong&gt;: Aquest tema és més general. Molta gent que sap Spring té clares com fer les coses, però moltes vegades no sap perquè es fan d'aquesta manera. Si t'estàs enfrontant amb un projecte clàssic, com és tenir una base de dades amb un nivell de domini ben definit, un nivell amb els controladors i el nivell de vistes el que t'importa és fer les coses el més bé i el més còmodament possible, en aquest cas Spring (o qualsevol altre framework) és una solució idònia.  Quan estàs en una situació estranya què s'ha de fer? doncs tirar de l'API de Java. I si és una situació estranya cal dominar-la. &lt;/li&gt;&lt;/ul&gt;&lt;p&gt;El cas de last.fm és bastant peculiar. El meu equip treballa amb moltes quantitats de dades, és per això que entre d'altres eines utilitzem Hadoop. Però no sempre es soluciona tot amb Map Reduce. &lt;/p&gt;&lt;p&gt;Amb un volum d'entrada de dades normals, l'elecció entre un &lt;a href="http://java.sun.com/javase/6/docs/api/java/util/HashMap.html"&gt;HashMap&lt;/a&gt; o un &lt;a href="http://java.sun.com/javase/6/docs/api/java/util/TreeMap.html"&gt;TreeMap&lt;/a&gt;  (lògicament per alguna tasca auxiliar i no guardar les dades!) pot sembla anecdòtica. La diferència serà de microsegons. Ara bé, si l'entrada és de Terabytes de dades la diferència pot arribar a ser d'hores en quan a velocitat, apart de que podem rebentar el límit de memòria de la màquina virtual. Per tant, en el nostre cas, són coses que s'han de saber. &lt;/p&gt;&lt;p&gt;Lògicament són coses que s'aprenen amb experiència, però estic veient que aquests tipus de coneixements, els coneixements sobre com funciona un llenguatge o un compilador a &lt;strong&gt;fons &lt;/strong&gt;manquen cada vegada més i més. Aquest tipus de frameworks estan apartant coneixements bàsics d'informàtica que sempre s'haurien de tenir en compte.&lt;/p&gt;&lt;p&gt;Bé, això són tant sols unes reflexions personals. Cal saber de tot i aquests frameworks són importants, ara bé, com tot, s'ha de saber quan s'han d'utilitzar i quan no. &lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6541464271719475452-3499883723968792621?l=distribuint.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://distribuint.blogspot.com/feeds/3499883723968792621/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://distribuint.blogspot.com/2009/10/spring-killed-java-star.html#comment-form' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6541464271719475452/posts/default/3499883723968792621'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6541464271719475452/posts/default/3499883723968792621'/><link rel='alternate' type='text/html' href='http://distribuint.blogspot.com/2009/10/spring-killed-java-star.html' title='Spring killed the Java star.'/><author><name>Marc</name><uri>http://www.blogger.com/profile/05631004736020219907</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://4.bp.blogspot.com/_a84GcWW6wwE/TTcLNqDwGxI/AAAAAAAAAXc/KscglDtW6gI/S220/lant.png'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6541464271719475452.post-6540145030434036103</id><published>2009-07-30T00:43:00.003+01:00</published><updated>2009-07-30T00:46:50.490+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='documentation'/><title type='text'>Technical documentation guidelines.</title><content type='html'>&lt;p&gt; After some years of working as a developer I've realized the lack of standard guidelines when it comes to writing technical documentation. Not user manuals. Technical documentation, the one you &lt;i&gt;should&lt;/i&gt; write when you develop a system, or the one you &lt;i&gt;should&lt;/i&gt; get when you start maintaining a system somebody developed. &lt;/p&gt;&lt;p&gt;   So, no standard guidelines around ? (at least that i liked), no problem, open source, open world. I made my own.  &lt;/p&gt;&lt;p&gt; I started researching, getting technical documentations from different projects, getting the opinions from lots of good professional developers and using lots of common sense (&lt;b&gt;my&lt;/b&gt; common sense, well, and sometimes other people's common sense) and this is what i came to:&lt;/p&gt;&lt;p&gt;&lt;span style="font-style: italic;"&gt;Ok, I tried, I promise, I tried. I cannot format the document in Blogspot. I've created a static html page. You can find the article: &lt;a href="http://users.last.fm/%7Emarc/doc/"&gt;HERE&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6541464271719475452-6540145030434036103?l=distribuint.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://distribuint.blogspot.com/feeds/6540145030434036103/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://distribuint.blogspot.com/2009/07/technical-documentation-guidelines.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6541464271719475452/posts/default/6540145030434036103'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6541464271719475452/posts/default/6540145030434036103'/><link rel='alternate' type='text/html' href='http://distribuint.blogspot.com/2009/07/technical-documentation-guidelines.html' title='Technical documentation guidelines.'/><author><name>Marc</name><uri>http://www.blogger.com/profile/05631004736020219907</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://4.bp.blogspot.com/_a84GcWW6wwE/TTcLNqDwGxI/AAAAAAAAAXc/KscglDtW6gI/S220/lant.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6541464271719475452.post-8486906221087052202</id><published>2009-07-11T20:52:00.005+01:00</published><updated>2009-07-12T15:58:32.415+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='hive'/><category scheme='http://www.blogger.com/atom/ns#' term='hadoop'/><title type='text'>Hive</title><content type='html'>Aquest post parlo de Hive, una eina que han fet a Facebook que converteix un llenguatge d'accés a dades semblant SQL a treballs map-reduce per fer consultes als directoris guardats en el DFS de Hadoop.&lt;br /&gt;&lt;br /&gt;Un dels problemes que tenim els usuaris de Hadoop és que estem treballant amb uns volums de dades considerables. En cas contrari seria millor utilitzar Python o Erlang o una base de dades relacional (insisteixo una vegada més, Hadoop si i només si s'ha de treballar amb moltes dades). Com ja he explicat en &lt;a href="http://distribuint.blogspot.com/2009/03/hadoop.html"&gt;altres&lt;/a&gt; posts un dels sub-projectes de Hadoop és el sistema de fitxers, fet a inspiració del Google File System (GFS). És un sistema redundant i distribuït, per tant cada fitxer està fragmentat per la xarxa i n'hi ha diverses còpies. Això implica que sigui molt difícil perdre un fitxer (ja que n'hi ha 3 còpies diferents), però al mateix moment es fa més complicat poder accedir a aquest fitxer, ja que qualsevol manipulació que se li vulgui aplicar (sense un treball map/reduce de Hadoop) força que s'hagi de baixar del clúster, i aquests fitxers poden arribar a ser molt grans (molt molt grans). &lt;br /&gt;&lt;br /&gt;Això a efectes pràctics significa que no es pot fer de forma senzilla un 'grep' per buscar continguts. El fitxer està repartit pel clúster per tant, s'ha de fer un treball map-reduce per fer el grep. El codi de hadoop ja porta implementada aquesta utilitat, però igualment és incòmode i poc potent. &lt;br /&gt;&lt;br /&gt;En principi no hauria de ser un problema, ja que normalment interessa processar una entrada i un cop tenim la sortida a punt la baixem tota del clúster per servir-la a la pàgina web, per inserir-la a la base de dades o el que sigui. El problema ve quan necessites saber (urgentment) una certa línia d'un fitxer de 200 Gb que està fragmentat dins el clúster.&lt;br /&gt;&lt;br /&gt;Potser això és una mica difícil d'entendre, un exemple:&lt;br /&gt;&lt;br /&gt;Com sabeu fa poc es va morir Michael Jackson, doncs bé, quan la noticia es va escampar la gent va començar a escoltar la seva música. A last.fm vam començar a rebre &lt;i&gt;scrobbles&lt;/i&gt; de Michael Jackson, aquests &lt;i&gt;scrobbles&lt;/i&gt;, que basicament hi ha l'identificador d'usuari i la cançó que aquest ha escoltat es guarden al sistema de fitxers distribuït per a ser processats per Hadoop. No ens volíem esperar a que fos al vespre per saber quanta gent de més havia escoltat al difunt rei del pop. La solució era fer un programa (en Java o bé en Dumbo) per agafar aquestes dades i fer un grep per veure quants usuaris era, una cosa que utilitzant bash senzillament seria:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;bash $&gt; grep michaeljackonid fitxer_scrobbles | sort -k columna_usuari -u | wc -l &lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;és en Java molt més pesat i complicat d'escriure.&lt;br /&gt;&lt;br /&gt;Els de l'equip de dades ja havíem tingut diverses peticions d'aquestes anteriorment, i ja tenim una sèrie de programes (mal fets, a base de copy and paste, ràpids) per fer consultes. El principal problema és que d'aquesta manera s'acaba tinguent una bateria d'scripts de consulta que són impossibles de reutilitzar, totalment específics i que serveixen tant sols una vegada. &lt;br /&gt;&lt;br /&gt;Però aquesta vegada va ser diferent, perquè des de feia uns dies estàvem jugant amb Hive!&lt;br /&gt;&lt;br /&gt;Segons la &lt;a href="http://wiki.apache.org/hadoop/Hive"&gt;seva pàgina&lt;/a&gt;, Hive és una infraestructura de 'warehouse' (magatzem de dades) que corre sobre Hadoop i permet la consulta de dades. Per tant, és en certa manera. Una infraestructura per córrer SQL sobre directoris de DFS.&lt;br /&gt;&lt;br /&gt;Convé tenir en consideració els següent punt, &lt;b&gt;molt important&lt;/b&gt;:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt; &lt;li&gt;Hive &lt;b&gt;no&lt;/b&gt; és una base de dades.&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;El que fa Hive és tenir en uns fitxers propis del DFS de Hadoop una sèrie de dades que en certa manera descriuen les estructures de directoris dels directoris normals del DFS. Un cop tenim això, la línia de comandaments de Hive permet fer consultes amb SQL. S'ha elegit aquest llenguatge de consulta perquè (&lt;i&gt;desgraciadament?&lt;/i&gt;) és el que sap tothom i realment no fa falta crear-ne cap altre. &lt;br /&gt;&lt;br /&gt;Aquesta consulta SQL és convertida per Hive en diversos passos, com podem veure en el &lt;a href="http://wiki.apache.org/hadoop/Hive/Design"&gt;document d'arquitectura&lt;/a&gt; en una sèrie de tasques Map Reduce que corren de forma normal al clúster.&lt;br /&gt;&lt;br /&gt;Aquestes tasques senzillament agrupen les dades i les filtren tal com hem dit a la consulta, i en cas que sigui necessari les ordenen (&lt;i&gt;order by&lt;/i&gt;), treuen duplicats (&lt;i&gt;distinct&lt;/i&gt;)...&lt;br /&gt;&lt;br /&gt;Per tant, amb Hive podem córrer una consulta sobre totes les dades del sistema de fitxers distribuït, de forma senzilla i sense haver de carregar totes les dades en una base de dades relacional.&lt;br /&gt;&lt;br /&gt;A mi personalment, m'estalviarà moltes hores, ah, i per cert, l'augment d'oients de Michael Jackson el podeu trobar &lt;a href="http://www.flickr.com/photos/lastfm/3661753675/"&gt;aquí&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6541464271719475452-8486906221087052202?l=distribuint.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://distribuint.blogspot.com/feeds/8486906221087052202/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://distribuint.blogspot.com/2009/07/aquest-post-parlo-de-hive-una-eina-que.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6541464271719475452/posts/default/8486906221087052202'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6541464271719475452/posts/default/8486906221087052202'/><link rel='alternate' type='text/html' href='http://distribuint.blogspot.com/2009/07/aquest-post-parlo-de-hive-una-eina-que.html' title='Hive'/><author><name>Marc</name><uri>http://www.blogger.com/profile/05631004736020219907</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://4.bp.blogspot.com/_a84GcWW6wwE/TTcLNqDwGxI/AAAAAAAAAXc/KscglDtW6gI/S220/lant.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6541464271719475452.post-5503831085520790518</id><published>2009-06-16T23:27:00.002+01:00</published><updated>2009-06-16T23:33:12.640+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='video'/><category scheme='http://www.blogger.com/atom/ns#' term='bigtable'/><category scheme='http://www.blogger.com/atom/ns#' term='bases de dades'/><category scheme='http://www.blogger.com/atom/ns#' term='dynamo'/><title type='text'>Nosql</title><content type='html'>Tot just la setmana passada es va celebrar la primera trobada &lt;i&gt;Nosql&lt;/i&gt; a San Francisco, sobre bases de dades distribuïdes i no relacionals. Coincidint amb el Hadoop Summit 2009.&lt;br /&gt;&lt;br /&gt;Bàsicament va ser una trobada dels principals desenvolupador / usuaris de bases de dades no relacionals (basades en &lt;a href="http://distribuint.blogspot.com/2009/05/bigtable.html"&gt;Google BigTable&lt;/a&gt; i &lt;a href="http://distribuint.blogspot.com/2009/05/dynamo.html"&gt;Amazon Dynamo&lt;/a&gt;), on cada desenvolupador va explicar les característiques del seu sistema. &lt;br /&gt;&lt;br /&gt;Aquí us deixo un link del blog de'n &lt;a href="http://blog.oskarsson.nu/2009/06/nosql-debrief.html"&gt;Johan Oskarsson&lt;/a&gt; que hi va assistir amb els links a totes les transparències utilitzades així com els videos. Espero que us sigui de servei!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6541464271719475452-5503831085520790518?l=distribuint.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://distribuint.blogspot.com/feeds/5503831085520790518/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://distribuint.blogspot.com/2009/06/nosql.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6541464271719475452/posts/default/5503831085520790518'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6541464271719475452/posts/default/5503831085520790518'/><link rel='alternate' type='text/html' href='http://distribuint.blogspot.com/2009/06/nosql.html' title='Nosql'/><author><name>Marc</name><uri>http://www.blogger.com/profile/05631004736020219907</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://4.bp.blogspot.com/_a84GcWW6wwE/TTcLNqDwGxI/AAAAAAAAAXc/KscglDtW6gI/S220/lant.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6541464271719475452.post-145494437623851464</id><published>2009-06-15T18:17:00.002+01:00</published><updated>2009-06-15T18:23:27.526+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='hadoop'/><title type='text'>Hadoop, the definitive guide.</title><content type='html'>S'acaba de publicar a O'Reilly &lt;a href="http://oreilly.com/catalog/9780596521974/"&gt;'Hadoop, the Definitive Guide'&lt;/a&gt;. Un llibre sobre Hadoop (lògicament) que ha escrit &lt;a href="http://www.oreillynet.com/pub/au/1271"&gt;Tom White&lt;/a&gt; i en el qual he contribuït en un capítol d'experiències.&lt;br /&gt;&lt;br /&gt;pd.- Lògicament sóc el &lt;i&gt;culpable&lt;/i&gt; de la imatge de la pàgina 413.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6541464271719475452-145494437623851464?l=distribuint.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://distribuint.blogspot.com/feeds/145494437623851464/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://distribuint.blogspot.com/2009/06/hadoop-definitive-guide.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6541464271719475452/posts/default/145494437623851464'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6541464271719475452/posts/default/145494437623851464'/><link rel='alternate' type='text/html' href='http://distribuint.blogspot.com/2009/06/hadoop-definitive-guide.html' title='Hadoop, the definitive guide.'/><author><name>Marc</name><uri>http://www.blogger.com/profile/05631004736020219907</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://4.bp.blogspot.com/_a84GcWW6wwE/TTcLNqDwGxI/AAAAAAAAAXc/KscglDtW6gI/S220/lant.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6541464271719475452.post-1845684628269074946</id><published>2009-05-17T17:50:00.002+01:00</published><updated>2009-05-17T18:01:13.786+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='bases de dades'/><category scheme='http://www.blogger.com/atom/ns#' term='key-value'/><category scheme='http://www.blogger.com/atom/ns#' term='p2p'/><category scheme='http://www.blogger.com/atom/ns#' term='amazon'/><category scheme='http://www.blogger.com/atom/ns#' term='dynamo'/><category scheme='http://www.blogger.com/atom/ns#' term='rellotges vectorials'/><title type='text'>Dynamo</title><content type='html'>Avui toca comentar el segon article sobre nous models de bases de dades. Per tant, nens i nenes, &lt;a href="http://www.allthingsdistributed.com/files/amazon-dynamo-sosp2007.pdf"&gt;Dynamo&lt;/a&gt;. Per cert, un dels autors del paper és &lt;a href="http://en.wikipedia.org/wiki/Werner_Vogels"&gt;Werner Vogels&lt;/a&gt;, CTO d'Amazon, i realment recomano molt el seu blog, &lt;a href="http://www.allthingsdistributed.com/"&gt;All things distributed&lt;/a&gt;. Vinga va, comencem...&lt;br /&gt;&lt;br /&gt;Dynamo és una key-value store que és utilitzada ( i dissenyada i programada ) a Amazon. Suposo que tots sabeu a què es dedica Amazon i també podeu tenir una idea de com és la pàgina web. Per tant, no és una sorpresa quan veiem que dos dels principals objectius de Dynamo son: &lt;ul&gt;&lt;br /&gt; &lt;li&gt;&lt;b&gt;Escalabilitat. &lt;/b&gt;&lt;br /&gt; &lt;li&gt;&lt;b&gt;Alta disponibilitat.&lt;/b&gt;&lt;/ul&gt;&lt;br /&gt;Igual que la Google va dissenyar i programar la seva pròpia solució al emmagatzemament de dades, ja que no va trobar cap producte que pogués utilitzar, per tant Dynamo es va fer a mida. Hi ha molts serveis interns d'Amazon que només necessiten accés simple a un valor segons un clau. Per tant, una taula de hash. &lt;br /&gt;&lt;br /&gt;Dynamo utilitza una barreja de tècniques ben conegudes dins de l'àmbit de sistemes distribuïts per aconseguir escalabilitat i disponibilitat, entre les quals hi ha la partició i replicació de dades entre els diferents nodes i versionat d'objectes. Ara bé, quan tenim objectes replicats i repartits a través de la xarxa apareixen problemes. Com ho fem per assegurar que totes les còpies dels objectes són la mateixa ? com ho fem perquè quan un usuari afegeixi un CD al seu carro de la compra, totes les còpies s'actualitzin? En aquest cas Dynamo utilitza una tècnica, semblant a un quòrum i un protocol descentralitzat de sincronització de rèpliques (&lt;i&gt;sona guai eh?, tranquils que ja explicaré una mica més endavant què és&lt;/i&gt;), a més, té un detector de fallades mitjançant un &lt;a href="http://en.wikipedia.org/wiki/Gossip_protocol"&gt;protocol de gossip&lt;/a&gt; (hi haurà un article aviat només d'aquests protocols, no patiu). Tot això fa que els nodes d'emmagatzemament puguin ésser afegits i trets de la xarxa sense cap tipus de partionament o redistribució manual. Tot és automàtic.&lt;br /&gt;&lt;br /&gt;Aquesta key-value store està en producció i ha estat provada repetides vegades, el seu primer gran repte va ser suportar tota la càrrega addicional del període nadalenc. Simplement va funcionar i va escalar el que va fer falta sense que ningú hi fes res (si més no, és el que diuen, jo no hi era :P).&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Consideracions de disseny&lt;/h3&gt;Amazon al principi utilitzava RDBMS per tots els seus sistemes. Molts d'aquests sistemes guardaven la informaci  i la consultaven per la clau primària, això vol dir que realment no utilitzaven totes les possibilitats d'aquests sistemes. A més, les funcionalitats de rèplica que ofereixen aquestes tecnologies trien la &lt;i&gt;consistència&lt;/i&gt; en comptes de &lt;i&gt;disponibilitat&lt;/i&gt;. Això en paraules planes vol dir que si la base de dades troba que un valor que està replicat (té "còpies de seguretat") té valors diferents entre les còpies, prefereix solucionar el problema en comptes de retornar el resultat, causant retards. &lt;br /&gt;&lt;br /&gt;Per tant, els requeriments que tenia l'equip d'enginyers d'Amazon eren:&lt;ul&gt;&lt;br /&gt; &lt;li&gt;&lt;i&gt;Model de consulta&lt;/i&gt;: Operacions de lectura i escriptura a un element que simplement està identificat per una clau. No hi ha operacions que realitzin consultes a diferents elements a l'hora, simplement no hi ha necessitat de cap esquema relacional.&lt;br /&gt; &lt;li&gt;&lt;i&gt;Propietats &lt;a href="http://en.wikipedia.org/wiki/ACID"&gt;ACID&lt;/a&gt;&lt;/i&gt;: Les bases de dades que implementen les 4 lletres tendeixen a tenir poca disponibilitat en casos extrems, per tant, es va decidir rebaixar la 'C' (Consistència), cosa que implica una millora en la disponibilitat.&lt;br /&gt; &lt;li&gt;&lt;i&gt;Eficiència&lt;/i&gt;: El sistema havia de funcionar (igual que Google/BigTable) en hardware senzill i barat, i tots les mètriques de latència estan preses en el 99.9 percentil de la distribució. Cosa que vol dir que SEMPRE ha d'anar molt ràpid.&lt;br /&gt; &lt;li&gt;&lt;i&gt;Altres&lt;/i&gt;: Dynamo funciona dins d'Amazon, per tant s'entén que és un entorn no hostil, per tant, no hi ha requeriments de seguretat, ergo, no hi ha ni autenticació i autorització.&lt;br /&gt;&lt;/ul&gt;Un cop tenim clars els requeriments passem al disseny de Dynamo.&lt;br /&gt;&lt;br /&gt;En entorns de bases de dades distribuïdes és important el tema de la consistència entre rèpliques (com ja s'ha comentat abans). Normalment s'utilitza una coordinació síncrona de rèpliques per poder tenir una consistència fiable. Això implica que la disponibilitat del sistema és menor en alguns escenaris de fallada, ja que el motor de la base de dades marca les dades com no disponibles fins que està totalment segur que tot és correcte. &lt;br /&gt;&lt;br /&gt;Dynamo ho fa diferent, utilitza tècniques de replicació optimista, que vol dir que els canvis es propaguen passi el que passi i que es permet continuar treballant amb normalitat tot i que hi hagi casos de desconnexió. Aquesta aproximació pot portar a casos on es poden trobar conflictes, lògicament aquests conflictes s'han de descobrir i arreglar. Ara bé:&lt;ul&gt;&lt;br /&gt; &lt;li&gt;Qui ho resol?&lt;br /&gt; &lt;li&gt;Quan ho resol?&lt;br /&gt;&lt;/ul&gt;&lt;i&gt;Atenció amb la següent frase que té tela (i la poso en negreta perquè almenys jo, la primera vegada que la vaig llegir vaig caure de culs a terra): &lt;/i&gt;&lt;b&gt;Dynamo està dissenyat per ser una data store que tard o d'hora serà consistent, cosa que vol dir que tots els canvis tard o d'hora arriben a tots els nodes&lt;/b&gt;. Que xulos que són.&lt;br /&gt;&lt;br /&gt;Ara bé, perquè &lt;i&gt;tard o d'hora&lt;/i&gt; les dades siguin consistents s'han de resoldre les dues preguntes anteriors. La de &lt;i&gt;quan&lt;/i&gt; es resol vol dir si es fa durant les lectures de les dades o les escriptures. Normalment les resolucions es fan en les escriptures per mantenir les lectures senzilles. En el cas de Dynamo ho han fet diferent. I una altre vegada, al ser una base de dades per a Amazon, van considerar que era millor que les escriptures fossin més senzilles i ràpides, no és d'estranyar, perquè en el seu cas una escriptura implica que un usuari afegeix un producte al carro de la compra. Per tant, és important que l'operació d'afegir sempre funcioni. &lt;br /&gt;&lt;br /&gt;La pròxima pregunta, &lt;i&gt;qui&lt;/i&gt; resol els problemes, les opcions són o bé que ho faci Dynamo o bé que ho faci el programa que està utilitzant Dynamo. Dynamo permet les dues dues, en cas de que sigui la mateixa key-value store que ho faci poca cosa hi pot fer, tant sols pot utilitzar polítiques ben senzilles com ara "l'últim d'escriure guanya". D'altre banda, en cas de que sigui l'aplicació que arregli els conflictes, al tenir tota la informació de què són les dades i d'entendre la lògica del sistema pot fer qualsevol cosa que sigui necessària.&lt;br /&gt;&lt;br /&gt;Altres detalls tingut en compte en el disseny:&lt;ul&gt;&lt;br /&gt; &lt;li&gt;&lt;i&gt;Escalabilitat incremental&lt;/i&gt; &lt;br /&gt; &lt;li&gt;&lt;i&gt;Simetria&lt;/i&gt;: Cada de node que participa a Dynamo ha de tenir les mateixes responsabilitats que la resta. No hi ha rols especials (això ho converteix en un P2P).&lt;br /&gt; &lt;li&gt;&lt;i&gt;Descentralització&lt;/i&gt;&lt;br /&gt; &lt;li&gt;&lt;i&gt;Heterogeneïtat&lt;/i&gt;: Les màquines que formaran els nodes de Dynamo no seran iguals, i no seran super màquines, per tant, és necessari que el sistema tingui en compte el tipus de màquina que és cada node i que la seva càrrega sigui proporcional a les seves capacitats.&lt;/ul&gt;&lt;h3&gt;Arquitectura&lt;/h3&gt;L'arquitectura de Dynamo, recordem, ha de tenir maneres escalables i robustes de:&lt;ul&gt;&lt;br /&gt; &lt;li&gt;Poder balancejar la càrrega.&lt;br /&gt; &lt;li&gt;Detectar fallades.&lt;br /&gt; &lt;li&gt;Recuperar-se de fallades.&lt;br /&gt; &lt;li&gt;Sincronitzar les rèpliques.&lt;br /&gt; &lt;li&gt;Detectar i reaccionar a sobrecarrega.&lt;br /&gt; &lt;li&gt;Ésser capaç de treballar amb concurrència de tasques.&lt;br /&gt; &lt;li&gt;Distribuir tasques.&lt;br /&gt; &lt;li&gt;Agrupar requestes.&lt;br /&gt; &lt;li&gt;Monitoritzar el sistema.&lt;br /&gt; &lt;li&gt;Disparar alarmes en cas d'errors o de situacions estranyes.&lt;br /&gt; &lt;li&gt;Configurar-se.&lt;br /&gt; &lt;li&gt;Fer massatges als programadors (&lt;i&gt;aquesta la he afegit jo, però crec que no ve d'aquí, francament&lt;/i&gt;).&lt;br /&gt;&lt;/ul&gt;Si heu llegit el post anterior, el de &lt;a href="http://distribuint.blogspot.com/2009/05/bigtable.html"&gt;BigTable&lt;/a&gt; recordareu que no es parlava en tant detall de l'arquitectura del sistema. Això és perquè l'equip de BigTable va poder aprofitar molts components que altres equips d'enginyers de Google ja havien implementat i que en part, solucionaven la majoria d'aquests problemes, d'altre banda, l'equip d'Amazon ho va haver d'implementar tot de dalt a baix.&lt;br /&gt;&lt;br /&gt;Algunes de les tècniques clàssiques que utilitza Dynamo per tractar alguns dels problemes citats anteriorment (s'expliquen en més detall a continuació):&lt;br /&gt;&lt;table border=1&gt;&lt;br /&gt;&lt;tr&gt;&lt;br /&gt; &lt;th&gt;Problema&lt;/th&gt;&lt;br /&gt; &lt;th&gt;Tècnica&lt;/th&gt;&lt;br /&gt; &lt;th&gt;Avantatge&lt;/th&gt;&lt;br /&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;br /&gt; &lt;td&gt;Partionament de dades&lt;/td&gt;&lt;br /&gt; &lt;td&gt;Hashing&lt;/td&gt;&lt;br /&gt; &lt;td&gt;Té bona escalabilitat&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;br /&gt; &lt;td&gt;Bona disponibilitat per les escriptures.&lt;/td&gt;&lt;br /&gt; &lt;td&gt;Rellotges vectorials amb reconciliació.&lt;/td&gt;&lt;br /&gt; &lt;td&gt;La mida de la versió es deslliga de les tasses de renovació.&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;br /&gt; &lt;td&gt;Tractament de fallades temporals.&lt;/td&gt;&lt;br /&gt; &lt;td&gt;Quòrum reduït&lt;/td&gt;&lt;br /&gt; &lt;td&gt;Té bona disponibilitat i garantia de durabilitat quan algunes de les rèpliques no estan disponibles.&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;br /&gt; &lt;td&gt;Recuperació de fallades permanents.&lt;/td&gt;&lt;br /&gt; &lt;td&gt;Anti-entropia utilitzant arbres de Merkle&lt;/td&gt;&lt;br /&gt; &lt;td&gt;Sincronitza rèpliques divergents en segon terme.&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;br /&gt; &lt;td&gt;Detecció de fallades i de membres.&lt;/td&gt;&lt;br /&gt; &lt;td&gt;Gossip protocols i de detecció de fallades.&lt;/td&gt;&lt;br /&gt; &lt;td&gt;Manté la simetria i evita tenir un registre centralitzat per guardar la llista de membres i el seus estats.&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;br /&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Interfície del sistema&lt;/h4&gt;Dynamo guarda els objectes amb les seves claus mitjançant una interfície simple. Ofereix dos mètodes, &lt;code&gt;get()&lt;/code&gt; i &lt;code&gt;put()&lt;/code&gt;. El mètode get localitza les rèpliques de l'objecte associat amb la clau al sistema d'emmagatzemament i retorna un sòl objecte en cas de que no hi hagi conflicte, o bé una llista amb els objectes amb conflictes amb un &lt;em&gt;context&lt;/em&gt;. &lt;br /&gt;D'altre banda, el mètode put determina on les rèpliques de l'objecte haurien d'estar guardades i les hi escriu a disc. El context codifica meta-data (dades sobre dades), com per exemple la versió de l'objecte. Aquesta informació és guardada amb l'objecte de tal manera que el sistema en pot verificar la validesa.&lt;br /&gt;&lt;br /&gt;Dynamo tracta tant la clau com l'objecte com un vector de bytes. L'algorisme de hashing per generar l'identificador de la clau és MD5, i genera un id de 128 bits.&lt;br /&gt;&lt;h4&gt;Algorisme de partionat&lt;/h4&gt;&lt;br /&gt;Un dels requeriments de Dynamo és que pugui escalar. Això implica que té un mecanisme per partionar &lt;i&gt;dinàmicament&lt;/i&gt; les dades a través dels nodes. La sortida d'aquest algorisme de partionat és tractada com un espai circular o "anella". A cada node del sistema se l'hi assigna  un valor aleatori en l'espai, cosa que representa la seva "posició" dins de l'anella. &lt;br /&gt;&lt;br /&gt;Cada element de dades és identificat per un clau, la qual és assignada a un node aplicant-li la funció de hash, que ens retorna la seva posició en l'anella. Tot seguit seguim l'anella en sentit anti-horari fins que trobem el primer node amb una posició més gran que la posició teòrica de la clau. Per tant, cada node passa a ésser responsable d'una regió de l'anella. Per tant, una arribada o sortida d'un node dins el conjunt de nodes que usen Dynamo tant sols afecta als seus dos veïns.&lt;br /&gt;&lt;br /&gt;El fet de que el mètode de hashing sigui uniforme planteja alguns problemes amb heterogeneïtat de les màquines que conformen l'anella, cosa que porta a un malt balanceig del sistema. Per tant, el que es fa és en comptes de assignar a cada node un sòl punt en el cercle, cada node és assignat diversos punts. Per tant, cada node passa a tenir "servidors virtuals", i cadascun d'aquests servidors és responsable per una posició de l'anella. Utilitzar nodes virtuals comporta entre d'altres els següents avantatges:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt; &lt;li&gt; Si un node cau, la càrrega que tenia aquest node és dispersada en la resta de nodes.&lt;br /&gt; &lt;li&gt; Quan el node torna a estar de nou disponible, aquest accepta més o menys una quantitat equivalent de dades de la resta de nodes.&lt;br /&gt; &lt;li&gt; El número de nodes virtuals que un node real té està decidit per les característiques del node.&lt;br /&gt;&lt;/ul&gt; &lt;br /&gt;&lt;h4&gt;Replicació&lt;/h4&gt;&lt;br /&gt;Dynamo replica les dades. Cada clau, k és assignada a un node &lt;i&gt;coordinador&lt;/i&gt;, aquest node serà el responsable de la replicació dels elements de dades. Per tant, a més de ser el responsable d'assegurar que els valors es llegeixin i s'escriguin a disc també serà el responsable de replicar aquestes dades en els anteriors N-1 nodes (en sentit antihorari) de l'anella. Per tant, cada node és responsable d'ell mateix i de les rèpliques en els seus N predecessors, preferiblement nodes reals, no virtuals. &lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Versionat de dades&lt;/h4&gt;&lt;br /&gt;El fet de que Dynamo ofereixi consistència tard o d'hora permet que les actualitzacions puguin ser propagades a totes les rèpliques de forma asíncrona. A efectes pràctics vol dir que una operació de put() contestarà al client abans de que s'hagin actualitzat totes les rèpliques, cosa que implica que puguin existir escenaris en que el següent get() retorni un objecte al qual li manquin actualitzacions. &lt;br /&gt;&lt;br /&gt;Per assegurar la consistència, el que fa Dynamo tracte el resultat de cada actualització com una nova versió de les dades, i permet que en alguns moments existeixin diverses versions d'un mateix objecte en el mateix moment. Lògicament en la majoria de vegades les versions més actuals substitueixen a les més velles, de totes maneres de vegades apareixen "branques", resultant en versions amb conflictes entre elles. En aquests casos el client és encarregat de fer la "reconciliació" d'aquestes branques per convertir-les de nou en una sola. Per detectar els conflictes i perquè s'han produït Dynamo utilitza rellotges vectorials. &lt;br /&gt;&lt;br /&gt;Els vectors clocks és un sistema que va ser inventat per &lt;a href="http://research.microsoft.com/en-us/um/people/lamport/"&gt;Leslie Lamport&lt;/a&gt;. Són molt utilitzats en informàtica distribuïda i tenen molta tela. Aviat hi haurà tot un article que parli de vectors clocks, ara mateix deixem-ho estar en que serveixen per detectar col·lisions temporals com la que acabem de veure.&lt;br /&gt;&lt;h4&gt;Execució de les operacions de lectura i escriptura&lt;/h4&gt;&lt;br /&gt;Les operacions de lectura i escriptura són invocades a través de l'API de Dynamo, mitjançant HTTP, els clients poden triar dues maneres: &lt;br /&gt;&lt;ol&gt;&lt;br /&gt; &lt;li&gt; Dirigir la petició a través d'un balancejador de càrrega que triarà un node basant-se en l'informació de càrrega.&lt;br /&gt; &lt;li&gt; Utilitzar una llibreria específica per redirigir la petició directament al node coordinador de la clau.&lt;br /&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;Com hem vist anteriorment cada clau ha de ésser rebuda pel seu node coordinador, en el segon cas, el node que rep la petició és sempre el coordinador, en el primer cas però, la petició pot anar a parar a qualsevol node, el que fa llavors aquest node és enrutar-la cap al node que toca, que serà el coordinador de la clau. &lt;br /&gt;&lt;h4&gt;Tractament de fallades&lt;/h4&gt;&lt;br /&gt;En el cas de Dynamo utilitzés un sistema de quòrum típic faria que el sistema no estigués disponible en casos en que algun o alguns nodes tinguessin problemes, per tant el sistema utilitzat per Dynamo no força un quòrum complert, sinó que utilitza un quòrum relaxat. Per tant, no tots els nodes que formen part de la rèplica han d'estar disponibles a l'hora de fer una actualització, cosa que implica que l'operació serà més ràpida, però cosa que implica que poden donar-se inconsistències al sistema, i és per això que tenim els vector clocks per arreglar-les. &lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Detecció de membres&lt;/h4&gt;&lt;br /&gt;Tots els nodes saben l'estat i la llista de nodes que hi ha al sistema formant part de l'anella. Per propagar els canvis també s'utilitza un protocol de gossip. Per tant, sempre cada node sabrà qui és el node coordinador de qualsevol clau. &lt;br /&gt;&lt;br /&gt;Lògicament les deteccions de fallades són relativament senzilles, si un node intentat contactar amb un altre node (ja sigui per demanar que faci de coordinador o bé per replicar alguna dada) i aquest no contesta, ràpidament el node s'encarrega de fer saber a la resta que aquell node no està disponible i que cal reaccionar rebalancejant les dades.&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Afegint i traient nodes&lt;/h4&gt;&lt;br /&gt;Quan un nou node apareix al sistema, se li assigna un número de tokens que estan aleatòriament repartits dins de l'anella. Fins llavors altres nodes estaven encarregades de mantenir aquelles dades, per tant el node nou contacta amb aquestes màquines, els fa saber que ha aparegut i demana que l'hi enviïn les claus emmagatzemades més les dades. &lt;br /&gt;&lt;h3&gt;Implementació&lt;/h3&gt;&lt;br /&gt;Amazon ha implementat Dynamo amb Java, i cada node pot emmagatzemar les dades mitjançant un connector a bases de dades. Per tant, cada node té a sota una base de dades per guardar les dades a disc, depenent del tipus de dades s'utilitza un producte o un altre.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6541464271719475452-1845684628269074946?l=distribuint.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://distribuint.blogspot.com/feeds/1845684628269074946/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://distribuint.blogspot.com/2009/05/dynamo.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6541464271719475452/posts/default/1845684628269074946'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6541464271719475452/posts/default/1845684628269074946'/><link rel='alternate' type='text/html' href='http://distribuint.blogspot.com/2009/05/dynamo.html' title='Dynamo'/><author><name>Marc</name><uri>http://www.blogger.com/profile/05631004736020219907</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://4.bp.blogspot.com/_a84GcWW6wwE/TTcLNqDwGxI/AAAAAAAAAXc/KscglDtW6gI/S220/lant.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6541464271719475452.post-7272248437884220453</id><published>2009-05-08T07:25:00.003+01:00</published><updated>2009-05-08T07:35:06.881+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='bigtable'/><category scheme='http://www.blogger.com/atom/ns#' term='bases de dades'/><category scheme='http://www.blogger.com/atom/ns#' term='google'/><title type='text'>Bigtable</title><content type='html'>Bé, avui toca parlar del primer article de la sèrie de noves bases de dades. BigTable, de Google.&lt;br /&gt;&lt;br /&gt;El que trobareu aquí és un resum de l'article &lt;i&gt;&lt;a href="http://labs.google.com/papers/bigtable.html"&gt;Bigtable: A distributed storage system for structured data&lt;/a&gt;&lt;/i&gt; que va aparèixer a la conferència OSDI al 2006.&lt;br /&gt;&lt;br /&gt;Primerament, BigTable és el nom del producte que van programar internament a google, és bàsicament un sistema d'emmagatzemament distribuït per guardar dades estructurades i està pensat perquè sigui molt escalable. A més, un detall important, és que els enginyers de google el van dissenyar per còrrer en moltes màquines genèriques, no calen grans servidors ni discs durs especials, simplement, màquines com les que podem tenir ara mateix al davant. Google utilitza aquest servei per guardar moltes de les seves dades, per exemple índexs web, o imatges de Google Earth, per tant, no és una idea, és una implementació existent &lt;b&gt; i està en producció&lt;/b&gt;&lt;&lt;br /&gt;&lt;br /&gt;Com ja havia introduït en el post anterior, Bigtable no utilitza ni dona suport a un model de dades relacional, al contrari, facilita un model de dades molt senzill que permet &lt;i&gt;un control dinàmic sobre l'estructura dels continguts i del seu format&lt;/i&gt;. Les dades són indexades mitjançant columnes i files, els noms de les quals són cadenes de texte, els continguts d'aquestes són cadenes de texte també, per tant, la base de dades no sap (ni li interessa) el format dels continguts, això és problema de l'aplicació.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Model de Dades&lt;/h3&gt;&lt;br /&gt;Atenció amb la definició: &lt;i&gt;Bigtable és un mapa ordenat, multidimensional, distribuït, persistent i dispers&lt;/i&gt; (aplaudiments i furor general!). Aquest mapa està indexat per:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;	&lt;li&gt;Clau de la fila&lt;br /&gt;	&lt;li&gt;Clau de la columna&lt;br /&gt;	&lt;li&gt;Instant de temps (!)&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;Per tant té aquest format:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;(row:string, column:string, time:int64) --&gt; string&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Anem a explicar una mica cada factor d'indexació:&lt;br /&gt;&lt;h4&gt;Fila&lt;/h4&gt;&lt;br /&gt;Les clau de cada fila són strings, de fins a 64Kb, cada lectura i escriptura a una fila es considera atòmica. Un detall important és que per a cada taula es particiona dinàmicament el número de files que té una &lt;i&gt;tablet&lt;/i&gt;, que és la unitat de distribució i balancejament de dades de Bigtable (més explicació sobre això una mica més endavant). &lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Familia de Columnes&lt;/h4&gt;&lt;br /&gt;Les claus de les columnes estan agrupades en &lt;i&gt;families de columnes&lt;/i&gt;, que són els elements més bàsics d'accés a control a la taula. Aquestes no haurien de canviar de forma dinàmica, per tant, una taula té un número fixe de families de columnes durant l'execució, ara bé, dins de cada familia de columnes hi pot haver un número indeterminat de columnes, que poden aparèixer i desaparèixer en temps d'execució. Per tant, una familia de columnes de Bigtable equival a una columna d'una base de dades de model relacional, i a més aquesta columna podria tenir columnes a dins, i a més dinàmiques!&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Instant de temps&lt;/h4&gt;&lt;br /&gt;La idea és ben senzilla, es tracta que una taula tingui un històric dels valors que hi havia en les columnes/files. Lògicament això és un valor configurable i a més, Bigtable té un garbage collector, semblant al Java que va netejant valors a mesura que es fan més vells del que ens interessa. &lt;br /&gt;&lt;br /&gt;&lt;h3&gt;API&lt;/h3&gt;&lt;br /&gt;Una altre gran diferència entre les bases de dades relacionals i Bigtable és que mentres que les RDB interactuen amb l'exterior mitjançant SQL, Bigtable ho fa mitjançant una API, per tant, en aquest punt s'aproxima més al Hashmap distribuït. Apart d'això, els usuaris poden crear scripts amb un llenguatge de query de google anomenat &lt;a href="http://labs.google.com/papers/sawzall.html"&gt;Sawzall&lt;/a&gt; per fer consultes més complexes.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Parts de l'arquitectura de Bigtable&lt;/h3&gt;&lt;br /&gt;Hem de tenir en compte que els enginyers de google no van crear Bigtable del res, es van basar i lògicament van utilitzar coses que ja estaven fetes dins de Google:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;	&lt;li&gt; &lt;a href="http://labs.google.com/papers/gfs.html"&gt;Google File System&lt;/a&gt;, un sistema de fitxers distribuït.&lt;br /&gt;	&lt;li&gt; Google SSTable, un format de fitxers binari. Bàsicament és una taula de hash de clau-&gt;valor ordenats.&lt;br /&gt;	&lt;li&gt; &lt;a href="http://labs.google.com/papers/chubby.html"&gt;Chubby&lt;/a&gt;, un servei de locks distribuit i persistent. Bàsicament es tracta d'un servei que és capaç de mantenir semàfors i altres tipus de locks de concurrència de forma distribuïda.&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;Casi res :D, mare meva que animals que són aquests de can google...&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Implementació de Bigtable&lt;/h3&gt;&lt;br /&gt;Ja aviso que a partir d'aquí la cosa es complica una mica, si no us interessa la implementació d'aquest petit monstre us recomano que passeu directament a &lt;a href="#llicons"&gt;Coses que han aprés a can Google&lt;/a&gt;. De totes maneres, l'article no és molt detallat en quant a l'implementació, ja que és una implementació propietària i tancada i jo bàsicament n'he fet un resum per destacar-ne els detalls més importants.&lt;br /&gt;&lt;br /&gt;Per la resta de valents... Bigtable està format per 3 components:&lt;br /&gt;&lt;ol&gt;&lt;br /&gt;	&lt;li&gt; Un llibreria que usa l'aplicació client.&lt;br /&gt;	&lt;li&gt; Un servidor &lt;i&gt;master&lt;/i&gt;&lt;br /&gt;	&lt;li&gt; Molts servidors de &lt;i&gt;tablets&lt;/i&gt;, que poden ser afegits o trets de forma dinàmica del cluster per suplir necessitats de càrrega.&lt;br /&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;El master és l'encarregat d'assignar les tablets als servidors de tablets, detectar canvis en les màquines (afegim o treiem servidors de tablets), fer el balanceig de càrrega, neteja de files (temes temporals) i finalment manegar els canvis d'esquema de la base de dades, com són la creació de taules i de families de columnes.&lt;br /&gt;&lt;br /&gt;Cal tenir en compte que tot i tenir un servidor master, les dades dels clients no hi passen a través, per sino que es comuniquen directament amb els servidors de tablets per fer les escriptures/lectures, i important, no utilitzen el servidor master per localitzar les tablets!, per tant, a efectes pràctics el màster està bastant descarregat.&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Localització de les &lt;i&gt;tablets&lt;/i&gt;&lt;/h4&gt;&lt;br /&gt;Tema important, com s'ho fa un client per localitzar el tablet que té les files que l'interessen?, però abans d'això és important saber que aquesta informació està guardada en una estructura de dades de 3 nivells, semblant a un &lt;a href="http://en.wikipedia.org/wiki/B%2B_tree"&gt;arbre B+&lt;/a&gt;, i el primer nivell de l'estructura està en un fitxer guardat a Chubby, per tant, el client el primer que fa és preguntar a Chubby a on és aquest fitxer,i amb un màxim de 3 salts tenim el tablet que té l'informació que necessitem.&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Assignació de les &lt;i&gt;tablets&lt;/i&gt;&lt;/h4&gt;&lt;br /&gt;Següent pregunta: a on són els tablets? i per què hi són?&lt;br /&gt;Lògicament cada tablet està assignat només a un servidor de en cada moment, el servidor màster manté una llista dels servidors de tablets que estan actius a cada moment, els tablets que ténen assignats cadascun i també els tablets que no estan assignats a cap servidor (i que per tant estan guardats al GFS). Aquesta llista només canvia quan:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;	&lt;li&gt;Una taula és creada.&lt;br /&gt;	&lt;li&gt;Una taula és destruïda&lt;br /&gt;	&lt;li&gt;Dos tablets s'han fet tant petits que el màster decideix ajuntar-los en un sol tablet.&lt;br /&gt;	&lt;li&gt;Un tablet s'ha fet tant gran que el màster decideix partir-lo en dos.&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;h4&gt;Altres detalls interessants&lt;/i&gt;&lt;/h4&gt;&lt;br /&gt;El paper dóna bastants més detalls d'implementació, però realment això pretén ser una introducció al model de dades de Bigtable, per tant els he ignorat, ara bé vull destacar:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;	&lt;li&gt;&lt;b&gt;Grups de localitat:&lt;/b&gt; Els clients poden agrupar diversos grups de families en el que són els grups de localitat, cosa que permet garantir que estaran al mateix servidor de tablets.&lt;br /&gt;	&lt;li&gt;&lt;b&gt;Compressió:&lt;/b&gt; Lògicament es permet compressió a l'hora de guardar els valors. S'han triat un conjunt d'algorismes de compressió ràpids (comprimeixen a 100-200Mb/s i descomprimeixen a 400-1000Mb/s en una bona màquina) i també poden descomprimir el fitxer per parts, sense haver de descomprimir-lo tot, molt pràctic en cas de que volguem llegir només una part petita del fitxer.&lt;br /&gt;	&lt;li&gt;&lt;b&gt;Bloom Filters:&lt;/b&gt; No saps què són els bloom filters? (&lt;a href="http://en.wikipedia.org/wiki/Bloom_filter"&gt;wikipedia&lt;/a&gt;) Per evitar fer molts d'accessos a disc Bigtable utilitza Bloom Filters per veure si un fitxer en format SSTable conté les dades per un clau/valor en concret.&lt;br /&gt;	&lt;li&gt;&lt;b&gt;Caching:&lt;/b&gt; les lectures estan en una cache per una lectura més ràpida. &lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;&lt;a name="llicons"&gt;Coses que han aprés a can Google&lt;/a&gt;&lt;/h3&gt;&lt;br /&gt;L'article original té tot un apartat de les lliçons apreses en l'implementació, evaluació i ús de Bigtable internament a google, voldria destacar les dues següents:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;	&lt;li&gt;La majoria d'aplicacions només necessiten transaccions d'una sola columna.&lt;br /&gt;	&lt;li&gt;És important mantenir un, atenció aquí: &lt;b&gt;DISSENY SENZILL&lt;/b&gt;, perquè més endavant sigui senzill de modificar, segons les necessitats reals, que normalment són diferents a les inicials.&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;I això és bàsicament un resum del que és &lt;i&gt;Bigtable&lt;/i&gt;. És recomanable llegir el paper original, ja que dóna molts més detalls sobre implementació i decisions de disseny. Cal tenir en compte que és un paper bastant important i que ha sigut molt influent en les noves bases de dades que s'estan utilitzant i implementant actualment. Sobretot perquè va ser de les primers en trencar amb el model de dades relacional i es va posar en producció (i va funcionar)&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6541464271719475452-7272248437884220453?l=distribuint.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://distribuint.blogspot.com/feeds/7272248437884220453/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://distribuint.blogspot.com/2009/05/bigtable.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6541464271719475452/posts/default/7272248437884220453'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6541464271719475452/posts/default/7272248437884220453'/><link rel='alternate' type='text/html' href='http://distribuint.blogspot.com/2009/05/bigtable.html' title='Bigtable'/><author><name>Marc</name><uri>http://www.blogger.com/profile/05631004736020219907</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://4.bp.blogspot.com/_a84GcWW6wwE/TTcLNqDwGxI/AAAAAAAAAXc/KscglDtW6gI/S220/lant.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6541464271719475452.post-4097889286622066349</id><published>2009-05-07T15:06:00.002+01:00</published><updated>2009-05-07T15:09:38.574+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='hadoop'/><title type='text'>Hadoop, la guia definitiva.</title><content type='html'>Avui he rebut la noticia que està a punt de ser publicat, '&lt;span style="font-style:italic;"&gt;Hadoop, the definitive guide&lt;/span&gt;' un llibre que ha escrit &lt;a href="http://www.lexemetech.com/"&gt;Tom White&lt;/a&gt; i en el qual he pogut participar escriguent part d'un capítol d'experiències. &lt;br /&gt;&lt;br /&gt;Podeu trobar més informació &lt;a href="http://www.lexemetech.com/2009/05/hadoop-definitive-guide-coming-soon.html"&gt;al següent post (anglés).&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6541464271719475452-4097889286622066349?l=distribuint.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://distribuint.blogspot.com/feeds/4097889286622066349/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://distribuint.blogspot.com/2009/05/hadoop-la-guia-definitiva.html#comment-form' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6541464271719475452/posts/default/4097889286622066349'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6541464271719475452/posts/default/4097889286622066349'/><link rel='alternate' type='text/html' href='http://distribuint.blogspot.com/2009/05/hadoop-la-guia-definitiva.html' title='Hadoop, la guia definitiva.'/><author><name>Marc</name><uri>http://www.blogger.com/profile/05631004736020219907</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://4.bp.blogspot.com/_a84GcWW6wwE/TTcLNqDwGxI/AAAAAAAAAXc/KscglDtW6gI/S220/lant.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6541464271719475452.post-8903685164349554521</id><published>2009-04-27T23:12:00.001+01:00</published><updated>2009-04-27T23:13:26.264+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='bases de dades'/><title type='text'>Nous models de bases de dades</title><content type='html'>&lt;p&gt;Aquest post és una introducció a una sèrie d'escrits que aniré fent relacionats amb els nous models de bases de dades que estan apareguent, i que estan tinguent una bona acceptació en diversos sectors del món empreserial relacionat amb informàtica (el perquè d'això mereix un post per si sól)&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Primer de tot, aquests nous models s'allunyen bastant del model relacional de bases de dades al que suposo que tots estàvem més que acostumats. Sí, això vol dir tenir una base de dades sense SQL. Estrany oi?&lt;/p&gt;&lt;br /&gt;&lt;p&gt;El model relacional funciona molt bé per algunes aplicacions, però no és una solució universal que serveixi per tot. Fins fa poc era ben normal trobar aplicactius o arquitectures que tenien instal·lada una RDB tipus MySql o Postgres i que tant sols era utilitzada com a magatzem de dades. Amb això vull dir que no s'utilitzaven les propietats ACID d'una base de dades relacional, per tant, SELECTS senzills i UPDATES.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Fins aquí tot bé i cap problema, s'està infrautilitzant una eina molt potent, però no és res greu i si funciona doncs perfecte. Ara bé, pot ser que arribin els problemes en forma de:&lt;/p&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt; &lt;li&gt;&lt;b&gt;Escalabilitat:&lt;/b&gt; La base de dades s'ha fet molt gran i la màquina, o bé la base de dades no pot suportar els continguts que ha de guardar o bé la càrrega de les diverses aplicacions que l'usten. Què cal fer? cal passar-se a una base de dades més potent o intentem repartir la càrrega de la base de dades entre altres màquines?&lt;br /&gt; &lt;li&gt;&lt;b&gt;Disponibilitat:&lt;/b&gt; Què passa si la màquina de té la base de dades no està disponible? es queda tot aturat? És fàcil fer backups i restaurar-los en cas de que sigui necessari?. Serà un drama?&lt;br /&gt;&lt;/ul&gt; &lt;br /&gt;&lt;p&gt;Qualsevol administrador de bases de dades sabrà que els dos punts anteriors són importants i els dos són, lògicament, solucionables utilitzant qualsevol motor de base de dades decent, fins a cert punt.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Ara bé, si tenim en compte empreses del nivell de Google, Amazon, Linkedin, Yahoo... que maneguen cada dia unes quantitats de dades MOLT grans hem de pensar que les seves bases de dades han de ser inmenses i lògicament els seus administradors han hagut de tenir en compte els dos problemes anteriors. Com s'ho han fet? doncs bàsicament han abandonat el model de bases de dades relacionals (i les seves implementacions) i han passat a uns models nous, fets a mida (lògicament només pels usos que no requerien una base de dades relacionals!).&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Hem de tenir en compte que aquestes empreses tenen molts de recursos i que també ténen unes necessitats bastant específiques, probablement per moltes de les seves aplicacions el model relacional els ajudi ben poc. En molts casos el que necessiten és tant sols "una taula de hash monstruosament gran i monstruosament ràpida". Aquest concepte, conegut com DHT (Distributed Hash Table) no és nou, en l'àmbit de recerca ja és ben conegut i fins i tot hi ha diverses implementacions disponibles, cadascuna enfocada a solucionar problemes lleugerament diferents: &lt;br /&gt;&lt;ul&gt;&lt;br /&gt; &lt;li&gt;&lt;a href="http://pdos.csail.mit.edu/chord/"&gt;Chord&lt;/a&gt;&lt;br /&gt; &lt;li&gt;&lt;a href="http://freepastry.org/"&gt;Pastry&lt;/a&gt;&lt;br /&gt; &lt;li&gt;&lt;a href="http://current.cs.ucsb.edu/projects/chimera/"&gt;Chimera&lt;/a&gt;&lt;br /&gt;&lt;/ul&gt; &lt;br /&gt;&lt;p&gt;Aquests projectes són els que van posar les bases del que després acabaria apareguent. Si aneu a les pàgines d'aquests projectes veureu que tot i que ténen implementacions estables no són utilitzades en entorns de producció empresarial (&lt;i&gt;que jo sàpiga o hagi sapigut trobar, si estic equivocat sisplau feu-m'ho saber&lt;/i&gt;). Una part molt interessant d'aquests projectes és l'apartat d'articles, on s'expliquen les diverses decisions de disseny, diferents problemes que s'ha hagut de solucionar així com diferents algorismes molt importants en el món de la informàtica distribuïda i sobre els quals tinc pensat fer algun post properament.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Les DHT no són trivials ni de dissenyar ni d'implementar, el seu concepte és senzill, una taula de hash distribuïda, però no ens hem de deixar enganyar. Ténen molta tela.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Google i Amazon es van posar en marxa i cadascuna va implementar-se la seva pròpia base de dades especificament pels seus usos, un cop les van tenir implementades, provades &lt;i&gt;i en producció&lt;/i&gt; van publicar cadascuna un article, que en certa manera són els articles que van començar amb la "moda" de les noves bases de dades:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt; &lt;li&gt;&lt;b&gt;De part de Google.&lt;/b&gt;&lt;a href="http://labs.google.com/papers/bigtable.html"&gt; Bigtable: A Distributed Storage System for Structured Data.&lt;/a&gt;&lt;br /&gt; &lt;li&gt;&lt;b&gt;De part d'Amazon.&lt;/b&gt;&lt;a href="http://www.allthingsdistributed.com/2007/10/amazons_dynamo.html"&gt; Dynamo: Amazon's Highly Available Key-value Store.&lt;/a&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;p&gt;A partir de llavors han aparegut moltes bases de dades basades en aquests papers, gens sorprenentment algunes basant-se amb el model &lt;i&gt;Bigtable&lt;/i&gt; i d'altres que més que bases de dades s'anomenen &lt;i&gt;Key-Value Stores&lt;/i&gt; i que, lògicament, es basen en Dynamo.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Els articles són realment molt interessants i de lectura obligada per qualsevol persona interessada en escalabilitat, bases de dades i noves tecnologies.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;En el pròxim post resumiré el paper de la &lt;i&gt;Bigtable&lt;/i&gt; de google, i en el següent la &lt;i&gt;Dynamo&lt;/i&gt; d'Amazon, per veure'n bé les diferències, tant de disseny com d'ús pràctic. I més endavant, i depenent del meu temps descriuré les meves experiències reals amb diverses implementacions, de moment tinc pensades:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt; &lt;li&gt;&lt;a href="http://couchdb.apache.org/"&gt;CouchDB&lt;/a&gt;, de la qual ja n'he parlat en &lt;a href="http://distribuint.blogspot.com/2009/03/couchdb-i-key-value-stores.html"&gt;aquest blog&lt;/a&gt;.&lt;br /&gt; &lt;li&gt;&lt;a href="http://project-voldemort.com/"&gt;Voldemort&lt;/a&gt;, que és la Key-Value Store que han implementat a LinkedIn. &lt;br /&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6541464271719475452-8903685164349554521?l=distribuint.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://distribuint.blogspot.com/feeds/8903685164349554521/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://distribuint.blogspot.com/2009/04/nous-models-de-bases-de-dades.html#comment-form' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6541464271719475452/posts/default/8903685164349554521'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6541464271719475452/posts/default/8903685164349554521'/><link rel='alternate' type='text/html' href='http://distribuint.blogspot.com/2009/04/nous-models-de-bases-de-dades.html' title='Nous models de bases de dades'/><author><name>Marc</name><uri>http://www.blogger.com/profile/05631004736020219907</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://4.bp.blogspot.com/_a84GcWW6wwE/TTcLNqDwGxI/AAAAAAAAAXc/KscglDtW6gI/S220/lant.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6541464271719475452.post-3025406616938019529</id><published>2009-04-07T00:07:00.008+01:00</published><updated>2009-04-07T00:28:03.393+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Volunteer Computing'/><category scheme='http://www.blogger.com/atom/ns#' term='BOINC'/><title type='text'>Volunteer Computing i BOINC</title><content type='html'>&lt;span style="font-size:85%;"&gt;Aquest post va del Volunteer Computing, amb la seva implementació més famosa, BOINC.&lt;/span&gt;&lt;br /&gt;&lt;p&gt;&lt;span style="font-size:85%;"&gt;El Volunteer Computing ve d'una idea bastant senzilla. Molta gent té ordinadors, i molta d'aquesta gent no els hi treu tot el suc que podria, per tant, estaria molt bé aprofitar tota aquesta potència restant oi ? doncs es tracta d'això.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span class="Apple-style-span"  style="font-size:85%;"&gt;BOINC és un software molt senzill que s'instal·la en un ordinador, hi ha versions per Windows, GNU/Linux, BSD's, etc. Un cop el software està instal·lat l'usuari s'autentifica i s'apunta a un o diversos projectes. Ja està. &lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span class="Apple-style-span"  style="font-size:85%;"&gt;El que passa llavors és que aquest software contacta amb els servidors de BOINC i demana feina. Els servidors li enviaran uns "paquets" amb un o diversos treballs de computació, un cop rebuts aquests l'ordinador començarà a processar-los. Una vegada s'hagi calculat el resultat, aquest s'enviarà de nou als servidors i demanarà més treballs. Tot això de forma totalment transparent a l'usuari i sense que aquest ho noti.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span class="Apple-style-span"  style="font-size:85%;"&gt;Boinc prové de &lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;a href="http://setiathome.ssl.berkeley.edu/" id="m1mq" title="SETI@Home"&gt;&lt;span class="Apple-style-span"&gt;SETI@Home&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:85%;"&gt; , un programa que bàsicament va crear aquest esquema per analitzar ones de ràdio provinents de l'espai per intentar trobar vida extra terrestre. Més tard va aparèixer &lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;a href="http://folding.stanford.edu/" id="f_2i" title="Folding@Home"&gt;&lt;span class="Apple-style-span"&gt;Folding@Home&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:85%;"&gt; un programa de caire més... biològic per processar plegaments de mol·lècules per l'investigació de malalties i fàrmacs. El problema és que cada projecte utilitzava el seu propi client, i a mesura que anaven sortint més projectes s'havia d'anar instal·lant els seus clients. Finalment es va decidir unificar el format i tenir un sol programa a on et podies apuntar a diferents projectes, així és com va nèixer BOINC.&lt;/span&gt;&lt;/p&gt;&lt;h2&gt;&lt;span class="Apple-style-span"  style="font-size:100%;"&gt;Passos ràpids per habilitar una conta&lt;/span&gt;&lt;/h2&gt;La manera més fàcil d'entendre com funciona (en general) és veure-ho funcionant. El software es pot descarregar des de &lt;/span&gt;&lt;a href="http://boinc.berkeley.edu/download.php" id="hveu" target="_blank" title="la pàgina de BOINC"&gt;&lt;span class="Apple-style-span"&gt;la pàgina de BOINC&lt;/span&gt;&lt;/a&gt;&lt;span class="Apple-style-span"&gt;, o en cas de Linux del gestor de paquets.&lt;p&gt;&lt;span class="Apple-style-span"  style="font-size:85%;"&gt;  El següent cas és triar els projectes en els quals volem participar. N'hi ha molts, &lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;a href="http://boinc.berkeley.edu/wiki/Project_list" id="besj" target="_blank" title="aquí podeu trobar-ne una llista"&gt;&lt;span class="Apple-style-span"&gt;aquí podeu trobar-ne una llista&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:85%;"&gt;, n'hi ha per tots els gustos; problemes matemàtics, de salut, de recerca de vida alienígena...&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span class="Apple-style-span"  style="font-size:85%;"&gt;Per cada projecte al que volem participar ens hi n'hem de donar d'alta a la seva pàgina, llavors ens donaran un nom d'usuari i una clau d'identificació que haurem d'introduir al programa  (BOINC). De totes maneres, per fer-nos la vida més senzilla hi ha "paquets" o &lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;i&gt;&lt;span class="Apple-style-span"&gt;managers. &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:85%;"&gt;Aquests són projectes com el &lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;a href="http://www.worldcommunitygrid.org/" id="drq7" target="_blank" title="World Community Grid"&gt;&lt;span class="Apple-style-span"&gt;World Community Grid&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:85%;"&gt;, que és una iniciativa d'IBM que agrupa els projectes de BOINC que ténen a veure amb investigació mèdica i mediambiental. Si ens donem d'alta al WCG ens donem d'alta amb un sol identificador a una sèrie de projectes de BOINC, per tant és una forma bastant agradable de simplificar.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span class="Apple-style-span"  style="font-size:85%;"&gt;Per tant si algú li fa gràcia i vol provar-ho el més senzill és:&lt;/span&gt;&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;span class="Apple-style-span"  style="font-size:85%;"&gt;Baixar-se el BOINC i instal·lar-lo.&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;span class="Apple-style-span"  style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;li&gt;&lt;span class="Apple-style-span"  style="font-size:85%;"&gt;Donar-se d'alta al WCG&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;span class="Apple-style-span"  style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;li&gt;&lt;span class="Apple-style-span"  style="font-size:85%;"&gt;Entrar l'identificador del WCG + la clau al BOINC.&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;&lt;span class="Apple-style-span"  style="font-size:85%;"&gt;Un cop a dins pots entrar a formar part d'equips. Es tracta de fer una competició sana de veure quin equip aconsegueix processar més paquets. Jo formo part de l'equip '&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;i&gt;&lt;span class="Apple-style-span"&gt;Catalunya&lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:85%;"&gt;', per tant, si voleu contribuir hi sereu molt benvinguts ;)&lt;/span&gt;&lt;/p&gt;&lt;h2&gt;&lt;span class="Apple-style-span"  style="font-size:100%;"&gt;Com funciona&lt;/span&gt;&lt;/h2&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:85%;"&gt;  Cal tenir clares les diferències entre Volunteer Computing i altres tipus de supercomputació o computació distrbuïda, com el Grid Computing. El poder del primer es basa en tenir moltes màquines, de diverses categories de forma totalment descontrolada. Aquestes màquines no són teves, no tens el control sobre elles, no saps ni et pots fiar de que l'endemà continuaran funcionant o que estaran connectades a Internet, cosa que com més endavant veurem comporta unes particularitats en el disseny del sistema.&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;span class="Apple-style-span"  style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:85%;"&gt;Bàsicament un projecte de Boinc funciona independentment de qualsevol altre. Cada projecte té el seu servidor, i cada servidor està format per una sèrie de programes, els quals funcionen tinguent com a nucli una base de dades relacional. Aquests subprogrames s'encarreguen de: &lt;/span&gt;&lt;/div&gt;&lt;ul&gt;  &lt;li&gt;&lt;span style="font-size:85%;"&gt;&lt;b&gt;&lt;span class="Apple-style-span"&gt;Servidor de Fitxers&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:85%;"&gt;. Cada servidor té una sèrie de fitxers que són les feines que ha de fer cada màquina. Lògicament aquests fitxers estan guardats en el servidor i són enviats quan toca a cada màquina que ha de processar-lo. Un cop el paquet s'ha processat és enviat de nou cap al servidor. El servidor, a més d'emmagatzemament té diverses funcions addicionals:&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;ul&gt;&lt;span class="Apple-style-span"  style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;  &lt;li&gt;&lt;span class="Apple-style-span"  style="font-size:85%;"&gt;Comprovació d'integritat: Quan es rep un resultat és necessari comprobar que el fitxer no sigui corrupte, per causa malintencionada o bé per error de transferència.&lt;br /&gt;&lt;/span&gt;  &lt;/li&gt;&lt;span class="Apple-style-span"  style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;  &lt;li&gt;&lt;span class="Apple-style-span"  style="font-size:85%;"&gt;Comprovació de correcció: En parlaré en pocs paràgrafs però cada tasca es processa més d'una vegada en més d'una màquina. Així doncs es rep el mateix resultat (o el que hauria de ser exactament el mateix resultat) en diverses ocasions. Per tant, si hem enviat una feina a processar a 5 màquines diferents hauriem de rebre 5 vegades el mateix resultat. En cas de que rebem resultats diferents cal descartar aquest resultat i tornar a calcular-lo.&lt;br /&gt;&lt;/span&gt;  &lt;/li&gt;&lt;span class="Apple-style-span"  style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/ul&gt;&lt;li&gt;&lt;span style="font-size:85%;"&gt;&lt;b&gt;&lt;span class="Apple-style-span"&gt;Organitzador&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:85%;"&gt; (&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;i&gt;&lt;span class="Apple-style-span"&gt;normalment s'utilitza el nom anglés, scheduler)&lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:85%;"&gt; Aquesta és el procés que decideix quina feina s'envia a quina màquina. Per tant, aquest és el procés que decideix quantes vegades rebrem un resultat. Aquesta &lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;b&gt;&lt;span class="Apple-style-span"&gt;redundància&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:85%;"&gt; es per diversos motius:&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;ul&gt;&lt;span class="Apple-style-span"  style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;  &lt;li&gt;&lt;span class="Apple-style-span"  style="font-size:85%;"&gt;Seguretat: Podria ser que per qualsevol motiu un usuari volgués boicotejar un projecte (coses més estranyes s'han vist) i que per tant intentés enviar resultats incorrectes. Cal sempre comparar el resultat amb diverses màquines, mai ens en podem fiar d'una sola.&lt;br /&gt;&lt;/span&gt;  &lt;/li&gt;&lt;span class="Apple-style-span"  style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;  &lt;li&gt;&lt;span class="Apple-style-span"  style="font-size:85%;"&gt;Evitar colls de botella. És un punt molt relacionat amb l'anterior, pot ser que tinguem dependències entre tasques, i que per tant tinguessim una tasca molt important i sense el resultat d'aquesta no poguéssim continuar. El que no es pot fer en un entorn com aquest (Volunteer Computing) és fiar-nos de que una màquina enviarà el resultat del paquet que hem enviat. No controlem aquella màquina, i per tant, no ens podem fiar. És per això que sempre enviem el paquet més vegades de les que és necessari, i com més important és la tasca, més vegades l'enviem.&lt;/span&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;p&gt;&lt;span class="Apple-style-span" style="font-weight: bold;font-size:100%;" &gt;&lt;span class="Apple-style-span"&gt;Programar la teva pròpia apliació&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;  &lt;span style="font-size:85%;"&gt;&lt;span class="Apple-style-span"&gt;Una de les gràcies de Boinc és que pots programar la teva pròpia aplicació perquè corri en diverses màquines alhora, ja siguin dins la pròpia empresa o fins i tot en una xarxa més casolana. En principi no és senzill, ja que estem parlant d'una aplicació que ha de ser paral·lelitzable i que pugui còrrer en diverses plataformes, ja siguin Microsoft Windows, Mac o bé GNU/Linux. &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span class="Apple-style-span"  style="font-size:85%;"&gt;La pàgina de Boinc posa a l'avast de qualsevol persona que ho vulgui fer una sèrie &lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;a href="http://boinc.berkeley.edu/trac/wiki/CompileApp" id="xk-r" title="d'ajudes"&gt;&lt;span class="Apple-style-span"&gt;d'ajudes&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:85%;"&gt; i tutorials per configurar l'entorn de desenvolupament així com programes d'ajuda.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span class="Apple-style-span"  style="font-size:85%;"&gt;  No tinc experiència personal amb això, però realment m'agradaria sentir noticies d'algú que ho hagi intentat. &lt;/span&gt;&lt;/p&gt;&lt;h2&gt;&lt;span class="Apple-style-span"  style="font-size:100%;"&gt;Diversos Usos&lt;/span&gt;&lt;/h2&gt;Lògicament tota aquesta tecnologia es pot aplicar en altres camps, a la mateixa pàgina de BOINC ens dónen unes petites explicacions de com configurar una xarxa de màquines amb BOINC pels nostres propis projectes. En cas de tenir una empresa amb moltes màquines potser no cal invertir grans sumes en servidors d'aplicacions o bé d'utilitzar serveis externs com els Amazon WS, ja que ens podem muntar el nostre "super computador virtual" amb BOINC:&lt;ul&gt;  &lt;li&gt;&lt;span style="font-size:85%;"&gt;&lt;a href="http://boinc.berkeley.edu/trac/wiki/DesktopGrid" id="y_:2" target="_blank" title="Per empreses."&gt;&lt;span class="Apple-style-span"&gt;Per empreses.&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;span class="Apple-style-span"  style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;li&gt;&lt;span style="font-size:85%;"&gt;&lt;a href="http://boinc.berkeley.edu/trac/wiki/VirtualCampusSupercomputerCenter" id="v58a" target="_blank" title="Per Campus Universitaris."&gt;&lt;span class="Apple-style-span"&gt;Per Campus Universitaris.&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:85%;"&gt;Per tant crec que puc concloure dient que el BOINC és informàtica distribuïda &lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;i&gt;&lt;span class="Apple-style-span"&gt;popular!&lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:85%;"&gt;, va vinga no sigueu garrepes, feu-vos una compta i a cremar cicles de CPU!!&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6541464271719475452-3025406616938019529?l=distribuint.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://distribuint.blogspot.com/feeds/3025406616938019529/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://distribuint.blogspot.com/2009/04/volunteer-computing-i-boinc.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6541464271719475452/posts/default/3025406616938019529'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6541464271719475452/posts/default/3025406616938019529'/><link rel='alternate' type='text/html' href='http://distribuint.blogspot.com/2009/04/volunteer-computing-i-boinc.html' title='Volunteer Computing i BOINC'/><author><name>Marc</name><uri>http://www.blogger.com/profile/05631004736020219907</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://4.bp.blogspot.com/_a84GcWW6wwE/TTcLNqDwGxI/AAAAAAAAAXc/KscglDtW6gI/S220/lant.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6541464271719475452.post-935755084862623929</id><published>2009-03-25T23:42:00.003Z</published><updated>2009-03-26T00:05:22.329Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='hadoop'/><title type='text'>Hadoop</title><content type='html'>Els que estigueu posats en el món de l'informàtica distribuïda o bé d'alt rendiment o bé, simplement que esteu una mica a l'aguait de les novetats informàtiques potser us sonarà &lt;a href="http://hadoop.apache.org/"&gt;Hadoop&lt;/a&gt;.&lt;br /&gt;&lt;p&gt;Hadoop és una plataforma de software que bàsicament permet escriure programes que processin unes grans quantitats de dades. Grans grans. El projecte ja té diversos anys i alguns dels seus components s'han separat en subprojectes: &lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Hadoop Core&lt;/strong&gt;: Plataforma de Map Reduce + Sistema de fitxers distribuit.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;HBase&lt;/strong&gt;: Una base de dades distribuïda i escalable.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Pig&lt;/strong&gt;: Nivell d'alt llenguatge per aplicacions que utilitzen Hadoop-core.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;ZooKeeper&lt;/strong&gt;: Sistema de coordinació per Hadoop.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Hive&lt;/strong&gt;: Una espècie de SQL fer queries a les dades emmagatzemades en Hadoop (moltes dades, moltes moltes)&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;És un projecte Open Source utilitzat en producció (molt important) en diverses empreses, tal com podeu veure &lt;a href="http://wiki.apache.org/hadoop/PoweredBy"&gt;aquí&lt;/a&gt;. A més, té una comunitat d'usuaris / desenvolupadors molt activa tal com podreu veure si doneu un tomb pel seu &lt;a href="http://issues.apache.org/jira/browse/HADOOP"&gt;tracker&lt;/a&gt;&lt;/p&gt;En aquest post parlaré exclusivament del projecte principal, Hadoop Core.&lt;br /&gt;&lt;p&gt;Les característiques que ells destaquen en la seva pàgina són les següents: &lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Escalabilitat:&lt;/b&gt; Pot manejar grans quantitats de dades (petabytes) i té escalabilitat horitzontal, és a dir, si necessites més potència o més espai, simplement afegeixes màquines. &lt;/li&gt;&lt;li&gt;&lt;b&gt;Econòmic: &lt;/b&gt;És Open Source (llicència Apache) i treballa amb qualsevol tipus de màquines, no és necessari que siguin servidors d'alta gamma. A més, és una plataforma de software que suposa que els errors de hardware són usuals i per tant, sap reaccionar. També cal destacar que està preparat per còrrer al &lt;a href="http://aws.amazon.com/ec2/"&gt;Amazon EC2&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;Segur: &lt;/b&gt;Sempre es mantenen diverses còpies de les dades repartides en diverses màquines, així ens estalviem desgràcies quan una màquina decideix morir sense avisar. &lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Hadoop és capaç de processar grans quantitats de dades perquè utilitza Map Reduce. Map Reduce és un model de programació pensat, o més bé, readaptat, per procés de moltes dades. Amb això voldria aclarar que de fet, només serveix per això. Sembla ser que hi ha certa moda en utilitzar Map Reduce en alguna de les seves implementacions per moltes coses. Si no es té una entrada de com a mínim gigues de dades probablement no sigui el que es necessita.  &lt;/p&gt;&lt;p&gt;Bé, els causants de tota aquesta febre MR (Map Reduce) van ser Google quan van publicar un &lt;a href="http://labs.google.com/papers/mapreduce.html"&gt;article&lt;/a&gt; on explicaven què era, com es programava i com ho utilitzaven en producció a diari en els seus clústers. A partir d'aquí van començar a aparèixer implementacions d'aquest model de programació en diversos llenguatges, una de les més importants, si no és la que més és sens dubte Hadoop. &lt;/p&gt;&lt;p&gt;En resum, MR i per tant Hadoop treballen de la següent manera (molt per sobre):&lt;/p&gt;&lt;p&gt;Tenim les dades al sistema de fitxers distribuit que comparteixen totes les màquines que conformen el nostre clúster. Tenim un programa que implementa MR mitjançant Hadoop, això bàsicament vol dir que hem programat un programa semblant a &lt;a href="http://hadoop.apache.org/core/docs/current/mapred_tutorial.html#Example%3A+WordCount+v1.0"&gt;aquest&lt;/a&gt;a, el qual té una classe &lt;code&gt;Mapper&lt;/code&gt;, amb un mètode &lt;code&gt;map&lt;/code&gt; i una classe &lt;code&gt;Reducer&lt;/code&gt; amb un mètode &lt;code&gt;reduce&lt;/code&gt;. &lt;/p&gt;&lt;p&gt;Hadoop parteix el clúster en &lt;i&gt;mappers&lt;/i&gt; i &lt;i&gt;reducers&lt;/i&gt;, una màquina pot ser mapper i reducer a l'hora, això es pot definir en la configuració del sistema. Les màquines que fan de mappers agafen les dades del sistema de fitxers distribuit i li apliquen la funció map. Així de bon principi ja tenim tot de màquines que estan llegint les dades d'entrada de forma paral·lela. &lt;br /&gt;&lt;br /&gt;MR té uns requeriments per les dades. Bàsicament han d'esser de la forma. Clau -&gt; Valor, on la clau i el valor poden ser qualsevol cosa. Per tant, un cas típic seria un log d'apache:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;127.0.0.1 - - [31/Jul/2008:00:37:04 +0100] "GET /~marc/images/imatge1.jpg HTTP/1.1" 200 16624&lt;br /&gt;127.0.0.2 - - [31/Jul/2008:00:37:05 +0100] "GET /~marc/images/imatge2.jpg HTTP/1.1" 200 16624&lt;br /&gt;127.0.0.3 - - [31/Jul/2008:00:37:06 +0100] "GET /~marc/images/imatge3.jpg HTTP/1.1" 200 16624&lt;br /&gt;127.0.0.1 - - [31/Jul/2008:00:37:04 +0100] "GET /~marc/images/imatge3.jpg HTTP/1.1" 200 16624&lt;br /&gt;&lt;/pre&gt;Per exemple en aquest programa ens interessa saber quines IPs han agafat quines imatges. Per tant podriem dir-li al mapper que la clau de sortida sigui la imatge, i que el valor de la clau sigui la IP: &lt;br /&gt;&lt;pre&gt;&lt;br /&gt;Clau   Valor&lt;br /&gt;imatge1.jpg  127.0.0.1 &lt;br /&gt;imatge2.jpg 127.0.0.2 &lt;br /&gt;imatge3.jpg 127.0.0.3 &lt;br /&gt;imatge3.jpg 127.0.0.1&lt;br /&gt;&lt;/pre&gt;Ok, per cada Clau/Valor que el mapa troba l'envia a un &lt;em&gt;reducer&lt;/em&gt;. És important notar que no associa res de res, en aquest cas enviarà una clau/valor per cada linia de fitxer. Aquesta és una part molt interessant ja que el mètode &lt;em&gt;map&lt;/em&gt; simplement invoca una funció amb la clau i el valor com a paràmetres i se n'oblida. Aquests valors són emmagatzemats "màgicament" al sistema de fitxers distribuit de forma totalment transparent fins que tots els &lt;em&gt;mappers&lt;/em&gt; han acabat. Això vol dir que els &lt;em&gt;reducers&lt;/em&gt; no comencen a processar les dades fins que els &lt;em&gt;mappers&lt;/em&gt; estiguin (en veritat si que comencen en certa manera, però no és important ara). Hadoop té un particionador de manera que, atenció que això és important, cada &lt;em&gt;reducer&lt;/em&gt; (cada instància d'un &lt;em&gt;reducer&lt;/em&gt;) rep una i només una clau amb una llista dels valors: Això és una mica espinós per entendre, exemple:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;Clau 1 / Valor A&lt;br /&gt; Clau 2 / Valor B&lt;br /&gt; Clau 3 / Valor A&lt;br /&gt; Clau 2 / Valor A&lt;br /&gt; Clau 3 / Valor C&lt;br /&gt;&lt;/pre&gt;I el reducer rebrà:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;Reducer1 : Clau 1 amb una llista que contindrà: Valor A&lt;br /&gt;Reducer2 : Clau 2 amb una llista que contindrà: Valor B, Valor A&lt;br /&gt;Reducer3 : Clau 3 amb una llista que contindrà: Valor A, Valor C &lt;br /&gt;&lt;/pre&gt;Per tant hi haurà tants reducers com claus tingui la sortida el mapper. En l'exemple anterior es tradueix a: &lt;br /&gt;&lt;pre&gt;&lt;br /&gt;imatge1.jpg 127.0.0.1&lt;br /&gt;imatge2.jpg 127.0.0.2&lt;br /&gt;imatge3.jpg 127.0.0.3, 127.0.0.1&lt;br /&gt;&lt;/pre&gt;Llavors lògicament el reducer pot fer el que vulgui amb aquestes dades. L'exemple aquest és extremadament senzill, però pensem que un map i un reduce complex poden fer les mil i una bestieses i si estem parlant d'un fitxer de log complert d'apache d'alguna pàgina important pot ser molt i molt gros.&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;Un cop el reduce està també escriu els resultats en forma clau valor. Aquests resultats són guardats al sistema de fitxers distribuit. &lt;br /&gt;&lt;/p&gt;Podeu trobar molta més informació sobre Map/Reduce + Hadoop al &lt;a href="http://hadoop.apache.org/core/docs/current/mapred_tutorial.html"&gt;tutorial&lt;/a&gt; de hadoop. &lt;br /&gt;&lt;p&gt;Bé, en pròxims articles entraré més en detalls sobre Hadoop i probablement publicaré snippets de codi, amb problemes que em vaig trobant al dia a dia i alguns números.&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6541464271719475452-935755084862623929?l=distribuint.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://distribuint.blogspot.com/feeds/935755084862623929/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://distribuint.blogspot.com/2009/03/hadoop.html#comment-form' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6541464271719475452/posts/default/935755084862623929'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6541464271719475452/posts/default/935755084862623929'/><link rel='alternate' type='text/html' href='http://distribuint.blogspot.com/2009/03/hadoop.html' title='Hadoop'/><author><name>Marc</name><uri>http://www.blogger.com/profile/05631004736020219907</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://4.bp.blogspot.com/_a84GcWW6wwE/TTcLNqDwGxI/AAAAAAAAAXc/KscglDtW6gI/S220/lant.png'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6541464271719475452.post-8735688906967899657</id><published>2009-03-20T21:53:00.005Z</published><updated>2009-03-20T22:24:25.502Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='bases de dades'/><category scheme='http://www.blogger.com/atom/ns#' term='couchdb'/><category scheme='http://www.blogger.com/atom/ns#' term='key-value'/><title type='text'>CouchDB i Key-Value Stores.</title><content type='html'>Avui he estat a una presentació de &lt;a href="http://jan.prima.de/"&gt;Jan Lehnard&lt;/a&gt; sobre &lt;a href="http://couchdb.apache.org/"&gt;CouchDB&lt;/a&gt;.  Podeu trobar les slides &lt;a href="http://jan.prima.de/CouchDB-In-20-Minutes.pdf"&gt;aquí&lt;/a&gt;.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;CouchDB és una key-value store, i aquest és justament el primer post sobre aquest tema. En vindran molts més ja que és un tema molt extens i molt interessant, si més no per mi. Bàsicament podriem dir que una key-value store és una base de dades molt senzilla distribuïda per la xarxa, també hi ha qui ho enten com una taula de hash gegantina distribuïda en diversos ordinadors. I molt més pensada per a l'eficiència dels gets/sets que a per la complexitat que poden tenir altres bases de dades com Postgres o Mysql.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Una de les coses que m'ha fet pensar més de la xerrada és la quantitat de key-value stores que hi ha actualment. La majoria són bastant noves i tot i que totes serveixen pel mateix, emmagatzemar i obtenir certs valors, els seus dissenys són totalment diferents i fan que cadascuna tingui la seva sortida de mercat. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://www.metabrew.com/article/anti-rdbms-a-list-of-distributed-key-value-stores/"&gt;Aquí&lt;/a&gt; podeu trobar un post molt complert i interessant sobre key-value que va fer l'RJ (CTO de &lt;a href="http://www.last.fm"&gt;last.fm&lt;/a&gt;) &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Unes pinzellades per a qui li faci mandra llegir-se tot l'article o li faci cosa perquè està en anglés: &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Les principals diferències de disseny de les key-value stores que convé mirar abans d'adoptar-ne una, o bé que s'han de tenir en compte són:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Tolerància a fallades:&lt;/b&gt; Les key-value stores normalment estan en màquines dedicades, i més d'una màquina, per tant diem que tenim 5 màquines servint l'informació. Què passa si una de les màquines s'espatlla de cop?. Depenent de la tolerància a fallades de la key-value store pot ser que no passi res, o que tinguem un problema gros.  Entre els tipus de tolerància a fallades que són més normals destacaria:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;&lt;i&gt; Replicació&lt;/i&gt;: Tant senzill com tenir més d'una còpia de cada valor que es serveix. Si cau una màquina no passa res perquè hi haurà alguna altre màquina que també té aquest valor. Lògicament gastem més espai del necessari, però és el preu a pagar.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;i&gt; Particionat&lt;/i&gt;: No és una tècnica en si sola, sino que és una millora del mètode anterior, si els valors són grans (fitxers, mp3, imatges) podem partir el fitxer en diversos trossos i repartir-los (amb redundància o replicació) per diverses màquines.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;Persistència&lt;/b&gt;: Normalment aquests mecanismes tenen totes les dades a memòria RAM. Amb això ens estalviem tot el temps d'I/O a disc. Lògicament fa que quedi poca RAM per altres coses, però és el preu de la velocitat. Ara bé, de nou, què passa si hem d'apagar la màquina?. N'hi ha que guarden els valors en una base de dades relacional, ja sigui Mysql, Berkeley, etc. Així, al engegar agafen tota la informació de la base de dades i la posen a memòria. Treballen en memòria i finalment, quan s'apaga la màquina es guarda de nou a la base de dades. N'hi ha d'altres que ho serialitzen utilitzant llibreries natives dels llenguatges de programació en que estan implementades i fins i tot n'hi ha que _no_ guarden res. Quan s'apaguen es perd tot!, normalment són utlitzades com a caches.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;Accés&lt;/b&gt;: Molt bé, tenim molta informació, però com hi accedim?. N'hi ha que porten les seves pròpies llibreries en diversos llenguatges, n'hi ha que utilitzen HTTP (sempre REST, mai SOAP) i n'hi ha d'altres que ofereixen interficies de &lt;a href="http://incubator.apache.org/thrift/"&gt;thrift&lt;/a&gt; o &lt;a href="http://code.google.com/p/protobuf/"&gt;protocol buffers&lt;/a&gt; (hi haurà tot un post sobre aquests dos, no patiu, són mecanismes de serialització / RPC, el primer fet a facebook i el segon fet a google).&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;Eficiència&lt;/b&gt;: Lògicament, s'ha de parlar d'eficiència. Tant en temps d'accés a les dades (quan tardes en fer un GET, quan tardes en fer un PUT?) com en l'eficiència d'ús de recursos que utilitzen les màquines per servir l'informació.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;En pròxims posts entraré una mica més en detall en implementacions concretes i en les key-values stores que considero més interessants.&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6541464271719475452-8735688906967899657?l=distribuint.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://distribuint.blogspot.com/feeds/8735688906967899657/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://distribuint.blogspot.com/2009/03/couchdb-i-key-value-stores.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6541464271719475452/posts/default/8735688906967899657'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6541464271719475452/posts/default/8735688906967899657'/><link rel='alternate' type='text/html' href='http://distribuint.blogspot.com/2009/03/couchdb-i-key-value-stores.html' title='CouchDB i Key-Value Stores.'/><author><name>Marc</name><uri>http://www.blogger.com/profile/05631004736020219907</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://4.bp.blogspot.com/_a84GcWW6wwE/TTcLNqDwGxI/AAAAAAAAAXc/KscglDtW6gI/S220/lant.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6541464271719475452.post-6853724565233395525</id><published>2009-03-04T21:22:00.017Z</published><updated>2009-03-15T12:40:58.015Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='bittorrent'/><category scheme='http://www.blogger.com/atom/ns#' term='protocols'/><title type='text'>Bittorrent</title><content type='html'>&lt;div style="text-align: justify;"&gt;Començo el nou blog amb un post sobre protocols, avui Bittorrent!&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Suposo que tothom, més o menys coneix el Bittorrent, aquest "&lt;i&gt;programa per descarregar pel·lícules"&lt;/i&gt;. Doncs bé, &lt;b&gt;bittorrent&lt;/b&gt; és el nom del protocol, també de l'empresa que el va fer i d'un programa que utilitza aquest protocol. Sí, realment poca imaginació. &lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Bàsicament és un protocol per distribuir fitxers, fa temps s'usa de forma popular, però últimament ha tingut bastant resó mediàtic pel judici que ha tingut lloc a Suècia contra la pàgina d'emmagatzemament de .&lt;i&gt;torrents&lt;/i&gt;  &lt;a href="http://thepiratebay.org/"&gt;The Pirate Bay&lt;/a&gt;. Al final sembla ser que poca cosa han pogut fer perquè tal pàgina tant sols guardava els fitxers .&lt;span style="font-style: italic;"&gt;torrent&lt;/span&gt; i només actuava de &lt;span style="font-style: italic;"&gt;tracker&lt;/span&gt;, i això no és delicte oi ?, ara probablement algú es preguntarà  què és un .&lt;span style="font-style: italic;"&gt;torrent&lt;/span&gt;? què és un &lt;span style="font-style: italic;"&gt;tracker&lt;/span&gt; ? ara anem a això!&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt;Protocol&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;El gran avantate que té el bittorrent sobre l'HTTP clàssic és que quan hi ha diverses baixades del mateix fitxer de forma concurrent (diverses persones volen baixar-se el mateix fitxer alhora), aquests usuaris s'envien trossos del fitxer entre ells. Per tant, com més persones hi hagi baixant un fitxer millor.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size:130%;"&gt;Com funciona.&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span"  style="font-size:180%;"&gt;&lt;span class="Apple-style-span"  style="font-size:18px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;El funcionament de cara l'usuari és ben senzill. &lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 222px;" src="http://2.bp.blogspot.com/_a84GcWW6wwE/SbhO6eo-9rI/AAAAAAAAAOQ/QobcFY1acCU/s320/Picture+3.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5312082527047841458" /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Un usuari es baixa un fitxer amb extensió .&lt;span style="font-style: italic;"&gt;torrent&lt;/span&gt;, és un fitxer petit, menys de 60ks. Tot seguit s'obre amb el &lt;a href="http://en.wikipedia.org/wiki/List_of_BitTorrent_clients"&gt;client de bittorrent&lt;/a&gt; i el fitxer es comença a descarregar. Pim pam.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;En resum i explicat d'una forma planera el que passa és el següent:&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;Quan l'usuari obre el fitxer .&lt;span style="font-style: italic;"&gt;torrent&lt;/span&gt; amb el seu client, aquest contacta amb el &lt;span style="font-style: italic;"&gt;tracker&lt;/span&gt; (la direcció del &lt;span style="font-style: italic;"&gt;tracker&lt;/span&gt; està dins el fitxer .&lt;span style="font-style: italic;"&gt;torrent&lt;/span&gt;) que és un programa instal·lat en un servidor d'internet, i s'identifica com un usuari que es vol baixar aquell fitxer en concret. Tot seguit el &lt;span style="font-style: italic;"&gt;tracker &lt;span class="Apple-style-span" style="font-style: normal; "&gt;contesta amb les IP's dels diferents &lt;span style="font-style: italic;"&gt;peers&lt;/span&gt; (altres usuaris) que s'estan baixant el fitxer, i que per tant, en ténen trossos. Seguidament el client contacta  amb aquesta llista d'usuaris i els hi comença a demanar trossos, més endavant aquest client també compartirà els trossos que ja té. &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-style: italic;"&gt;&lt;span class="Apple-style-span" style="font-style: normal; "&gt;De tant en tant contactaran amb el &lt;span style="font-style: italic;"&gt;tracker&lt;/span&gt; de nou per refrescar la llista d'usuaris connectats que comparteixen aquest fitxer.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Fitxer Torrent&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;El fitxer .&lt;span style="font-style: italic;"&gt;torrent&lt;/span&gt; és un fitxer binari. Bàsicament és un diccionari amb els següents camps i valors:&lt;span style="font-family:courier new;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-family:courier new;"&gt;announce&lt;/span&gt;: La URL del &lt;span style="font-style: italic;"&gt;tracker&lt;/span&gt;.&lt;/li&gt; &lt;li&gt;&lt;span style="font-family:courier new;"&gt;info&lt;/span&gt;: És un altre diccionari que conté:&lt;br /&gt;&lt;/li&gt; &lt;ul&gt;&lt;li&gt; &lt;span style="font-family:courier new;"&gt;name&lt;/span&gt;: Nom suggerit per guardar el fitxer o el directori.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:courier new;"&gt;pieces length&lt;/span&gt;: Mida dels trossos en que es parteix el fitxer (o fitxers) en bytes. El protocol parteix el fitxer en trossos del mateix tamany, amb la única possible excepció de l'últim tros. Els trossos normalment són de 256Ks tot i que es veu que en versions del protocol anteriors els trossos eren de 1Mb.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:courier new;"&gt;pieces&lt;/span&gt;: És un string, la mida del qual és múltiple de 20. Cada 20 caràcters representa el hashing &lt;a href="http://www.faqs.org/rfcs/rfc3174.html"&gt;SHA1&lt;/a&gt; del tros que representa, per tant hi haurà tants subtrossos de 20 com trossos tingui el fitxer, i a cada posició 20*i , sient 0 &lt;= i &lt; #trossos hi ha el hashing per a aquell tros en concret. &lt;/li&gt;&lt;li&gt;&lt;span style="font-family:courier new;"&gt;length/files&lt;/span&gt;: O bé hi ha &lt;span style="font-style: italic;"&gt;length&lt;/span&gt; o bé hi ha&lt;span style="font-style: italic;"&gt; files&lt;/span&gt;, però estrictament un (i només un) dels dos. En cas de que sigui &lt;span style="font-style: italic;"&gt;length&lt;/span&gt;, significa que el que s'està baixant és un sol fitxer i en &lt;span style="font-style: italic;"&gt;length&lt;/span&gt; és el tamany total d'aquest en bytes. En cas de que sigui &lt;span style="font-style: italic;"&gt;files&lt;/span&gt; representa un conjunt de fitxers dins d'una estructura de directori.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-family:courier new;"&gt;path:&lt;/span&gt; Una llista d'strings que corresponen a noms de subdirectoris, en cas de que existeixin.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 91px;" src="http://3.bp.blogspot.com/_a84GcWW6wwE/SbhO6yrB-RI/AAAAAAAAAOY/XFw36ZQkjDE/s320/Picture+4.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5312082532425136402" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Tracker&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;El &lt;span style="font-style: italic;"&gt;tracker&lt;/span&gt; és el software que comunica els usuaris amb altres usuaris, hi ha diverses implementacions, una de les més famoses és &lt;a href="http://opentracker.blog.h3q.com/"&gt;opentrack&lt;/a&gt;&lt;a href="http://opentracker.blog.h3q.com/"&gt;er&lt;/a&gt;, que és la que utilitzen entre d'altres &lt;span style="font-weight: bold;"&gt;The Pirate Bay&lt;/span&gt; i la &lt;span style="font-weight: bold;"&gt;Wikipedia&lt;/span&gt;. A destacar la seva llicència, &lt;a href="http://en.wikipedia.org/wiki/Beerware"&gt;beerware&lt;/a&gt;.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Quan un client fa un &lt;span style="font-style: italic;"&gt;GET&lt;/span&gt; (demana informació) a un tracker, la comanda &lt;span style="font-style: italic;"&gt;HTTP&lt;/span&gt; té els següents valors:&lt;br /&gt;&lt;ul&gt;&lt;li&gt; &lt;span style="font-family:courier new;"&gt;info_hash&lt;/span&gt;: És un string de 20 bytes amb el hash SHA1 de l'apartat info del fitxer de metainfomració (aka .&lt;span style="font-style: italic;"&gt;torrent&lt;/span&gt;)&lt;br /&gt;&lt;/li&gt;&lt;li&gt; &lt;span style="font-family:courier new;"&gt;peer_id&lt;/span&gt;: Id de l'usuari que es vol baixar el fitxer, aquest id és totalment aleatori i és generat pel client cada vegada que comença a baixar-se un fitxer de nou.&lt;br /&gt;&lt;/li&gt;&lt;li&gt; &lt;span style="font-family:courier new;"&gt;ip&lt;/span&gt;: (Paràmetre opcional) IP del client.&lt;br /&gt;&lt;/li&gt;&lt;li&gt; &lt;span style="font-family:courier new;"&gt;port&lt;/span&gt;: És el port al qual escolta el client, normalment és el 6881, en cas de que estigui ocupat és el 6882 i anar pujant fins al 6889.&lt;br /&gt;&lt;/li&gt;&lt;li&gt; &lt;span style="font-family:courier new;"&gt;uploaded&lt;/span&gt;: Els bytes que s'han pujat d'aquest fitxer. Això són els bytes que aquest client en particular ha enviat a altres peers.&lt;br /&gt;&lt;/li&gt;&lt;li&gt; &lt;span style="font-family:courier new;"&gt;downloaded&lt;/span&gt;: Bytes que s'han baixat fins aquest moment.&lt;br /&gt;&lt;/li&gt;&lt;li&gt; &lt;span style="font-family:courier new;"&gt;left&lt;/span&gt;: Número de bytes que falten per completar la transferència del fitxer. Cal notar que no té perquè ser el mateix que el resultat de la mida del fitxer - downloaded, ja que pot ser que hi hagi hagut una corrupció de dades o problemes de transferència, i que per tant algun tros de fitxer s'hagi de tornar a baixar.&lt;br /&gt;&lt;/li&gt;&lt;li&gt; &lt;span style="font-family:courier new;"&gt;event&lt;/span&gt;: És l'estat del client, pot ser started, quan s'està començant a baixar des del començament, completed un cop té tot el fitxer o &lt;span style="font-style: italic;"&gt;stopped&lt;/span&gt;, un cop es para de baixar.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;La resposta del tracker al client també són diccionaris en binari. Pot ser que el tracker contesti amb una entrada de &lt;i&gt;failure&lt;/i&gt;, amb un contingut que és un string llegible amb el missatge d'error.  En cas de que tot hagi anat bé el diccionari conté dues claus, la primera &lt;i&gt;interval&lt;/i&gt;, que són el número de segons en que el client hauria de tornar a fer una petició d'informació al &lt;i&gt;tracker&lt;/i&gt;. La següent entrada serà &lt;i&gt;peers&lt;/i&gt;, que conté una llista de id's, ips i ports dels &lt;i&gt;peers&lt;/i&gt; que s'estan baixant el fitxer.  En cas de que hi hagi algun aconteixement especial un client pot fer una requesta d'informació al &lt;i&gt;tracker&lt;/i&gt; encara que no hagi passat el temps indicat per aquest.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Comunicació entre peers&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;La comunicació entre &lt;i&gt;peers&lt;/i&gt; és simètrica. Els missatges que s'envien d'un &lt;i&gt;peer&lt;/i&gt; a l'altre són del mateix format i les dades (del fitxer que s'està compartint) poden anar també en els dos sentits.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;Els &lt;i&gt;peers&lt;/i&gt; es refereixen als diferents trossos del fitxer compartit amb indexs, que són exactament els mateixos indexs que hi ha al fitxer de metainformació. Un cop un client s'ha baixat un tros del fitxer i n'ha comprovat l'integritat amb el mapa SHA1 ho comunica a la resta de peers.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Les connexions entre &lt;i&gt;peer&lt;/i&gt; i &lt;i&gt;peer&lt;/i&gt; contenen dos bits d'estat. El primer, &lt;i&gt;choked&lt;/i&gt; (tapat), si o no, i el segon, &lt;i&gt;interessat&lt;/i&gt;, si o no. El bit the &lt;i&gt;choked&lt;/i&gt; indica que el client està tapat, això vol dir que no enviarà més informació fins que sigui "destapat".&lt;br /&gt;&lt;br /&gt;Una transferència de dades entre dos &lt;i&gt;peers&lt;/i&gt; té lloc quan un dels dos està interessat i l'altre no està tapat. En cas de que un client no estigui interessat en res que tingui un altre client (sempre que aquest últim estigui destapat) aquest ho ha de fer constar amb el bit de interessat a fals.&lt;br /&gt;&lt;br /&gt;El protocol recomana que quan s'està enviant dades, els clients haurien de tenir encuades a memòria diverses peticions de trossos per tenir una bona rendiment TCP, per altra banda quan s'està enviant dades a un altre peer també haurien de tenir els trossos a enviar a memòria, i en cas de que s'anul·li per qualsevol motiu la transferència, probablement el client quedi tapat. aquests trossos es poden borrar fàcilment. Això com ja he dit són recomanacions del protocol, caldria mirar exactament com s'implementa en cada client.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Per tant, quan dos clients s'envien missatges tenim bàsicament que comencen amb un handshake seguit per un fluxe d'informació de mida prefixada.&lt;br /&gt;&lt;br /&gt;El handshake comença amb el número 19 en decimal seguit de l'string '&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;BitTorrent protocol&lt;/span&gt;'. A partir d'aquí, tots els números seran enters codficats en 4 bytes en &lt;i&gt;big&lt;/i&gt;-&lt;i&gt;endian&lt;/i&gt;. Seguidament venen els 20 bytes de hash SHA1 de la taula info_value del fitxer de metainformació, en cas de que els dos clients no donguin exactament el mateix hash, es talla la comunicació entre ells. En cas de que tot vagi bé s'envien 20 bytes més amb l'identificació del clients, en cas de que aquesta informació (l'id del client amb qui s'està comunicant) no aparegui a la informació sobre clients que havia donat el tracker, es talla la comunicació.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;Tot seguit tenim el que és la comunicació en si entre peers, els missatges amb mida de cos cero són pings per fer saber i mantenir l'estat dels peers i s'envien cada dos minuts. En cas de que el cos del missatge tingui més d'un byte llavors cal mirar quin tipus de missatge es tracte:&lt;span class="Apple-style-span"  style=" ;font-family:'courier new';"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;ul&gt;&lt;li&gt;&lt;span class="Apple-style-span"  style=" ;font-family:'courier new';"&gt;0 - Choke&lt;/span&gt;&lt;/li&gt;&lt;li  style="font-family:courier new;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;1 - Unchoke&lt;/span&gt;&lt;/li&gt;&lt;li face="courier new"&gt;2 - Interested&lt;/li&gt;&lt;li face="courier new"&gt;3 - Not Interested&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:courier new;"&gt;4 - Have&lt;/span&gt;: És un número que indica que s'ha acabat de transferir i comprovat la integritat d'un nou tros.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:courier new;"&gt;5 - Bitfield:&lt;/span&gt; És un mapa de bits on cadascun indica quins trossos de fitxer s'ha enviat.&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:courier new;"&gt;6 - request&lt;/span&gt;: Bàsicament és una petició perquè li enviin un tros. De paràmetre té un index.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:courier new;"&gt;7 - piece: &lt;/span&gt;Les dades en si del fitxer.&lt;br /&gt;&lt;/li&gt;&lt;li style="font-family: courier new;"&gt;8 - cancel:&lt;span style="font-family:georgia;"&gt; Demana per cancel·lar una transmissió. &lt;/span&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;A l'hora de baixar els trossos normalment els clients trien els trossos de forma aleatori, així s'aconsegueix que estranyament es donguin situacions d'inanició que són les quals en que hi ha alguns trossos del fitxer que només estiguin en un o poc clients, cosa que faria que en el cas que aquests paressin de pujar fitxers ningú podria tenir el fitxer complert. Això forma part del protocol oficial de Bittorrent, tot i que algunes implementacions intenten millorar aquest aspecte fent que els trossos menys continguts en global entre els clients siguin els que tenen més prioritat per ser enviats.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 95px;" src="http://4.bp.blogspot.com/_a84GcWW6wwE/SbhO6Q78aKI/AAAAAAAAAOI/1c8cD9Jro5M/s320/Picture+2.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5312082523369269410" /&gt;&lt;span style="font-size:180%;"&gt;&lt;div style="text-align: left;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;i bàsicament... és això :)&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;Jerga&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Vinga va, una mica de paraulotes relacionades amb el tema:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-family:courier new;"&gt;p2p&lt;/span&gt;: Peer 2 Peer, d'un a l'altre, d'un punt a l'altre, d'una persona a una altre, bla bla bla&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:courier new;"&gt;peer&lt;/span&gt;: Un punt (ordinador, màquina, persona...) que participa en una comunicació P2P&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:courier new;"&gt;seed&lt;/span&gt;: En el món bittorrent seeder és una persona que permet que d'altres puguin obtenir el fitxer un cop ell/a ja el té. Per tant, que no borra el fitxer una vegada l'ha baixat, sinó que el continua compartint.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:courier new;"&gt;leecher&lt;/span&gt;: justament al revés que el seeder, una persona que no comparteix el fitxer, tant sols el baixa.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-size:180%;"&gt;Links&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.bittorrent.org/beps/bep_0003.html"&gt;Especificació del protocol&lt;/a&gt;. Bastant ben explicat i bastant planera. &lt;/li&gt;&lt;li&gt;&lt;a href="http://ca.wikipedia.org/wiki/BitTorrent"&gt;Wikipedia&lt;/a&gt; Hi ha un gràfic molt interessant. Pago una cervesa a qui l'entengui!&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6541464271719475452-6853724565233395525?l=distribuint.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://distribuint.blogspot.com/feeds/6853724565233395525/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://distribuint.blogspot.com/2009/03/bittorrent.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6541464271719475452/posts/default/6853724565233395525'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6541464271719475452/posts/default/6853724565233395525'/><link rel='alternate' type='text/html' href='http://distribuint.blogspot.com/2009/03/bittorrent.html' title='Bittorrent'/><author><name>Marc</name><uri>http://www.blogger.com/profile/05631004736020219907</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://4.bp.blogspot.com/_a84GcWW6wwE/TTcLNqDwGxI/AAAAAAAAAXc/KscglDtW6gI/S220/lant.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_a84GcWW6wwE/SbhO6eo-9rI/AAAAAAAAAOQ/QobcFY1acCU/s72-c/Picture+3.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6541464271719475452.post-7180855798610309473</id><published>2009-03-04T00:41:00.003Z</published><updated>2009-03-04T00:45:03.761Z</updated><title type='text'>Primer post i presentació.</title><content type='html'>Bé, començo el nou blog sobre informàtica distribuïda.&lt;br /&gt;&lt;br /&gt;Com suposo ja sabreu n'hi ha molts de blogs d'aquesta temàtica per la xarxa. El que passa és que la majoria són en anglés.&lt;br /&gt;&lt;br /&gt;Per tant m'he decidit en obrir-ne un en català.&lt;br /&gt;&lt;br /&gt;Aquí aniré traduint els diversos articles i posts d'altres blogs que em semblin interessants i aniré fent-ne de propis, lògicament.&lt;br /&gt;&lt;br /&gt;Bàsicament parlaré de protocols de comunicació, mecanismes de RPC, de serialització, de diverses eines i dissenys per arquitectures i sistemes distribuïts.&lt;br /&gt;&lt;br /&gt;apa doncs.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6541464271719475452-7180855798610309473?l=distribuint.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://distribuint.blogspot.com/feeds/7180855798610309473/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://distribuint.blogspot.com/2009/03/primer-post-i-presentacio.html#comment-form' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6541464271719475452/posts/default/7180855798610309473'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6541464271719475452/posts/default/7180855798610309473'/><link rel='alternate' type='text/html' href='http://distribuint.blogspot.com/2009/03/primer-post-i-presentacio.html' title='Primer post i presentació.'/><author><name>Marc</name><uri>http://www.blogger.com/profile/05631004736020219907</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://4.bp.blogspot.com/_a84GcWW6wwE/TTcLNqDwGxI/AAAAAAAAAXc/KscglDtW6gI/S220/lant.png'/></author><thr:total>2</thr:total></entry></feed>
