Versiones de Spark y bugs de Scala

Estas semanas he estado aprendiendo Scala y montando alguna cosilla para funcionar en Spark, y ha tocado portarla al cluster. La primera nuisance ha sido que al haber decidido, pobres de nosotros, trabajar con MapR hemos tenido que esperar a que hubiera una version compatible con Hive y Yarn, que ha resultado finalmente ser Spark 1.2.1. En cuanto a la version de Scala, no me atrevo a pasar de la 2.10.4, que es la que utilizan en la distro.

Se supone que podemos funcionar bien compilando todo nosotros y pasando como variable la configuracion, o bien lanzando con spark-submit --master yarn. Lo primero todavia no he conseguido que funcione, asi que me he agarrado a lo segundo, y os cuento aqui los problemas de compatibilidad que he tenido entre la version desarrollada en mi maquina y la compilacion para el submit en el cluster.

1) No hay ninguna garantia de que --jars adjunte el resto de librerias, asi que mejor empaquetarlas en el jar de la aplicacion misma. Esto es un poco latoso porque el sbt no sabe hacerlo o no explica cómo, asi que no queda mas remedio que adosar el resto de las clases que necesitemos via jar -u o algun mecanismo similar. Supongo que se podra construir como receta en el propio sbt pero no he visto algo estandarizado.

2) Sorpresita, hay un bug en la closure de scala cuando el codigo esta directamente en el tipico “object extends App” en vez de en un metodo. Asi que hay que inventarse o bien un def main, o bien simplemente un metodo anonimo poniendo otros corchetes:

... extends App {{ ....  }} 

3) De alguna manera, una serializacion que funcionaba en mi ordenador no funciona en el cluster, a pesar de que en teoria estan compilando con la misma version de Scala. Puede que el assembly de spark esté en realidad compilado con otra version, o puede que haya dependencias de la version de java, pero me inclino a pensar que la historia esta en el scala. El asunto es que  orElse produce una funcion compuesta que no es serializable.  No me ha quedado mas remedio que sustituir un elegante

f = g orElse f

(donde f es var y g es val) por un mamotreto donde digo explicitamente que el resultado es serializable

val f0 = f
f = new PartialFunction[Int, Float]
        with Serializable {
  override def apply(i: Int): Float
    = { if (g.isDefinedAt(i)) g(i) else f0(i) }
  override def isDefinedAt(i: Int): Boolean
    = { g.isDefinedAt(i) || f0.isDefinedAt(i) }
}

Es posible que los desarrolladores de Scala hayan dudado sobre la serializacion del orElse debido a la ambigüedad de la recursividad. En el primer caso se asume que la “f” es la funcion antigua, siguiendo la tradicion de interpretar que la parte derecha de una asignacion se evalua antes de modificar la izquierda:  a = a +1 y todo eso que tanto lia a los novatos en programación. En cambio, al menos en el Scala que esta usando mi cluster, la “definicion explita” de un orElse asume que la “f” es la misma que se esta asignando, y entra en un bucle recursivo, asi que hay que fijar la version anterior de la funcion con un val f0.

