POD Flashcards

1
Q

¿Cuáles son los 3 componentes del teorema CAP y que indica el teorema de la relación entre ellos para sistemas distribuidos?

A
  • Consistency: Todas las réplicas de un dato tienen el mismo (y último) valor escrito al momento de cualquier lectura.
  • Availability: Todos los nodos del cluster están disponibles para atender requests. No implica que no pueda reportar un error de causarse, simplemente que contesta.
  • Partition tolerance: El sistema permite que la información esté particionada entre nodos de un cluster y tenga replicación de manera que pueda soportar fallas en la red.
    El teorema indica que no se pueden garantizar las 3 cosas juntas. Como las herramientas distribuidas requieren particionamiento, hay que elegir entre consistency y availability.
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
2
Q

Explicar la estrategia de Cassandra para realizar la escritura y replicación de un dato.

A

El nodo que recibe el pedido de escritura (y puede ser cualquiera) se convierte en coordinador de las escrituras.
Calcula mediante la fórmula de replicación quien es el owner del dato y a quien se le debe asignar las réplicas. Envía los mensajes de escritura y cuando recibe la cantidad ACKs requeridos por el factor de escritura retorna el mensaje de escritura terminado.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
3
Q

Explicar el concepto de Split Brain. ¿Puede ocurrir utilizando el framework Hazelcast? ¿Si es así, cómo? (triple)

A

El split brain ocurre cuando, por problemas de comunicación de red, el cluster se divide en dos partes autónomas. Cada parte funciona de manera independiente a la otra sin inconvenientes recibiendo escrituras y lecturas.
El problema reside en que cuando se repara la conexión entre las partes, se crearan conflictos para mergearlas. Hazelcast tiene configuración para resolver cómo solucionar estos conflictos.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
4
Q

Explicar que indica la capacidad de elasticidad que puede tener un cluster de trabajo o store distribuido. (doble)

A

La elasticidad es la capacidad de un cluster de modificar la cantidad de nodos que lo componen sin que el cluster quede offline completamente.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
5
Q

¿En Hazelcast, por qué es necesario implementar el método reset al escribir un Combiner?

A

checkeado:
Como los nodos mapper reutilizan la instancia de los combiners para diferentes claves es necesario utilizar el metodo reset para limpiar el estado de la clave anterior para comenzar a utilizarlo para una nueva clave.

PAU:
En caso de llegar a un nuevo valor, llamar a un método reset reinicializar el conteo.h

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
6
Q

¿Cómo funciona el algoritmo de leasing de Remote Garbage Collector?

A

checkeado:
El algoritmo de leasing utiliza un contador en el servidor para saber la cantidad de instancias remotas, pero esos contadores estan atados a un timer, una vez que el timer se vence se considerael prestamo vencido y la instancia liberada. Para que no se libere es responsabilidad del cliente renovar el prestamo (contador) antes de que se venza
PAU:
Cada referencia que se envía a los clientes se inicializa con un tiempo de lease. El cliente es responsable de renovar ese lease, de lo contrario, cuando se vence el tiempo el servidor lo considera liberado.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
7
Q

¿Por qué es necesario setear un security manager para poder activar el Dynamic class loading? (doble)

A

Porque correr clases cuya definición está en otro servidor es peligroso, por lo que debe hacerse con conciencia y solo si es estrictamente necesario. Es por esto que java no lo permite por defecto y hay que usar un security manager para habilitarlo.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
8
Q

¿Cual es la restricción que presenta Cassandra a la hora de realizar filtros en sus consultas, por qué existe esa restricción y qué desafío se presenta a partir de esta restricción?

A

La restricción que presenta Cassandra es que solo permite filtrar en el where por la primary key. Esta restricción se debe a cómo indexa la información. Cassandra no tiene índices si no que indexa por los campos de la primary en el file system. Por lo cual cada consulta tiene una tabla con la primary dependiente de qué campos pondré en el where.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
9
Q

¿Cual es el beneficio de poder poner un servicio en estado inactivo en Activatable?

A

Porque si no está usando, deja de consumir recursos, haciéndolo más eficiente. Además, al dejarlo desactivado persiste en memoria.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
10
Q

¿Cuál es la utilidad de agregar la variable serialVersionUID en una clase Serializable?

A

checkeado:
Permite controlar las versiones de las clses que tienen el cliente y el servidor para ver si las mismas son compatibles. Si varia el valor no son compatibles y el sistema falla
PAU:
Para controlar la versión de la serialización.
Permite controlar las versiones de las clases que tienen el cliente y el servido para ver si las mismas son compatibles.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
11
Q

¿Cómo es el pasaje de parámetros en RMI para los siguientes tipos de parámetros?
Objetos no remotos
Objetos remotos

A

Objetos no remotos: cuando el objeto a pasar será utilizado como valor, se pasa como valor. El middleware se encarga de serializar el objeto en el origen y deserializarlo en el destino. Genera una copia del objeto en la JVM.
Objetos remotos: en este caso, se utiliza el mismo mecanismo que un Servant. Se exporta el objeto, transformándolo en un objeto remoto y se envía la referencia al dicho objeto. Y se define como parámetro a través de su interfaz remota.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
12
Q

