<?xml version='1.0' encoding='UTF-8'?><rss xmlns:atom='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' version='2.0'><channel><atom:id>tag:blogger.com,1999:blog-6541464271719475452</atom:id><lastBuildDate>Mon, 09 Nov 2009 23:41:12 +0000</lastBuildDate><title>Distribuïnt...</title><description>Blog sobre informàtica distribuïda en català.</description><link>http://distribuint.blogspot.com/</link><managingEditor>noreply@blogger.com (Marc)</managingEditor><generator>Blogger</generator><openSearch:totalResults>15</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-6541464271719475452.post-8599723359292372604</guid><pubDate>Sun, 08 Nov 2009 12:17:00 +0000</pubDate><atom:updated>2009-11-08T12:26:24.751Z</atom:updated><category domain='http://www.blogger.com/atom/ns#'>thrift</category><category domain='http://www.blogger.com/atom/ns#'>soap</category><category domain='http://www.blogger.com/atom/ns#'>rpc</category><title>SOAP fail</title><description>&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;</description><link>http://distribuint.blogspot.com/2009/11/soap-fail.html</link><author>noreply@blogger.com (Marc)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>2</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-6541464271719475452.post-3499883723968792621</guid><pubDate>Thu, 29 Oct 2009 22:09:00 +0000</pubDate><atom:updated>2009-10-29T22:52:00.201Z</atom:updated><title>Spring killed the Java star.</title><description>&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;</description><link>http://distribuint.blogspot.com/2009/10/spring-killed-java-star.html</link><author>noreply@blogger.com (Marc)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>2</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-6541464271719475452.post-6540145030434036103</guid><pubDate>Wed, 29 Jul 2009 23:43:00 +0000</pubDate><atom:updated>2009-07-30T00:46:50.490+01:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>documentation</category><title>Technical documentation guidelines.</title><description>&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;</description><link>http://distribuint.blogspot.com/2009/07/technical-documentation-guidelines.html</link><author>noreply@blogger.com (Marc)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-6541464271719475452.post-8486906221087052202</guid><pubDate>Sat, 11 Jul 2009 19:52:00 +0000</pubDate><atom:updated>2009-07-12T15:58:32.415+01:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>hive</category><category domain='http://www.blogger.com/atom/ns#'>hadoop</category><title>Hive</title><description>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;</description><link>http://distribuint.blogspot.com/2009/07/aquest-post-parlo-de-hive-una-eina-que.html</link><author>noreply@blogger.com (Marc)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-6541464271719475452.post-5503831085520790518</guid><pubDate>Tue, 16 Jun 2009 22:27:00 +0000</pubDate><atom:updated>2009-06-16T23:33:12.640+01:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>video</category><category domain='http://www.blogger.com/atom/ns#'>bigtable</category><category domain='http://www.blogger.com/atom/ns#'>bases de dades</category><category domain='http://www.blogger.com/atom/ns#'>dynamo</category><title>Nosql</title><description>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;</description><link>http://distribuint.blogspot.com/2009/06/nosql.html</link><author>noreply@blogger.com (Marc)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-6541464271719475452.post-145494437623851464</guid><pubDate>Mon, 15 Jun 2009 17:17:00 +0000</pubDate><atom:updated>2009-06-15T18:23:27.526+01:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>hadoop</category><title>Hadoop, the definitive guide.</title><description>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;</description><link>http://distribuint.blogspot.com/2009/06/hadoop-definitive-guide.html</link><author>noreply@blogger.com (Marc)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-6541464271719475452.post-1845684628269074946</guid><pubDate>Sun, 17 May 2009 16:50:00 +0000</pubDate><atom:updated>2009-05-17T18:01:13.786+01:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>bases de dades</category><category domain='http://www.blogger.com/atom/ns#'>key-value</category><category domain='http://www.blogger.com/atom/ns#'>p2p</category><category domain='http://www.blogger.com/atom/ns#'>amazon</category><category domain='http://www.blogger.com/atom/ns#'>dynamo</category><category domain='http://www.blogger.com/atom/ns#'>rellotges vectorials</category><title>Dynamo</title><description>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;</description><link>http://distribuint.blogspot.com/2009/05/dynamo.html</link><author>noreply@blogger.com (Marc)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-6541464271719475452.post-7272248437884220453</guid><pubDate>Fri, 08 May 2009 06:25:00 +0000</pubDate><atom:updated>2009-05-08T07:35:06.881+01:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>bigtable</category><category domain='http://www.blogger.com/atom/ns#'>bases de dades</category><category domain='http://www.blogger.com/atom/ns#'>google</category><title>Bigtable</title><description>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;</description><link>http://distribuint.blogspot.com/2009/05/bigtable.html</link><author>noreply@blogger.com (Marc)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-6541464271719475452.post-4097889286622066349</guid><pubDate>Thu, 07 May 2009 14:06:00 +0000</pubDate><atom:updated>2009-05-07T15:09:38.574+01:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>hadoop</category><title>Hadoop, la guia definitiva.</title><description>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;</description><link>http://distribuint.blogspot.com/2009/05/hadoop-la-guia-definitiva.html</link><author>noreply@blogger.com (Marc)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>1</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-6541464271719475452.post-8903685164349554521</guid><pubDate>Mon, 27 Apr 2009 22:12:00 +0000</pubDate><atom:updated>2009-04-27T23:13:26.264+01:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>bases de dades</category><title>Nous models de bases de dades</title><description>&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;</description><link>http://distribuint.blogspot.com/2009/04/nous-models-de-bases-de-dades.html</link><author>noreply@blogger.com (Marc)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>1</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-6541464271719475452.post-3025406616938019529</guid><pubDate>Mon, 06 Apr 2009 23:07:00 +0000</pubDate><atom:updated>2009-04-07T00:28:03.393+01:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>Volunteer Computing</category><category domain='http://www.blogger.com/atom/ns#'>BOINC</category><title>Volunteer Computing i BOINC</title><description>&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;</description><link>http://distribuint.blogspot.com/2009/04/volunteer-computing-i-boinc.html</link><author>noreply@blogger.com (Marc)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-6541464271719475452.post-935755084862623929</guid><pubDate>Wed, 25 Mar 2009 23:42:00 +0000</pubDate><atom:updated>2009-03-26T00:05:22.329Z</atom:updated><category domain='http://www.blogger.com/atom/ns#'>hadoop</category><title>Hadoop</title><description>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;</description><link>http://distribuint.blogspot.com/2009/03/hadoop.html</link><author>noreply@blogger.com (Marc)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>2</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-6541464271719475452.post-8735688906967899657</guid><pubDate>Fri, 20 Mar 2009 21:53:00 +0000</pubDate><atom:updated>2009-03-20T22:24:25.502Z</atom:updated><category domain='http://www.blogger.com/atom/ns#'>bases de dades</category><category domain='http://www.blogger.com/atom/ns#'>couchdb</category><category domain='http://www.blogger.com/atom/ns#'>key-value</category><title>CouchDB i Key-Value Stores.</title><description>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;</description><link>http://distribuint.blogspot.com/2009/03/couchdb-i-key-value-stores.html</link><author>noreply@blogger.com (Marc)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-6541464271719475452.post-6853724565233395525</guid><pubDate>Wed, 04 Mar 2009 21:22:00 +0000</pubDate><atom:updated>2009-03-15T12:40:58.015Z</atom:updated><category domain='http://www.blogger.com/atom/ns#'>bittorrent</category><category domain='http://www.blogger.com/atom/ns#'>protocols</category><title>Bittorrent</title><description>&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;</description><link>http://distribuint.blogspot.com/2009/03/bittorrent.html</link><author>noreply@blogger.com (Marc)</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 xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-6541464271719475452.post-7180855798610309473</guid><pubDate>Wed, 04 Mar 2009 00:41:00 +0000</pubDate><atom:updated>2009-03-04T00:45:03.761Z</atom:updated><title>Primer post i presentació.</title><description>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;</description><link>http://distribuint.blogspot.com/2009/03/primer-post-i-presentacio.html</link><author>noreply@blogger.com (Marc)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>2</thr:total></item></channel></rss>