Y de momento no tengo mas apaños. Una vez serializadas las cosas, los RDD del Spark parece que funcionan perfectamente y el codigo ya puede ejecutarse con todos los recursos que el yarn ponga a nuestra disposicion. Se queda la pelota en las manos del administrador de sistema. Que de momento tambien soy yo :-(

Como analizar los resultados de Podemos

Desde la pagina http://autonomicas.podemos.info/resultados/ navegamos a la  comunidad que nos interesa, abrimos el desplegable de Resultados Completos y pulsamos el botón de ir a Resultados Verificables, que esta al final de ese desplegable.

En la pagina de vota.podemos.info a la que llegamos, descargamos el fichero indicado como “Recuento Votación“, que se llamará algo asi como 8021.tar (en el caso de Aragón).

Por supuesto necesitamos una aplicacion que sepa abrir ficheros .tar, que es algo asi como el winzip pero de unix (usease Mac o Linux; pero seguramente Windows tambien sabe abrirlo).

Dentro del fichero .tar, un primer dato interesante es el fichero results.json, que podemos abrir con cualquier editor de texto, y contiene bien arregladitos los resultados completos, indicando tambien la candidatura y el orden de los candidatos. Este fichero contiene pues ya cierta informacion que no tenemos a primera vista en el desplegable inicial: podemos ver más claramente quienes han “avanzado puestos” respecto a su posicion en la candidatura.

Pero lo mas interesante son… ¡las papeletas! ¿Donde las miramos? Estan en una serie de ficheros 0.tar.gz, 1.tar.gz, etc. Cada uno de esos corresponde a una tanda de votacion electronica, interrumpidas bien por la necesidad de corregir algun dato bien simplemente porque se haya caido durante algunos minutos el sistema de votacion. Tenemos pues que ir a cada uno de ellos. En el caso de Aragón hay dos, parece que porque se cambio el titulo “Secretario General” a “Secretaría General”, con acento.

Abrimos el 0.tar.gz y de ahi vamos a la carpeta 1-xxxxxxxxxxxxxxxxxxxxx, que es la de la votacion al consejo ciudadano. De ahi seleccionamos plaintext_json y lo guardamos en algun sitio, llamandolo por ejemplo papeletas_0

Hacemos lo mismo en 1.tar.gz y sacamos el plaintext, digamos papeletas_1

Contamos las lineas de los dos ficheros, que podemos abrir con cualquier editor de texto, y los juntamos en uno solo, papeletas.txt

wc -l papeletas_*
 113 papeletas_0
 5354 papeletas_1
 5467 total

Veamos ahora cuales han sido las 10 papeletas más frecuentes. Asi aprenderemos algo del formato con el que estan codificadas:

$ sort papeletas.txt | uniq -c | sort -nr |head
 2400 "10203040506070809101112131415161718192021222324252627282931"
 1003 "49505152535455565758596061626364656667686970717273747576777880"
 294 "89"
 91 "23"
 35 "313233343536373839404142434445464749"
 24 "1020304050607080910111213141516171819202122232425262728293050"
 21 "8349505152535455565758596061626364656667686970717273747576777880"
 20 "1020304050607080910111213141516171819202122232425262728293031323335"
 18 "50"
 16 "1020304050607080910111213141516171819202122232425262728293032"

Vemos que la string “89” corresponde a las abstenciones, 294 en total. Tambien vemos que las papeletas mas frecuentes son de votos “plancha” y podeis notar una peculiaridad: el ultimo numero de cada cadena esta incrementado en uno: “282931” en vez de “…282930″, o “…777880″ en vez de “…777879″  Tambien por esta extraña aversion al “00”, no lo ponen a la izquierda de la lista, y asi la “01020304…” en realidad aparece como la “1020304…” que es un poco confuso tambien.  Y en consecuencia, como en questions_json el id de los candidatos empieza en cero,  tambien hay que sumarles uno a todos ellos para poder poner al id=0 en la lista. En fin, cosas de la codificación. Tambien es peculiar, y eso no lo entiendo del todo, que en general todos los id aparecen ordenados salvo los de las candidaturas independientes.

Entonces para entendernos…  ¿quienes son los candidatos de esas 91 papeletas que han votado solo “23” o de esas otras 18 que han votado “50”?  Pues seran los candidatos con  id=21 y con id=48… “Ibrahima Sall Fall” y “Pedro Arrojo Agudo” respectivamente.  No es sorprendente, pero es un dato interesante que solo obtenemos gracias a las papeletas.

Tambien podriamos mirar cual es la tendencia a mezclar dos listas, o quienes se caen de una lista cuando alguien decide hacer esa mezcla (sin sorpresas, suelen caer los ultimos). Y para los que gustan de analizar redes puede ser curioso las papeletas “incompletas”, donde solo se han votado a media docena de candidatos.

El jabon de Auri.

¿Recordais la pildora del doctor mateo?

Acabo de leer un librito de fantasia titulado “La música del silencio”, traducción de “The Slow Regard of Silent Things”, y la escena de acción central es un momento en el que la protagonista elabora jabon a partir de los componentes que tiene a mano en el sotano de la universidad.

Auri se encuentra con que no tiene manzanas para aromatizar el jabon y decide intentar con nuez moscada molida. Tras cierta elaboracion consigue exprimir un cierto liquido ambar, “repleto de secretos y espuma marina, colmando de picante misterio, lleno de almizcle, susurros y acido misrístico”. Y al examinar el hollejo residual se da cuenta de que “Estaba lleno de gritos. Días enteros de gritos rojos, oscuros en interminables” y decide almacenarlo en un lugar especial de sus sotanos, que en la traduccion española llaman “Recaudo” y en el original, con más carga de significado personal, “Boundary”.

Al volver de “Recaudo” se detiene en su vasija y se enjuaga la cara, las manos y los pies. Vuelve al trébede donde esta haciendo el jabon, se para, vuelve a las vasija y se lava la cara, las manos y los pies. Ve que un guijarro esta fuera de su sitio, se frota los ojos, para, se mira las manos, vuelve a su habitacion, se lava la cara, las manos y los pies. Y entra en panico, durante las siguientes dos paginas.

La conclusion de los lectores: Desorden Obsesivo-Compulsivo.

Pero discutiendo el tema en reddit ha salido otra posibilidad.

¿Que esta pasando? Pues como dice el chiste, “que seas paranoico no significa que no te sigan”. En este caso, “que seas OCD no significa que no sea urgente que te laves”. Auri ha estado separando los distintos precursores psicoactivos de la nuez moscada, dejando de alguna manera en el “ambar byne” la parte meramente narcotica y tranquilizante y en el hollejo la parte mas peligrosa, que decide almacenar precisamente en la vitrina de residuos peligrosos. Al volver de esa vitrina instintivamente se lava repetidas veces para eliminar los elementos contaminantes. Aun así, cae en el delirio durante unos momentos.

Anonimizar y Verificar

A diferencia de la democracia liquida, no queremos que el votante pueda traspasar a otro el derecho al voto, asi que cuando vaya a la urna debe estar claro que la autorizacion a votar es para la persona que esta conectada.  Pero a la vez hay que preserval el anonimato del votante.

Ademas, el votante quiere tener seguridad de que su papeleta ha sido introducida en la urna. Y quizas la autoridad de la urna quiere estar segura de que el certificado de voto emitido por ella no es falsificado, pero dejemos de momento este paso.

¿Se puede lograr todo esto sin tener que comprobar el codigo ni la seguridad de las maquinas que reciben los votos? Como apuntaba Galli en un par de posts, la insercion de un voto no autorizado es dificil de evitar si esta maquina ha sido de alguna manera comprometida, dado que podria simplemente esperar a la fase de autorizacion y sustituir el voto correcto por el falso. Para evitarlo, la solucion mas simple -asumiendo que el compromiso no se extiende al codigo html+js de la pagina web- es que el voto encriptado incluya el autentificador que es unico por usuario… pero entonces se rompe el anonimato.

Se me ocurre lo siguiente:

Continue reading Anonimizar y Verificar

¿Es Podemos la venganza de Zapatero?

En el sentido de que Podemos tiene raices en el 15m, claro. Y que el 15m no fue disuelto por el gobierno de Zapatero.

Durante el gobierno de Clinton una visita oficial a Atenas fue recibida, como era de esperar, con agitación popular. Al preguntarle al presidente USA cual era su opinión sobre las manifestaciones en la calle, éste contestó algo asi como “Si el pueblo que inventó la democracia no pudiera manifestarse, seria preocupante”. Muy para salir del paso, pero por un lado no las desautorizaba y por otro obligaba a las televisiones a mostrar imagenes de los manifestantes. Las televisiones descubrieron -ya lo sabian, pero normalmente no tenian excusa para mostrarlas- que esas imagenes subian audiencia, y les dieron cancha. Ademas, tenian que mostrarlas para -otra excusa conveniente- contrarrestar los canales de noticias alternativos en la internet, la entonces fresca y naciente IndyMedia. Asi comenzó, con una declaración en Atenas, la racha del movimiento antiglobalización.

Esperemos que algun dia, si no tienen otro ataque de amnesia, los politicos de aquel 2011 puedan explicar en algun sitio por qué pasaron a pensar que ese movimiento debia ser tolerado. Si fue impotencia disimulada o autentico espiritu democratico, si fue un “si no es de Dios, se disolvera solo”, o si fue que pensaban que de esta manera le dejaban una patata caliente a los que estaban por venir, esto es, al Partido Popular, aun a costa de arriesgar la quema de sus propio partido. O quizas no esperaban tal quema, creyendo los argumentos que siempre da Taibo, de que cualquier movimiento reformista solo sirve a la larga para crear los nuevos lideres de la socialdemocracia, y deduciendo erroneamente que esos lideres que se crearian serian a la larga los del PSOE del 2016.

El #15m estaba dentro de una nueva racha global, la que va de las primaveras arabes a los #occupy; de hecho fue pivotal para sacar la corriente del ambito exclusivamente arabe. Esta optica internacional, combinado con el enorme apoyo local -recordemos la gente trayendo comida para los acampados, hasta el peligro de convertir en centros de poder a los cómites de cocina- obligaba a no reprimirlo. Quizas la imposibilidad obligaba tambien a, en vez de reconocer la impotencia de tu gobierno, autoconvencerse de que en realidad no querias desalojarlo.

Pero no obligaba a darle cancha hasta el punto de que television española retransmitiera en directo -permanentemente en su canal de internet- las asambleas de la plaza del Sol, como si de sesion de control del congreso se tratara. En las televisiones privadas sí se puede entender desde la perspectiva, como ocurrió en Seattle, de la batalla por la audiencia. Pero siempre que tengas una autorización implicita del poder.

El incendio en la calle era incluso conveniente para amenazar a la derecha si un proceso constituyente estaba llegando en serio, y en los meses previos al #15m lo parecia. Los grupos de empresarios habian estado circulando entre ellos documentos como el manifiesto “Everis” de noviembre del 2010, que pedian aprovechar la oportunidad de la crisis y la renovacion monarquica para hacer una limpieza interna. Hay que reconocer que el sistema de corrupcion que se estaba implantando molestaba hasta al empresario tradicional, que espera ser parte del poder y no tener que estar maniobrando toma y daca con los distintos poderes, y la corrupción a muchos niveles lleva a esto segundo; llega un momento que no sabes cual es el precio real de un negocio. Querian una “segunda transicion” que clarificara las reglas de juego. Del suyo, claro.

A toro pasado a todos les parecia pues correcto dar cancha al 15m: a la prensa por su generacion de noticias de alta audiencia, a los grupos empresariales como una pieza más de sus manifiestos de regeneracion, y a los grupos dirigentes de la socialdemocracia para dotarse de peso dentro de ese proceso de renovacion. La creación de nuevos partidos politicos entraba en todo caso como partidillos que acabarian integrandose, partidos o lideres, en IU o en el PSOE antes de las siguientes generales. De momento, lo que esta ocurriendo es lo inesperado: que el nuevo “partidillo” no tiene ninguna necesidad de integrarse y simplemente va ganando expectativa de voto mientras los demas saltan de crisis en crisis.  En el PSOE más de una vez estos meses habran pensado con el lema pepero, “Esta es la herencia que nos deja ZP”.