Indicar que significa que un sistema de store cumpla con el modelo de consistencia eventual. (doble)

A

Indica que luego de realizarse una escritura, y de no mediar nuevas escrituras, pasado cierto tiempo todas las lecturas reflejarán el valor escrito.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
13
Q

En Hazelcast por defecto ¿Cómo se selecciona al nodo dueño de una partición?

A

Las particiones son distribuidas uniformemente entre los nodos del cluster por lo que cada uno recibe (cantidadDeParticiones/cantidadDeNodos) particiones.
La relación partición ->owner se guarda en una tabla de particiones, replicada por los nodos del cluster.
(Agregaría que el nodo más viejo es el Coordinador y genera esa tabla, respondiendo a la pregunta de cómo se selecciona el dueño)

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
14
Q

Explicar cuál es la función del Combiner en el paradigma de programación distribuido MapReduce.

A

El combiner se utiliza únicamente con streams paralelos y sirve para justamente combinar las reducciones de cada stream paralelo. Acumula hasta que se acaban una cierta cantidad de valores (chunk) y se emite ese resultado parcial.
Alt: el combiner hace de reducer post-mapeo pero con un límite llamado chunk (acumula “chunk” cantidad de valores y los manda). Se usa para reducir la cantidad de paquetes mandados al siguiente paso del MapReduce
el Combiner juega un papel importante en la etapa intermedia de reducción, donde se combinan y agrupan los resultados parciales generados por los mappers antes de pasarlos a la etapa final de reducción.

El objetivo principal del Combiner es reducir la cantidad de datos que se deben transferir entre los mappers y los reducers en un entorno distribuido. Al realizar una combinación local de los resultados parciales en cada nodo del clúster antes de enviarlos a los reducers, se reduce el tráfico de red y se optimiza el rendimiento general del proceso MapReduce.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
15
Q

Explicar el proceso y las componentes que se involucran desde el momento que el RMID recibe un mensaje para un servicio que fue registrado, pero no está activo. (doble)

A

checkeado:
El RMID recibe el servicio que se lo pasa al Activator, el Activator ve que el servicio esta registrado pero no esta activo. Va a buscar el ActivationGroup, le tira una exepcion que el mismo agarra y
luego crea el Activation Group, el Activator le pasa al Activaton Group el Activator Group ID y el
Desc, que le dice como crear el Servant. Luego el Activator Group crea el servant, y el servant se encarga de correr la funcion y lo devuelve

NO DRIVE:

El RMID recibe un mensaje. Se lo transmite al Activator asociado. El Activator busca el Activation Group correspondiente. Como no está activo, inicializa el Activation Group dentro de una nueva JVM. Una vez que el Activation Group está activo, el Activator le envia Activation ID y Activation Desc (que dice como crear/activar es servant) para que pueda poner activo el Servant necesario. El Servant creado ejecuta el método pedido y retorna.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
16
Q

Indicar cual es la garantía de la semántica At least once

A

El cliente envía el mensaje y espera que el servidor envía una respuesta que indique que el mensaje se ejecutó. Si pasa un tiempo sin recibir dicha respuesta el cliente reintenta el mensaje. De esta manera se garantiza que se ejecute pero puede pasar que se ejecute más de una vez.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
17
Q

Indicar por qué utilizar un servidor de nombres (que no sea el RMI Registry) permite que los servicios hechos en RMI garantice la transparencia de ubicación

A

RMI (Remote Method Invocation)
Porque aísla el objeto remoto del cliente mediante un servidor de nombres. De ese modo se podría cambiar la ubicación física del objeto remoto pero el cliente no se enteraría.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
18
Q

Indicar si en el RMI Registry se está generando un sistema que respeta la transparencia de fallas.

A

No, porque el RMI Registry es un SPOF. Como es único, si falla, falla todo el sistema.

En el caso del RMI Registry, se trata de un componente centralizado y único en el que se registran y buscan los objetos remotos. Si el RMI Registry falla, todo el sistema basado en RMI se verá afectado, ya que los clientes no podrán encontrar ni comunicarse con los objetos remotos registrados.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
19
Q

Indicar que significa que un cliente utilice la estrategia de server side pushing para obtener la respuesta de un servicio remoto de manera no bloqueante.

A

Significa que cuando el cliente llama al método que realizará el procesamiento, este le otorgará al servidor una manera para que el servidor le avise al cliente cuando terminó con esa tarea.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
20
Q

¿Cómo funciona el algoritmo de Distributed Garbage Collection para Remote Garbage Collector?

A

Es un algoritmo distribuido que se basa en el conteo de referencias. El contador se mantiene coordinando los GCs de los clientes y servidores. Es complejo y difícil de mantener.

21
Q

Indicar cual es la función del Stub en un ambiente RMI.

A

