Dr. Jose María Alvarez-Rodríguez josem.alvarez@uc3m.es Noviembre 2015
IoT Platform Citizen Data Scientist Machine Learning NLP & Question Answering
...
Sofisticación de métodos para:
...De la empresa Teradata...
Supply Chain
Supply Chain
Policía
Crímenes
Eficiencia energética
...
Grandes Empresas
EBTs
Formación
Investigación
Eventos
Sectores
Varios másteres impulsados por empresas
Batch vs Tiempo real vs Stream
vs
Estructurado vs
Semi-estructurado
No estructurado
Batch
Periódico
Eventos
Cercano a tiempo real
Tiempo real
...
NIST SP 1500-1 -- Volume 1: Definitions
NIST SP 1500-2 -- Volume 2: Taxonomies
MEJORA EN LAS CAPACIDADES DE ALMACENAMIENTO
MAYOR CAPACIDAD DE PROCESAMIENTO
DISPONIBILIDAD DE DATOS
¿Una BBDD relacional tradicional?
¿Un sistema de procesamiento off-line?
¿Un sistema de Inteligencia de Negocio?
¿OLAP y variantes?
...
"Es imposible para un sistema de computación distribuida garantizar al mismo tiempo":
AP: Cassandra y CouchDB
CP: HBase y PAXOS
CA: BBDD relacionales
Las propiedades ACID de las bases de datos relacionales no encajan demasiado bien con las necesidades de un sistema Big Data (almacenar y procesar en ~tiempo real).
Lambda
Kappa
Zetta
IoT-a
Polyglot Processing
Nathan Marz
Procesamiento off-line
Todos los datos
Almacenamiento distribuido
Alta latencia
Basado en Apache Hadoop
Cloudera Impala
...
Indexar y exponer los datos de las distintas vistas
Consultas en tiempo real
Baja-latencia
Flink, Spark, Storm, Impala Cloudera, Dremel (Apache Drill), Hortonworks, etc.
Lenguaje de consulta sobre los datos: Pig, SploutSQL, etc.
Compensar la latencia de Batch layer (hasta que procese los datos y se pueden eliminar de esta vista)
Procesamiento de streams
Tolerancia a fallos
Diseño modular
Computación continua y distribuida
Storm y similares
¿¿??
¿¿??
¿¿??
¿¿??
¿¿??
¿¿??
¿¿??
¿¿??
¿¿??
¿¿??
NIST Big Data Reference Architecture Subgroup |
5. NIST SP 1500-5 -- Volume 5: Architectures White Paper Survey |
6. NIST SP 1500-6 -- Volume 6: Reference Architecture |
Text
Erlang Rocks!
Mantener el diseño simple y evolucionar (personalizar)
Mantener el servidor con carga baja
...
Text
Un modelo de programación...
"Dada una lista de números entre 1 y 50 mostrar sólo los pares"
print filter(lambda x: x % 2 == 0, range(1, 50))
"Calcular la suma de los cuadrados de los números entre 1 y 50"
import operator
reduce(operator.add, map((lambda x: x **2), range(1,50)) , 0)
MapReduce: The Programming Model and Practice,
SIGMETRICS, Tutorials 2009, Google.
Mapping es una función que crea una lista de salida tras la aplicación de un función a cada elemento de la lista de entrada.
Reduce es una función que itera sobre los elementos de entrada para agregarlos en un sólo valor.
(En detalle)
Es un modelo de programación inspirado en programación funcional para resolver problemas mediante un enfoque "divide y vencerás" con procesamiento distribuido y paralelo.
MapReduce: The Programming Model and Practice, SIGMETRICS, Turorials 2009, Google.
MapReduce: The Programming Model and Practice, SIGMETRICS, Turorials 2009, Google.
The Apache Hadoop software library is a framework that allows for the
distributed processing of large data sets across clusters of computers
using simple programming models.
Otro listado: https://hadoopecosystemtable.github.io/
...sobre grandes conjuntos de datos de forma off-line para impulsar procesos on-line.
algunos ejemplos con un dump de Twitter...
class Mapper
method Map(recordid id, record r)
for all term t in record r do
Emit(term t, count 1)
class Reducer
method Reduce(term t, counts [c1, c2,...])
sum = 0
for all count c in [c1, c2,...] do
sum = sum + c
Emit(term t, count sum)
public void map(LongWritable key, Text value, Context context)
throws Exception {
String line = value.toString();
StringTokenizer tokenizer = new StringTokenizer(line);
while (tokenizer.hasMoreTokens()) {
word.set(tokenizer.nextToken());
context.write(word, one);
}
}
public void reduce(Text key, Iterable values, Context context)
throws IOException, InterruptedException {
int sum = 0;
for (IntWritable val : values) {
sum += val.get();
}
context.write(key, new IntWritable(sum));
}
"Dada una lista de tweets en la forma (usuario, fecha y texto) determinar el primer y último comentario de un usuario"
public void map(Object key, Text value, Context context)
throws IOException, InterruptedException, ParseException {
Map parsed = MRDPUtils.parse(value.toString());
String strDate = parsed.get(MRDPUtils.CREATION_DATE);
String userId = parsed.get(MRDPUtils.USER_ID);
if (strDate == null || userId == null) {
return;
}
Date creationDate = MRDPUtils.frmt.parse(strDate);
outTuple.setMin(creationDate);
outTuple.setMax(creationDate);
outTuple.setCount(1);
outUserId.set(userId);
context.write(outUserId, outTuple);
}
public void reduce(Text key, Iterable values,
Context context) throws IOException, InterruptedException {
result.setMin(null);
result.setMax(null);
int sum = 0;
for (MinMaxCountTuple val : values) {
if (result.getMin() == null
|| val.getMin().compareTo(result.getMin()) < 0) {
result.setMin(val.getMin());
}
if (result.getMax() == null
|| val.getMax().compareTo(result.getMax()) > 0) {
result.setMax(val.getMax());
}
sum += val.getCount();}
result.setCount(sum);
context.write(key, result);
}
Dada una lista de tweets en la forma (usuario, fecha y texto) determinar la media del tamaño del comentario por hora del día
public void map(Object key, Text value, Context context)
throws IOException, InterruptedException,ParseException {
Map parsed =
MRDPUtils.parse(value.toString());
String strDate = parsed.get(MRDPUtils.CREATION_DATE);
String text = parsed.get(MRDPUtils.TEXT);
if (strDate == null || text == null) {
return;
}
Date creationDate = MRDPUtils.frmt.parse(strDate);
outHour.set(creationDate.getHours());
outCountAverage.setCount(1);
outCountAverage.setAverage(text.length());
context.write(outHour, outCountAverage);
}
public void reduce(IntWritable key, Iterable values,
Context context) throws IOException, InterruptedException {
float sum = 0;
float count = 0;
for (CountAverageTuple val : values) {
sum += val.getCount() * val.getAverage();
count += val.getCount();
}
result.setCount(count);
result.setAverage(sum / count);
context.write(key, result);
}
SELECT MIN(numcol1), MAX(numcol1),
COUNT(*) FROM table GROUP BY groupcol2;
b = GROUP a BY groupcol2;
c = FOREACH b GENERATE group, MIN(a.numcol1),
MAX(a.numcol1), COUNT_STAR(a);
class Mapper
method Map(recordid id, record r)
field f = extract(r)
if predicate (f)
Emit(recordid id, value(r))
class Reducer
method Reduce(recordid id, values [r1, r2,...])
//Whatever
Emit(recordid id, aggregate (values))
Dada una lista de tweets en la forma (usuario, fecha y texto) determinar los tweets que contienen una determinada palabra.
public void map(Object key, Text value, Context context)
throws IOException, InterruptedException {
Map parsed =
MRDPUtils.parse(value.toString());
String txt = parsed.get(MRDPUtils.TEXT);
String mapRegex = ".*\\b"+context.getConfiguration()
.get("mapregex")+"(.)*\\b.*";
if (txt.matches(mapRegex)) {
context.write(NullWritable.get(), value);
}
}
Dada una lista de tweets en la forma (usuario, fecha y texto) determinar los 5 usuarios que escriben los tweets más largos.
private TreeMap repToRecordMap = new TreeMap();
public void map(Object key, Text value, Context context)
throws IOException, InterruptedException {
Map parsed =
MRDPUtils.parse(value.toString());
if (parsed == null) {return;}
String userId = parsed.get(MRDPUtils.USER_ID);
String reputation = String.valueOf(parsed.get(MRDPUtils.TEXT).length());
//Max reputation if you write tweets longer
if (userId == null || reputation == null) {return;}
repToRecordMap.put(Integer.parseInt(reputation), new Text(value));
if (repToRecordMap.size() > MAX_TOP) {
repToRecordMap.remove(repToRecordMap.firstKey());
}
}
public void reduce(NullWritable key, Iterable values,
Context context) throws IOException, InterruptedException {
for (Text value : values) {
Map parsed = MRDPUtils.parse(value.toString());
repToRecordMap.put(parsed.get(MRDPUtils.TEXT).length(),new Text(value));
if (repToRecordMap.size() > MAX_TOP) {
repToRecordMap.remove(repToRecordMap.firstKey());
}
}
for (Text t : repToRecordMap.descendingMap().values()) {
context.write(NullWritable.get(), t);
}
}
SELECT * FROM table WHERE colvalue < VALUE;
b = FILTER a BY colvalue < VALUE;< VALUE;
Concatenación de trabajos M/R
En otros frameworks ya superado (ej: Flink)
Optimización de los parámetros del algoritmo
Pipelining con otros lenguajes de programación
Patrones más avanzados
Procesamiento en tiempo real
Problemas actuales: imágenes, etc.
PREFIX dbo: <http://dbpedia.org/ontology/>
SELECT ?name ?birth ?description ?person WHERE {
?person dbo:birthPlace :Madrid.
?person <http://purl.org/dc/terms/subject> <http://dbpedia.org/resource/Category:Spanish_writers> .
?person dbo:birthDate ?birth .
?person foaf:name ?name .
?person rdfs:comment ?description .
FILTER (?birth > "1800-01-01"^^xsd:date AND ?birth < "1900-01-01"^^xsd:date).
FILTER (LANG(?description) = 'en') .
}
ORDER BY ?name
PREFIX geo: <http://www.w3.org/2003/01/geo/wgs84_pos#>
PREFIX onto: <http://dbpedia.org/ontology/>
SELECT * WHERE {
?s a onto:Place .
?s geo:lat ?lat .
?s geo:long ?long .
FILTER(
xsd:double(?lat) - xsd:double(40.4) <= 2 && xsd:double(40.4) - xsd:double(?lat) <= 2 &&
xsd:double(?long) - xsd:double(-3.68) <= 2 && xsd:double(-3.68) - xsd:double(?long) <= 2).
?s <http://dbpedia.org/ontology/PopulatedPlace/populationDensity> ?density.
FILTER(xsd:double(?density) > xsd:double(100)).
}
LIMIT 100
Uso del vocabulario GoodRelations para catálogos virtuales
Fuente: Eriksson
vs
Tabla | Grafo |
---|---|
Modelo E/R | Semántica de RDF/OWL |
SQL | SPARQL |
¿Qué es Big Data?
Arquitectura
M/R y Hadoop
Tecnología y frameworks
Web de Datos
Algunas notas personales sobre Big Data
No es sencillo de hacer una gran diferenciación pero caería en los siguientes puntos:
...pero destinados a encontrarse...
http://www.hpcuserforum.com/presentations/tuscon2013/IDCHPDABigDataHPC.pdf
Entender los fundamentos de Big Data (ej: Hadoop, etc.)
Probar y ascender en el conocimiento de herramientas de mayor nivel de abstracción
https://www.mapr.com/services/mapr-academy/course-pricing (estos son caros)
(además de las de Gartner 2015)
Almacén de datos "en crudo" y en sus formatos nativos hasta que son procesados.
Similar a las Cloud Application Management Platforms
Ej: Jupyter
Dependiendo del problema se podrán aplicar las técnicas de forma más exitosa.
La selección debería basarse en innovación tecnológica para un proceso en negocio y no en marketing.
Realmente se debe buscar el problema de negocio y de ahí descender a la solución técnica. Ej: Walmart
Realmente el problema reside en la integración de datos y no en la aplicabilidad de las técnicas
Sobre las herramientas e infraestructura ya se ha comentado y sobre los expertos el problema reside en seleccionar el perfil correcto: estadístic@, ingenier@, etc.
Es muy importante contextualizar el problema de negocio tanto en necesidades como en nuestras capacidades
No es necesario diseñar/implementar una arquitectura desde el inicio, existen muchas herramientas ya disponibles
4x more digital data than all the grains of sand on earth by 2020 #bigdata
https://twitter.com/IBMAnalytics/status/417748100217061377/photo/1