El Stub funciona dentro del cliente y se comunica remotamente con el Skeleton dentro del server para que el cliente pueda utilizar los métodos del objeto remoto como si los estuviera usando localmente.

22
Q

Indicar cuál es la función de los siguientes elementos en un ambiente RMI
- Interfaz remota
- Servant

A
  • La interfaz remota es la que define qué funcionalidad tendrá el objeto remoto. Define los métodos que tiene que implementar si o si el objeto remoto.
  • El Servant es el objeto remoto, que es el que implementa la interfaz remota y luego será publicado para que un cliente remoto lo pueda consumir.
23
Q

Explicar la estrategia que utiliza RMI para lograr que el llamado a los métodos remotos cumpla la transparencia de acceso requerida por la ISO.

A

La transparencia de acceso se cumple por diseño. Las llamadas son a través de interfaces que “parecen” locales, se utilizan middlewares para ocultar la comunicación por red y hasta los llamados a métodos remotos son bloqueantes igual que los llamados locales.

24
Q

Una instancia de la siguiente clase se quiere usar para compartir entre threads, los potenciales valores de estados de una aplicacion.
Indicar, si existen, cuales son los riesgos de utilizar dicha instancia y las posibles soluciones para mitigar los problemas indicados.

public class States{
private final String[] states = new String[] {“UNK”, “NEW”, “RUNNING”, “DONE”};
public String[] getStates() {
return states;
}
}

A

En principio si la clase solo es utilixada para realizar lecturas no hay ningun problema. Pero en caso de que los threads necesiten agrgar.quitar estados del array, de forma que cada thread tenga una copia (pero esto perderia poder comunicar los cambios entre threads), o solo permitir cambios y lecturas al array a traves de metodos de la clase sincronizandolos a nivel instancia o alguna variable para eviar inconsistencias de lectura/escritura.

25
Q

Dadas las siguientes clases:
public class Usuario {
private String id;
private VIvienda vivienda;
private String nombre;
private int edad;
// getters
}

class Vivienda{
private Optional<String> barrio;
private String ciudad;
private String provincia;
private String pais;
// getters
}</String>

Partiendo de una lista de Usuario llamada users y utilizando streams y funcionalidades de java 8, indicar:
La cantidad de usuarios menores de edad (18 años), agrupados por provincia, sabiendo que el nombre de las provinicias de cada usuario puede tener cualquier combinacion de mayusculas y minusculas.

A

Map<String, Long> usuariosMenoresPorProvincia = users.stream()
.filter(usuario -> usuario.getEdad() < 18)
.collect(Collectors.groupingBy(usuario -> usuario.getVivienda().getProvincia().toLowerCase(), Collectors.counting()));

En esta línea de código, estamos realizando las siguientes operaciones:

users.stream(): Convertimos la lista de usuarios (users) en un stream para poder procesar los elementos de manera funcional.

filter(usuario -> usuario.getEdad() < 18): Filtramos solo aquellos usuarios cuya edad es menor a 18 años.

collect(Collectors.groupingBy(usuario -> usuario.getVivienda().getProvincia().toLowerCase(), Collectors.counting())): Agrupamos los usuarios filtrados por provincia, donde el nombre de la provincia se convierte a minúsculas (toLowerCase()), y luego contamos la cantidad de usuarios en cada grupo usando Collectors.counting().

El resultado será un Map que contiene la cantidad de usuarios menores de edad por provincia, donde la clave del mapa será el nombre de la provincia en minúsculas y el valor será la cantidad de usuarios menores de edad en esa provincia.

DRIVE:
Respuesta seleccionada:

users.stream().map(users::getVivienda).
lter(v -> v.getPais().equals(“Argentina”) && v.getCiudad().equals(“Córdoba”)).collect(Collectors.toMap( v -> v.getBarrio().orElse(“Desconocido”), 1, (u,v) -> {u + v});

Respuesta correcta: Ninguna

Comentarios para respuesta:
users::getVivienda no es válido (seria Usuario::getVivienda)
el segundo parametro del toMap es una funcion, debería ser “v->1”.
O con dos parametros y que el segundo sea Collectors.counting().

26
Q

Una empresa que distribuye sus productos en distintas ciudades del mundo cuenta con datos correspondientes a las ventas que se registraron durante cierto periodo en las mismas. Cada valor del conjunto tiene la siguiente estructura:
“dd.mm.yyyy-ciudad” valorMontoVenta
Ejemplo: ‘10/10/2015-CABA’ 4000.30 significa que el 10 de Octubre de 2015 en la ciudad de Buenos Aires las ventas fueron de 4000.30 pesos. Y hay un “registro” unico para cada par dia ciudad.
Sin codificar, indique en palabras:
a- cuales serian el comportamiento del Mapper y la clave y el valor que emite?
b- cual seria el comportamiento del Reducer para obtener el valor final?

Para la siguiente query:
Calcule el monto diario de ventas promedio para cada año por ciudad

Aclaracion
Es una estadistica por lo se puede tomar que todos los años tiene 365 dias (no hay biciestos)

Ejemplo de salida
2015 - CABA: 2305,35
2015 - MDZA : 1006
2016 - CABA: 4905
2016 - MDZA : 999,32

A

DRIVE:
a. El comportamiento del mapper sería tener una clave (año ciudad) y un valor que es el
monto, cuando le llega el dd/mm/yyyy-ciudad valor.
Deberia sacar el valor del año y de la ciudad, crear una clase a partir de esos valores y
emitirlos
b. Luego en el reducer se va sumando el monto para cada key y emite el valor dividido por
365

otro checkeado:
- El mapper corta la clave de entrada el año y la ciudad, por lo que emite clave: ano-ciudad y valor monto
- el reducer recibe los montos para cada anoy la ciudad, los suma obteniendo el total de ventas por ano.
- No se requiere procesamiento posterior

CHATGPT:
a) Comportamiento del Mapper y clave y valor emitidos:

El Mapper procesará cada línea de datos correspondiente a las ventas y emitirá como clave un par compuesto por el año y la ciudad, y como valor el monto de la venta. Primero, el Mapper debe extraer la información relevante de cada línea para obtener el año, la ciudad y el monto de venta.

Por ejemplo, para la entrada “10/10/2015-CABA 4000.30”, el Mapper emitirá el siguiente par clave-valor:

Clave: (2015, CABA)
Valor: 4000.30

El Mapper realizará esto para cada línea de entrada y enviará pares clave-valor correspondientes a cada venta registrada.

b) Comportamiento del Reducer para obtener el valor final:

El Reducer recibirá todos los pares clave-valor emitidos por el Mapper y su tarea será calcular el monto diario de ventas promedio para cada año por ciudad. Para hacer esto, el Reducer agrupará los valores por clave (año y ciudad) y luego calculará el promedio de los montos de venta para cada grupo.

Por ejemplo, supongamos que el Reducer recibe los siguientes pares clave-valor:

Clave: (2015, CABA)
Valores: [4000.30, 2000.50, 3500.80]

El Reducer calculará el promedio de los valores para esta clave:

Promedio = (4000.30 + 2000.50 + 3500.80) / 3 = 3167.87

Entonces, el Reducer emitirá el siguiente par clave-valor como resultado final:

Clave: (2015, CABA)
Valor: 3167.87

El Reducer realizará este proceso para cada grupo de valores correspondientes a cada año y ciudad y emitirá el valor promedio de ventas diarias para cada combinación de año y ciudad como resultado final.

Finalmente, los resultados se verán como los siguientes:

2015 - CABA: 3167.87 (promedio de montos de venta diarios en el año 2015 en la ciudad de Buenos Aires)
2015 - MDZA: … (promedio de montos de venta diarios en el año 2015 en la ciudad de Mendoza)
2016 - CABA: … (promedio de montos de venta diarios en el año 2016 en la ciudad de Buenos Aires)
2016 - MDZA: … (promedio de montos de venta diarios en el año 2016 en la ciudad de Mendoza)
… y así sucesivamente para cada año y ciudad en los datos proporcionados.
Estos valores representarían el monto diario de ventas promedio para cada año y ciudad, como se solicitó en la consulta.

PAU:
- Mapper corta la clave de entrada el año y la ciudad, por lo que emite (año-ciudad, monto).
- Reducer recibe los montos para cada año y ciudad, los suma obteniendo el total de ventas
por año.
- Al terminar el procesamiento el reducer emite el total/365.
- No se requiere procesamiento posterior.

27
Q

Suponiendo un servicio RMI con Activatable. Dado el siguiente escenario:

El servicio esta funcionando y hay clientes solicitando por servicios. De pronto se cae el demonio RMID. Se vuelve a levantar el RMID pero no se ejecuta el Server (que solicita binding del servicio en el rmiregistry, etc).

Podrian los clientes que venian consumiendo el servicio antes de que se cayera seguir consumiendolo? Justificar

A

checkeado:
Si, debido que Activatable esta preparado para este caso. Al correr el server se envio como levantar el servant y esta informacion se persiste mas alla de que el RMID se caiga, por lo que cuando el mismo es levantado y recibe el primer request para que el servaant se encarga de levantar al mismo (y al activation group s es necesario)

28
Q

Indicar cual es la funcion de Servidor de Nombres en un ambiente RMI

A

permite que los servicios hechos en RMI garanticen
la transparencia de ubicación.
Transparencia de ubicación se refiere a que el usuario no sepa la ubicación exacta del servidor.
Tener un servidor de nombres provee una abstracción entre el usuario y los servicios. El usuario,
para poder conectarse al servicio, le pedirá al servidor de nombres la referencia al server.

29
Q

Indicar cual es la garantia de la semantica at most once

A

garantiza que un mensaje enviado por un cliente a un servidor se entregará al servidor a lo sumo una vez, lo que significa que el mensaje puede entregarse correctamente una vez o no entregarse en absoluto, pero nunca se entregará más de una vez.

30
Q

Supongamos un sitio de reviews de peliculas que modela sus datos:
- id: identificador autogenerado
- titulo: nombre de las peliculas
- director: List de los directores (cada uno un string de nombres y apellidos)
- Protagonistas: Lista de protagonistas (cada uno un string de nombres y apellidos)
- Genero: Texto que indica el genero principal de la pelicula
- Clasificacion: valor que indica si el la pelicula es apta para todo publico o tiene alguna restriccion
- Fecha de estreno
- Taquilla: Recaudacion total de la pelicula
- Reviews: Lista de reviews donde cada review tiene:
– username: identificador del usuario
– rating: calificacion numerica 1 a 10
– comentario: texto libre para indicar razones de la calificacion
– likes: cantidad de likes dados por otros usuarios al review

Tener en cuenta que el nombre de una pelicula puede aparecer muchas veces ya sea por remakes o por peiculas que simplemente se llaman igual.
Suponiendo que se quiere utilizar un proceso map reduce (que puede ser una cadena de procesos). En este proceso se recibe en el mapper inicial el id de la pelicula como clave y el resoto de los datos del registro como valor.
Se pide sin codificar, indique en palabras

Para cada job en la cadena
1- Cuales serian el comportamiento del Mapper?
2- Cuales es la clave y el valor que emite mapper?
3- Cual seria el comportamiento del Reducer?
4- Cuales es la clave y el valor que emite reducer?
5- Indicar si hay que hacer un procesamiento posterior de los resultados.

Indicar el reviewer ochentoso mas popular donde popularidad es la suma de los likes de los ratings que publico y “ochentoso” porque sol se toman llas reviews para peliculas de los 80s.

A

YO:
Mapper: filtra por peliculas en los 80 y devuelve un map con clave username y valor likes
Reducer: los suma
post procesamiento = ordenarlos

chatGPT
Para resolver la tarea de encontrar al reviewer ochentoso más popular, necesitaríamos una cadena de procesos MapReduce. Supongamos que tenemos tres etapas en esta cadena: Primer Job, Segundo Job y Tercer Job.

Primer Job:

Comportamiento del Mapper: El Mapper toma como entrada el id de la película y los datos asociados a esa película. Para cada película, se emiten pares clave-valor donde la clave es el id de la película y el valor es el resto de los datos de la película.

Clave y valor emitidos por el Mapper: (id de la película, datos de la película).

Comportamiento del Reducer: No es necesario un Reducer para esta etapa ya que solo estamos emitiendo los datos de las películas sin necesidad de agrupar o reducir nada.

Clave y valor emitidos por el Reducer: N/A

Procesamiento posterior: No es necesario un procesamiento posterior ya que solo estamos emitiendo los datos de las películas como están.

Segundo Job:

Comportamiento del Mapper: El Mapper toma como entrada los datos de las películas y emite pares clave-valor donde la clave es el título de la película y el valor es la cantidad de likes del review asociado.

Clave y valor emitidos por el Mapper: (título de la película, cantidad de likes del review).

Comportamiento del Reducer: El Reducer agrupa los likes por título de película y suma los likes para cada película.

Clave y valor emitidos por el Reducer: (título de la película, suma de likes).

Procesamiento posterior: No es necesario un procesamiento posterior en esta etapa.

Tercer Job:

Comportamiento del Mapper: El Mapper toma como entrada los datos de las películas y filtra solo las películas que pertenecen a los 80s (década de los 80).

Clave y valor emitidos por el Mapper: (título de la película, datos de la película) solo para películas de los 80s.

Comportamiento del Reducer: El Reducer toma como entrada las películas de los 80s y sus datos asociados. Luego, emite pares clave-valor donde la clave es el username del reviewer y el valor es la suma de los likes de los ratings que publicó para películas de los 80s.

Clave y valor emitidos por el Reducer: (username del reviewer, suma de likes de ratings para películas de los 80s).

Procesamiento posterior: En este punto, tendríamos la información necesaria para encontrar al reviewer ochentoso más popular, que sería aquel con la mayor suma de likes de ratings para películas de los 80s. No sería necesario un procesamiento posterior para obtener esta información.

En resumen, para encontrar al reviewer ochentoso más popular, necesitamos una cadena de tres Jobs en el proceso MapReduce. El resultado final será la suma de los likes de los ratings que publicó el reviewer para películas de los 80s.

31
Q

Dentro de un sistema se reciben notificaciones de los re-tweets realizados para una campana a partir de un criterio de busqueda (cierto hashtag, por ejemplo). Al terminar la misma, las notificaciones obtenidas son enviadas a un sistema map-reduce para su procesamiento y obtener estadisticas. El proceso entonces recibe en el mapper:
- Como clave el id del re-tweet
- Como valor los siguientes datos:
– screen name del usuario que realizo el re-tweet
– Id del tweet original re-tweeteado
– Screen name del autor del tweet
– El pais donde se realizo el tweet
– Cantidad de seguidores del que realizo el re-tweet
– Likes del tweet al momento de realizarse el re-tweet
– Fecha del re-tweet
– Un set con los hashtags del tweet

Sin codificar, indique:
- cual es el procesamiento en el mapper y que clave y valor emite.
- Cual es el procesamiento y el valor de respuesta del reducer
- Si se requiere algun procesamiento posterior al reducer para obtener la respuesta final

{ara la siguiente query:
El top 10 de los usuarios que llegaron a mas gente con sus tweet, a partir de los re-tweets del mismo.
Aclaraciones:
- Es una estadistica por lo qu no es necesario asegurarse que no se conto a la misma persona mas de una vez
- No tomar en cuenta a los seguidores del autor original

A

checkeado:
- El mapper emite screen name del autor del tweet como clave y como valor la cantidad de seguidores del que hizo retweet. Es discutible si no hay que sumar 1 para agregar al que retwitio, cualquiera de los dos casos se consider ok.
- EL reducer se encarga de acumular (sumar) la cantidad de seguidores
- al terminar emite el total de seguidores para cada autor
- Se requiere procesamiento posterior para ordenar y obtener el top 10

PAU:
- Mapper emite (screen name del autor, cantidad de seguidores del retweet) (+ 1 por el que
retwitteó, discutible).
- Reducer suma la cantidad de seguidores. Emite el total de seguidores para cada autor
- Se requiere procesamiento posterior para ordenar y obtener el top 10.

32
Q

Indicar si es correcto que en el siguiente codigo:
public class Servlet {
private Object lockCounterLock;
private int counter;
public void responseRequest(Request request){

synchronized(lockCounterLock){

counter++;
}

}
public synchronized int getCount(){
return counter;
}
}

La instruccion syncronized(lockCounterLock){…} indica que ningun otro codigo de la clase puede modificar la variable lockCounterLock

A

Falso
No garantiza que ningún otro código de la clase pueda modificar la variable lockCounterLock ya que en el get no se le pasa la instancia para lockear

33
Q

Para el siguiente codigo indique si el mismo es apto para utilizar en un ambiente concurrente. Justifique en ambos casos y en caso de no serlo proponga una solucion.

public class Stack {
private final String[] elemets;
private int size;
public Stack(final int capacity){
elements = new String[capacity];
}
public void push(final String item){
synchronized (elements){
elements[size++] = item;
}
}
public void pop(){
synchronized (elements){
return elements[–size];
}
}
public void peek(){
return elements[size - 1];
}
public void isEmpty(){
return size == 0;
}
}

A

No es apto para utilizar en un ambiente concurrente porque el peek y el isEmpty no tienen
synchronized.

34
Q

RMI con Activable. El servicio está funcionando y hay clientes solicitando servicios. De pronto se cae el RMID Se vuelve a levantar el RMID pero no se ejecuta el Server. Los clientes que venían consumiendo el servicio podrán seguir consumiéndolo?

A

Si, debido a que Activable está preparado para este caso. Al correr el server se envió como levantar el servant y esta información se persiste más allá de que el RMID se caiga, por lo que cuando el mismo es levantado y recibe el primer request para el servant, se encarga de levantar al
mismo (y al activation group si es necesario).

35
Q

Forma de sincronización directamente sobre métodos enteros de una clase

A

Este tipo de sincronización hace que el servicio sea serial y no pueda recibir llamadas concurrentes. Cada cliente debe esperar a que todos los que llegaron antes terminen. Hace que no sea eficiente en la mayoría de los casos. Se puede justificar este tipo de sincronización si los métodos hacen cosas simples, y no tardan mucho.

36
Q

Partiendo de una lista de Usuario llamada users y utilizando streams y funcionalidades de Java 8, indicar:
El número de usuarios por barrio para los usuarios que viven en la ciudad “Córdoba” del país “Argentina”. En caso de que el usuario no tenga un barrio definido, indicar al barrio como “Desconocido”.

users.stream()
.map(Usario::getVivienda)
.filter(v -> v.getPais().equals(“Argentina”) &&
v.getCiudad().equals(“Córdoba”))
.collect(Collectors
.toMap(v -> v.getBarrio().orElse(“Desconocido”), v -> 0,
(u,v) -> {u + v})
Código en Java 8. Indicar el error.

A

La variable utilizada dentro del lambda debe ser declarada como final o effectively final. No se puede modificar dentro, en este caso habría que hacer un array final y modificar el valor de array[0].

37
Q

Función del Combiner

A

Funciona como un reducer dentro del Mapper. Se instancia 1 por cada valor emitido del Mapper.
Acumula valores que devuelve antes de emitirlos. No espera a recibir todos los valores, emite por chunks.

38
Q

Características necesarias para que una interfaz pueda ser usada como interfaz del servicio remoto?

A
  • Todo método remoto de dicha interfaz debe lanzar al menos la excepción RemoteException.
  • Todo objeto remoto utilizado como parámetro debe ser declarado mediante su interfaz
    remota.
  • La interfaz debe extender de la interfaz Remote
39
Q

Dado un servicio RMI utilizando UnicastRemoteObject y el RMIRegistry, para registrar visitas y obtener dicho conteo.
Dado los siguienter eventos
- T0: Los clientes A y B obtienen la referencia al servant.
- T1: El cliente A realiza 5 registros de visitas.
- T2: El cliente B pide la cantidad de visitas y obtiene 5.
- T3: El RMIRegistry se cae
- T4: Los operadores del sistema levantan una nueva instancia del RMIRegistry
Indicar que sucede cuando:
- T5: Cliente A solicita la cantidad de visitas.
- T6: Cliente B registra una nueva visitas.
- T7: Cliente C pide al RMIRegistry la referencia al servant y solicita la cantidad de visitas.

PAU:
Servicio de RMI con UnicastRemoteObject y RMIRegistry para registrar visitas y contarlas

A

checkeado:
En T5 le dice 5
En T6 B puede registrar una nueva visita
En T7 C puede conocer la referencia al RMIRegistry pero no puede conectarse al servant porque no hizo rebind

PAU:
Los clientes A y B tienen la referencia al servant, así que no la pierden cuando el Registry se cae.
Pueden consultar bien. El cliente C no tenía la referencia, se la pide al Registry, pero como éste
no hizo rebind con el servant, no tiene la referencia y no puede pasársela

40
Q

para el siguiente codigo indique si el mismo es apto para utiliazr en un ambiente concurrente. Justifique en ambos casos y en caso de no serlo proponga una solucion

public class StringBuffer {
private String buffer;
private int length;

public StringBuffer() {
    this("");
}
public StringBuffer(final String buffer) {
    this.buffer = buffer;
    length = buffer.length();
}
public StringBuffe append(final String suffix) {
    return new StringBuffer(buffer + suffix);
}
public int getLength() {
    return length;
}
@override
public String toString() {
    return buffer;
}

}

A

checkeado:
La clase es inmutable por lo que se puede considerar thread safe
PAU:

Es correcto para usar en un ambiente concurrente porque la clase es inmutable, puede considerarse threadsafe. (Variables privadas y final, no hay setters, y cada vez que se hace append() se retorna una nueva instancia del objeto).

41
Q

Interfaz se puede utilizar en un servicio remoto?

A

Si, extiende Remoto, sus métodos tiran RemoteException, son públicos y todos los objetos
parámetros son Built-in, y por lo tanto serializables.

42
Q

CountingFactorizer implements Servlet. Ambiente concurrente?

A

No, porque hace ++count que, al ser un Long, devuelve una nueva instancia del objeto, pierde el
efecto del syncronized colocado. Se puede declarar la variable como atómica (AtomicLong), o se
pueden hacer los métodos syncronized.

43
Q

Suponiendo que una instancia del siguiente objeto Locker quiere usarse para realizar locks. La
idea que es un usuario pide Lock mediante un texto y si no está pedido se devuelve true y si está
se devuelve false. El objeto quiere utilizarse entre varios threads que ejecutan concurrentemente.
Indicar si el mismo tiene, o no, riesgos de utilizarse en dicha situación. Si el código puede fallar,
indique como y cual puede ser una solución a dicho problema

public class Locker {
private final Map<String, String> locks;
public Locker() {
locks = new ConcurrentHashMap<>();
}

public final boolean lock(final String lockPath) {
    if(!locks.containsKey(lockPath)) {
        locks.put(lockPath."locked");
        return true;
    }
    return false;
}

public final void unlock(final String lockPath) {
   if(locks.containsKey(lockPath)){
        locks.remove(lockPath)
    }

} }
A
44
Q

Analizar el siguiente codigo e indicar cual es el resultado del mismo:


final List<String>
list = Arrays.asList("Jhon", "Paul", "George");
int sum = 0;
list.forEach(e-> {
sum+= e.length();
});
System.out.println(sum);
...</String>

A

Respuesta seleccionada: Esto no funciona ya que tiene que ser final o no se tiene que modificar la variable. No corre, tira error en la línea donde se trata de modificar sum

45
Q

Dentro de un sistema se reciben las notificaciones de los re­tweets realizados para una campaña a partir de un criterio de busqueda (cierto hashtag, por ejemplo). Al terminar la misma, las notificaciones obtenidas son enviadas a un sistema map­reduce para su procesamiento y obtener estadísticas. El proceso entonces recibe en el mapper:
- Como clave el id del re­tweet.
- Como valor los siguientes datos:
– screen name del usuario que realizó el re­tweet
– Id del tweet original re­tweeteado.
– Screen name del autor del tweet.
– Cantidad de seguidores del autor del tweet.
– El país donde se realizó el tweet.
– Cantidad de seguidores del que realizó el re­tweet.
– Likes del tweet al momento de realizarse el re­tweet.
– Fecha del re­tweet
– Un set con los hashtags del tweet.
Sin codificar, indique:
- Cuál es el procesamiento en el mapper y qué clave y valor emite.
- Cuál es el procesamiento y el valor de respuesta del reducer.
- Si se requiere algún procesamiento posterior al reducer para obtener la respuesta final.
Para la siguiente query:
Por cada hashtag cuántas veces fue tweeteado (no retweeteado, solo tweteado).

A

El procesamiento que haría el mapper es le va llegar un (idRetweet, data) y va a emitir por cada hashtag que se tiene en el set de hashtags, el hastag y el id de tweet origen
Luego en el reducer lo que va a pasar es que se va a tener un Set con los id de tweet origen
(para que no haya repetidos) y luego emite el hashtag con el size del set.
No se requiere un procesamiento posterior al reducer para obtener la respuesta final

46
Q

Se codifico un revant de RMI como se indica a continuacion. Donde BidService es una interfaz que cumple con las condiciones para ser remota y solo cuenta con los dos metodos que se ven a continuacion. Idique por que la forma de sincronizacion no es la recomendable excepto en casos muy especificos.

public class BidService implements BidService {

public final synchronized List<String> listActiveAuctions() throws RemoteExeption {...}
public final synchronized boolean bid(String auction, double amount) throws RemoteException{...}
}</String>

A

checkeado:
Ese tipo de sincronizacion hace que el servicio sea serial y no pueda recibir llamados concurrentes. Cada cliente tiene que esperar que todos los que llegaron antes terminen. Esto se hace que el servicio no sea eficiente en la mayoria de los casos. Donde se puede justificar ese tipo de sincronizavion es cuando los metodos son realmente simples, no tarden nada y hagan pocas operaciones. Por ejemplo actualizar una variable de instancia y volver

47
Q

Dentro de un sistema se reciben las notificaciones de los re­tweets realizados para una campaña a partir de un criterio de busqueda (cierto hashtag, por ejemplo). Al terminar la misma, las notificaciones obtenidas son enviadas a un sistema map­reduce para su procesamiento y obtener estadísticas. El proceso entonces recibe en el mapper:
- Como clave el id del re­tweet.
- Como valor los siguientes datos:
– screen name del usuario que realizó el re­tweet
– Id del tweet original re­tweeteado.
– Screen name del autor del tweet.
– Cantidad de seguidores del autor del tweet.
– El país donde se realizó el tweet.
– Cantidad de seguidores del que realizó el re­tweet.
– Likes del tweet al momento de realizarse el re­tweet.
– Fecha del re­tweet
– Un set con los hashtags del tweet.
Sin codificar, indique:
- Cuál es el procesamiento en el mapper y qué clave y valor emite.
- Cuál es el procesamiento y el valor de respuesta del reducer.
- Si se requiere algún procesamiento posterior al reducer para obtener la respuesta final.
Para la siguiente query:
El ranking de tweets por su cantidad de likes (Aclaración: un retweet no tiene likes, solo el tweet original y supongamos que no se puede “unlikear”).

A

checkeado:
Mapper:
Se emite como clave el tweet original y como valor la cantidad de likes del mismo.
El reducer:
Conserva el valor mayor de likes para el tweet que tiene asignado, al finalizar su trabajo emite ese valor como la cantidad de likes para el tweet detectado.
Post proceso:
Se requiere ordenar la lista completa por cantidad de likes para obtender el ranking
Alternativa: al valor se puede agregar la fecha del re-tweet, en este caso se guarda la fecha mayor y el valor de ese momento (esto permitiría que funcione aún si hay unlike)

48
Q

Indicar Verdadero o Falso La siguiente interfaz puede ser utilizada para un
servicio remoto

pubilc interface Service extends Remote {
public doible getTime() throws RemoteException;
public String echo(String message) thrwos RemoteException;
public double add(int number1, int number2) throws RemoteException;
}

A

Verdadero

49
Q

Una empresa que distribuye sus productos en distintas ciudades del mundo cuenta con datos correspondientes a las ventas que se registraron durante cierto periodo en las mismas. Cada valor del conjunto tiene la siguiente estructura:
“dd.mm.yyyy-ciudad” valorMontoVenta
Ejemplo: ‘10/10/2015-CABA’ 4000.30 significa que el 10 de Octubre de 2015 en la ciudad de Buenos Aires las ventas fueron de 4000.30 pesos. Y hay un “registro” unico para cada par dia ciudad.
Sin codificar, indique en palabras:
a- cuales serian el comportamiento del Mapper y la clave y el valor que emite?
b- cual seria el comportamiento del Reducer para obtener el valor final?

Para la siguiente query:
Calcule para cada ciudad cual fue el año con mayor monto de ventas

Aclaracion
Es una estadistica por lo se puede tomar que todos los años tiene 365 dias (no hay biciestos)

A

checkeado:
Mapper:
Emite como clave: la ciudad y como valor un par año (extraido de la fecha) y monto de ventas.
Reducer:
El reducer acumula en un mapa con clave el año y con valor la suma de los montos para dicho año.
Al finalizar:
El reducer emite el año con mayor monto de los que están en el mapa (recorre el mismo bucando la clave con mayor valor.
Alternativa: Emitir ciudad y año como clave y como valor montos. El reducer suma los motos y los emite y en un post proceso se selecciona para cada ciudad cual es el año con mayor monto