Taller:
“Monta una infraestructura Big Data para tu Empresa”
Urko Zurutuza
Dpto. Electrónica e Informática
Mondragon Goi Eskola Politeknikoa JMA
Mondragon Unibertsitatea
2
Enlaces
• http://bit.ly/big_data_sesion3
• http://bit.ly/ejercicios_bigdata
Agenda
• Día 1: Introducción al Big Data
• Día 2: Instalación de un cluster Cloudera
• Día 3: Ejercicios sobre Cloudera
Índice
1. Ejemplo de MapReduce
2. Creando y editando una base de datos HBase
3. Ingerir datos estructurados con Apache sqoop
4. Consultar datos estructurados con HIVE e Impala
5. El valor del Big Data: datos no estructurados
6. Análisis avanzado con Spark
7. Búsquedas en tiempo real con Solr
8. Creación de un panel de mandos
Consideraciones previas
• Cloudera Quick Start: • http://www.cloudera.com/content/cloudera/en/documen
tation/core/latest/topics/cloudera_quickstart_vm.html
• Dirección Cloudera Manager: http://ip_cloudera:7180
• Dirección Hue: http://ip_cloudera:8888
• Algunos links no son relativos (y erroneamentellevarán a quickstart.cloudera)
Consideraciones previas
• Cuenta (con privilegios sudo):• username: cloudera
• password: cloudera
• La contraseña de root de MySQL es la misma, al igual que Hue y ClouderaManager
• Consideraciones previas
Ejercicio 1: MapReduce
Procesamiento en batch: MapReduce
• Marco para escribir aplicaciones que procesanenormes cantidades de datos de forma paralelaen grandes clusters formados por hardware común.
• MapReduce job• Divide el conjunto de datos de entrada en pedazos
(chunks) que son procesados por tareas “map” de forma paralela.
• Ordena las salidas de los “maps”, que son entrada a las tareas “reduce”.
• Opera sobre pares clave-valor.• No necesariamente en Java.
Procesamiento en batch: MapReduce
, 4
, 2
, 4
, 3
, 4
, 2
, 4
, 3
Split MapShuffle
&
Sort
Reduce
Master
assign
sassigns
Procesamiento en batch: MapReduce
• Ejemplo:
$ bin/hadoop dfs -cat /usr/joe/wordcount/input/file01
Hello World Bye World
$ bin/hadoop dfs -cat /usr/joe/wordcount/input/file02
Hello Hadoop Goodbye Hadoop
Procesamiento en batch: MapReduce
• Mapper: • procesa cada línea (cada línea un map)• Divide en tokens separados por espacios (palabras)• Emite un conjunto de claves-valor, en modo <palabra, 1>
• Map 1:• < Hello, 1>
• < World, 1>
• < Bye, 1>
• < World, 1>
• Map 2:• < Hello, 1>
• < Hadoop, 1>
• < Goodbye, 1>
• < Hadoop, 1>
Procesamiento en batch: MapReduce
• Combiner:• Cada map se ordena y genera agregados locales:
• Salida del primer Map:• < Bye, 1>
• < Hello, 1>
• < World, 2>
• Salida del segundo Map:• < Goodbye, 1>
• < Hadoop, 2>
• < Hello, 1>
Procesamiento en batch: MapReduce
• Reducer:• Suma los valores (ocurrencias de cada clave):
• < Bye, 1>
• < Goodbye, 1>
• < Hadoop, 2>
• < Hello, 2>
• < World, 2>
Ejercicio
• WordCount
• Documento ejercicios.doc
18
Ejercicio 1: Archivos de entrada
19
Ejercicio 1: ejecuciónMapReduce
[cloudera@quickstart ~]$ hadoop jar wordcount.jar org.myorg.WordCount /user/cloudera/wordcount/input
/user/cloudera/wordcount/output
16/06/29 10:21:52 INFO client.RMProxy: Connecting to ResourceManager at /0.0.0.0:8032
16/06/29 10:21:52 INFO client.RMProxy: Connecting to ResourceManager at /0.0.0.0:8032
16/06/29 10:21:52 WARN mapreduce.JobResourceUploader: Hadoop command-line option parsing not performed. Implement the Tool
interface and execute your application with ToolRunner to remedy this.
16/06/29 10:21:52 INFO mapred.FileInputFormat: Total input paths to process : 2
16/06/29 10:21:53 INFO mapreduce.JobSubmitter: number of splits:3
16/06/29 10:21:53 INFO mapreduce.JobSubmitter: Submitting tokens for job: job_1467220526122_0001
16/06/29 10:21:53 INFO impl.YarnClientImpl: Submitted application application_1467220526122_0001
16/06/29 10:21:53 INFO mapreduce.Job: The url to track the job:
http://quickstart.cloudera:8088/proxy/application_1467220526122_0001/
16/06/29 10:21:53 INFO mapreduce.Job: Running job: job_1467220526122_0001
16/06/29 10:22:03 INFO mapreduce.Job: Job job_1467220526122_0001 running in uber mode : false
16/06/29 10:22:03 INFO mapreduce.Job: map 0% reduce 0%
16/06/29 10:22:17 INFO mapreduce.Job: map 33% reduce 0%
16/06/29 10:22:19 INFO mapreduce.Job: map 67% reduce 0%
16/06/29 10:22:20 INFO mapreduce.Job: map 100% reduce 0%
16/06/29 10:22:25 INFO mapreduce.Job: map 100% reduce 100%
16/06/29 10:22:25 INFO mapreduce.Job: Job job_1467220526122_0001 completed successfully
16/06/29 10:22:25 INFO mapreduce.Job: Counters: 49
File System Counters
FILE: Number of bytes read=79
FILE: Number of bytes written=455843
FILE: Number of read operations=0
FILE: Number of large read operations=0
FILE: Number of write operations=0
HDFS: Number of bytes read=410
HDFS: Number of bytes written=41
HDFS: Number of read operations=12
HDFS: Number of large read operations=0
HDFS: Number of write operations=2
20
Ejercicio 1: ejecuciónMapReduceJob Counters
Launched map tasks=3
Launched reduce tasks=1
Data-local map tasks=3
Total time spent by all maps in occupied slots (ms)=36685
Total time spent by all reduces in occupied slots (ms)=5500
Total time spent by all map tasks (ms)=36685
Total time spent by all reduce tasks (ms)=5500
Total vcore-seconds taken by all map tasks=36685
Total vcore-seconds taken by all reduce tasks=5500
Total megabyte-seconds taken by all map tasks=37565440
Total megabyte-seconds taken by all reduce tasks=5632000
Map-Reduce Framework
Map input records=2
Map output records=8
Map output bytes=82
Map output materialized bytes=91
Input split bytes=357
Combine input records=8
Combine output records=6
Reduce input groups=5
Reduce shuffle bytes=91
Reduce input records=6
Reduce output records=5
Spilled Records=12
Shuffled Maps =3
Failed Shuffles=0
Merged Map outputs=3
GC time elapsed (ms)=445
CPU time spent (ms)=1970
Physical memory (bytes) snapshot=762191872
Virtual memory (bytes) snapshot=6006784000
Total committed heap usage (bytes)=557592576
21
Ejercicio 1: ejecuciónMapReduce
Shuffle Errors
BAD_ID=0
CONNECTION=0
IO_ERROR=0
WRONG_LENGTH=0
WRONG_MAP=0
WRONG_REDUCE=0
File Input Format Counters
Bytes Read=53
File Output Format Counters
Bytes Written=41
22
Ejercicio 1: Archivos de salida
23
Ejercicio 1: resultado
[cloudera@quickstart ~]$ hadoop fs -cat /user/cloudera/wordcount/output/part-
00000
Bye 1
Goodbye 1
Hadoop 2
Hello 2
World 2
Ejemplo HBase
HBase
• Qué es Hbase?• En Hbase los datos se almacenan en tablas, las cuales
tienen filas y columnas… pero mejor verlo como un mapa u objeto multidimensional
• Una tabla de Hbase contiene multiples filas.
• Una fila de datos tiene una clave ordenable y un número arbitrario de columnas. La tabla se almacenade forma dispersa, de modo que las filas de unamisma tabla pueden tener columnas tan variadascomo se quiera.
HBase
• Map: filas de datos
{
"zzzzz" : "woot",
"xyz" : "hello",
"aaaab" : "world",
"1" : "x",
"aaaaa" : "y"
}
HBase
• Sorted Map: filas ordenadas por la clave
{
"1" : "x",
"aaaaa" : "y",
"aaaab" : "world",
"xyz" : "hello",
"zzzzz" : "woot"
}
HBase
• Multidimensional: familias de columnas por cadafila{
"1" : {
"A" : "x",
"B" : "z"
},
"aaaaa" : {
"A" : "y",
"B" : "w"
},
"aaaab" : {
"A" : "world",
"B" : "ocean"
},
"xyz" : {
"A" : "hello",
"B" : "there"
},
"zzzzz" : {
"A" : "woot",
"B" : "1337"
}
}
HBase
• Multidimensional: una familia de columnas puedetener varias columnas, identificadas por unaetiqueta o qualifier{
// ...
"aaaaa" : {
"A" : {
"foo" : "y",
"bar" : "d"
},
"B" : {
"" : "w"
}
},
"aaaab" : {
"A" : {
"foo" : "world",
"bar" : "domination"
},
"B" : {
"" : "ocean"
}
},
// ...
}
HBase
• Multidimensional: timestamp{
// ...
"aaaaa" : {
"A" : {
"foo" : {
15 : "y",
4 : "m"
},
"bar" : {
15 : "d",
}
},
"B" : {
"" : {
6 : "w"
3 : "o"
1 : "w"
}
}
},
// ...
}
Ejemplo con HBase
Ejemplo con HBase
33
Ejemplo con HBase
34
Ejemplo con HBase
35
Ejemplo con HBase
36
Ejemplo con HBase
37
Ejemplo con HBase
38
Ejemplo con HBase
39
Ejemplo con HBase
40
Ejemplo con HBase
41
Ejemplo con HBase
42
Ejercicio 2: Ingerir datos estructurados
Un paseo por la potencia de Big Data
• Imaginemos que somos el “Data Specialist” de una corporación
• El análisis de los datos debe responder a preguntas concretas
Definir una pregunta de Negocio
• Sin una pregunta bien definida:• No sabremos como modelar los datos
• Qué estructuras de datos aplicar
• Qué conjuntos de datos deberemosobtener
• Qué herramientas necesitaremos
Ingerir datos estructurados
• Pregunta de Negocio: “Qué productos les gustacomprar a nuestros clientes?”
• Esta información se guarda por lo general en unabase de datos Transaccional, la cual nos dirá quéclientes compran y quienes no cada producto.
• Necesitamos ingerir los datos de una BBDD en HDFS
sqoop
Ingerir datos estructurados
• Sqoop nos permite cargar los datos de MySQL en HDFS, preservando la estructura de las tablas.
• Con unos parámetros extra, podremos cargarlosen un formato (avro) que podrá luego ser utilizadopor Impala
Ingerir datos estructurados: sqoop
tablas tablasFicheros
distribuidos
BBDD Relacional
BBDD RelacionalHDFS
Tratamiento
(Map-Reduce) (Map-Reduce)
(Map-Reduce)
Ejercicio 2: Ingerir datos estructurados: sqoop
• Pasos:1. Importar todas las tablas desde MySQL a
HDFS.
2. Sqoop generará los esquemas de cada tabla.Copiar estos esquemas a HDFS para queHIVE los tenga disponibles.
3. Arrancamos Hive y definimos las tablas. Dosopciones: (1) desde la línea de comandos y(2) desde la interfaz web.
4. Mostramos las tablas
50
Ingerir datos estructurados
(Mirar Documento)
[[email protected] ~] sqoop import-all-tables \
-- num-mappers 1 \
--connect jdbc:mysql://quickstart.cloudera:3306/retail_db \
--username=retail_dba \
--password=cloudera \
--compression-codec=snappy \
--as-avrodatafile \
--warehouse-dir=/user/hive/warehouse/userXX
Ejercicio 2: Ingerir datos estructurados: sqoop
52
Ejercicio 2: Ingerir datos estructurados: sqoop
53
Ejercicio 2: Definir las tablas: Hive
54
Ejercicio 2: Definir las tablas: Hive
55
Ejercicio 2: Definir las tablas: Hive
56
Ejercicio 2: Mostrar las tablas: Hive
57
Ingerir datos estructurados
Ejercicio 3: Consultar datos estructurados
Consultar datos estructurados
• Dos herramientas para hacer consultas SQL en CDH:
• Hive • Traduce las consultas SQL a trabajos MapReduce. • Bueno para trabajos en lote grandes, aplicando
transformaciones de forma flexible.
• Impala• Significativamente más rápido y preparado para tener
baja latencia para consultas interectivas y exploraciónde datos.
• Ambos comparten los metadatos sobre las tablas
Consultar datos estructurados
• Ejemplo en HIVE:[cloudera@quickstart ~]$ hive
CREATE EXTERNAL TABLE categories
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.avro.AvroSerDe'
STORED AS INPUTFORMAT 'org.apache.hadoop.hive.ql.io.avro.AvroContainerInputFormat'
OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.avro.AvroContainerOutputFormat'
LOCATION 'hdfs:///user/hive/warehouse/categories'
TBLPROPERTIES ('avro.schema.url'='hdfs://quickstart.cloudera/user/urko/sqoop_import_categories.avsc');
categories, customers, departments, orders, order_items, productsshow tables;
exit;
Consultar datos estructurados
• Hemos transferido datos estructurados de unabase de datos relacional a HDFS
• Lo hemos transformado en formato Avro
• Hemos creado tablas HIVE, preparadas para serconsultadas mediante Impala o consultas porlotes de HIVE.
• Vamos a consultarlos!
Ejercicio 3: Consultar losdatos
63
Consultar datos estructurados
Ejercicio 3: Consultar los datos
Mostrar las categorias de producto más popularesselect c.category_name, count(order_item_quantity) as count
from order_items oi
inner join products p on oi.order_item_product_id = p.product_id
inner join categories c on c.category_id = p.product_category_id
group by c.category_name
order by count desc limit 10;
65
Ejercicio 3: Consultar losdatos
66
Ejercicio 3: Consultar losdatos
67
Ejercicio 3: Consultar losdatos
68
Ejercicio 3: Consultar los datos
Mostrar los 10 productos más satisfactoriosselect p.product_id, p.product_name, r.revenue
from products p inner join (select oi.order_item_product_id,
sum(cast(oi.order_item_subtotal as float)) as revenue from
order_items oi inner join orders o on oi.order_item_order_id =
o.order_id where o.order_status <> 'CANCELED' and o.order_status
<> 'SUSPECTED_FRAUD' group by order_item_product_id) r on
p.product_id = r.order_item_product_id order by r.revenue desc
limit 10;
69
Ejercicio 3: Consultar losdatos
70
Ejercicio 4: El valor del Big Data
El valor del Big Data
• Hasta ahora, el resultado no es nuevo: SQL!
• Pregunta de negocio: “son los productos másvistos los más vendidos?”
• Devemos correlacionar datos estructurados con otros no estructurados:
• Usando Web logs, podremos ver los productos másvistos
• Para ingerir flujos de clicks: Flume
El valor del Big Data
• Flume: un framework de tiempo real y escalablepara encaminar, filtrar, agregar, y realizarpequeñas operaciones sobre datos
• Para este ejercicio, ya tenemos recopilados un conjunto de datos de acceso web en /opt/examples/log_data/access.log.2
El valor del Big Data
Ejercicio 4: El valor del Big Data
• Cargar los datos de log a HDFS:
[cloudera@quickstart ~]$ hadoop fs -copyFromLocal /opt/examples/log_files/access.log.2
/user/hive/warehouse/original_access_logs
• Entrar en HIVE:
[cloudera@quickstart ~]$ hive
75
Ejercicio 4: El valor del Big Data
• Crear una tabla en Hive, y consultarla mediante Impala o Hive
CREATE EXTERNAL TABLE intermediate_access_logs (
ip STRING,
date STRING,
method STRING,
url STRING,
http_version STRING,
code1 STRING,
code2 STRING,
dash STRING,
user_agent STRING)
ROW FORMAT SERDE 'org.apache.hadoop.hive.contrib.serde2.RegexSerDe'
WITH SERDEPROPERTIES (
"input.regex" = "([^ ]*) - - \\[([^\\]]*)\\] \"([^\ ]*) ([^\ ]*) ([^\ ]*)\" (\\d*) (\\d*) \"([^\"]*)\" \"([^\"]*)\"",
"output.format.string" = "%1$s %2$s %3$s %4$s %5$s %6$s %7$s %8$s %9$s"
)
LOCATION '/user/hive/warehouse/original_access_logs';
76
Ejercicio 4: El valor del Big Data
• Crear una tabla en Hive, y consultarla mediante Impala o Hive
CREATE EXTERNAL TABLE tokenized_access_logs (
ip STRING,
date STRING,
method STRING,
url STRING,
http_version STRING,
code1 STRING,
code2 STRING,
dash STRING,
user_agent STRING)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
LOCATION '/user/hive/warehouse/tokenized_access_logs';
ADD JAR /usr/lib/hive/lib/hive-contrib.jar;
INSERT OVERWRITE TABLE tokenized_access_logs SELECT * FROM intermediate_access_logs;
Exit;
77
El valor del Big Data
El valor del Big Data
El valor del Big Data
El valor del Big Data
El valor del Big Data
Uno de los productos másvistos no está entre los máscomprados!!
El valor del Big Data
• La correlación entre ambos datos permitiódetectar un error en el precio mostrado para el producto “Adidas Kids’ RG III Mid Football Cleat”. Una vez corregido, las ventas del productoempezaron a crecer rápidamente ;)
Ejercicio 5: Advanced Analytics
Advanced Analytics
• Pregunta de negocio: ¿Qué productos se suelencomprar de forma conjunta?
• La respuesta podría ayudar a:• Optimizar campañas de marketing, posicionando
productos de forma conjunta
• Podrían utilizarlo para mejorar ventas de productosmenos vistos
• Una herramienta que permite realizar análisisrápidos sobre relaciones de objetos es Apache Spark
Ejercicio 5: Advanced Analytics
• Apache Spark
86
Ejercicio 5: Advanced Analytics
• Generamos un trabajo en Spark
[cloudera@quickstart ~]$ spark-shell --jars
/usr/lib/avro/avro-mapred.jar --conf
spark.serializer=org.apache.spark.serializer.KryoSerializer
87
Ejercicio 5: Advanced Analytics
88
Advanced Analytics
// First we're going to import the classes we need and open some of the files
// we imported from our relational database into Hadoop with Sqoop
import org.apache.avro.generic.GenericRecord
import org.apache.avro.mapred.{AvroInputFormat, AvroWrapper}
import org.apache.hadoop.io.NullWritable
val warehouse = "hdfs://quickstart.cloudera/user/hive/warehouse/"
val order_items_path = warehouse + "order_items"
val order_items = sc.hadoopFile[AvroWrapper[GenericRecord], NullWritable, AvroInputFormat[GenericRecord]](order_items_path)
val products_path = warehouse + "products"
val products = sc.hadoopFile[AvroWrapper[GenericRecord], NullWritable, AvroInputFormat[GenericRecord]](products_path)
Advanced Analytics
// Next, we extract the fields from order_items and products that we care about
// and get a list of every product, its name and quantity, grouped by order
val orders = order_items.map { x => (
x._1.datum.get("order_item_product_id"),
(x._1.datum.get("order_item_order_id"), x._1.datum.get("order_item_quantity")))
}.join(
products.map { x => (
x._1.datum.get("product_id"),
(x._1.datum.get("product_name")))
}
).map(x => (
scala.Int.unbox(x._2._1._1), // order_id
(
scala.Int.unbox(x._2._1._2), // quantity
x._2._2.toString // product_name
)
)).groupByKey()
Advanced Analytics
// Finally, we tally how many times each combination of products appears
// together in an order, and print the 10 most common combinations.
val cooccurrences = orders.map(order =>
(
order._1,
order._2.toList.combinations(2).map(order_pair =>
(
if (order_pair(0)._2 < order_pair(1)._2) (order_pair(0)._2, order_pair(1)._2) else (order_pair(1)._2, order_pair(0)._2),
order_pair(0)._1 * order_pair(1)._1
)
)
)
)
val combos = cooccurrences.flatMap(x => x._2).reduceByKey((a, b) => a + b)
val mostCommon = combos.map(x => (x._2, x._1)).sortByKey(false).take(10)
println(mostCommon.deep.mkString("\n"))
Advanced Analytics
Ejercicio 6: Buscando en un mar de datos
buscando en un mar de datos
• Los logs pueden ser una fuente imprescindible de información
• Vamos a ser capaces de explorar de forma interactiva eventos de Log Web, indexando los datos, y haciendo que puedan ser buscados
• Vamos a extender Apache Flume anterior, de modo que ademas de ingerir logs, enviará los eventos a Apache Solr para su indexación en tiempo real
buscando en un mar de datos
• Flume
• Solr• Organiza los datos de la misma manera que una BBDD SQL.
• Dada registro se llama “document”, y contiene campos definidos en un esquema
• Un conjunto de documentos forman una colección.
• Es menos estricto en cuanto a la estructura:• Campos opcionales• Flexibilidad en las consultas de texto
Ingestión de Datos en streaming: Apache Flume
• Servicio distribuido y fiable para recopilar, agregary mover grandes volúmenes de datos (de log) de forma eficiente
• De muchas y variadas fuentes de logs a un lugarcentralizado de almacenamiento de datos (ej. Hadoop)
• Cuando los datos se generan de forma continua
• No solo logs, también sirve para p.e. datos de tráfico de red, datos generados por social media, emails, …
Ingestión de Datos en streaming: Apache Flume
• Una fuente externa envía eventos a un agenteFlume, en un formato que Flume puedareconocer.
• El evento se guarda en el canal, hasta que es consumido por el embudo (Sink)
• El Sink quita el evento del canal y lo pone en un repositorio externo o en otro origen de Flume
Ingestión de Datos en streaming: Apache Flume
Ingestión de Datos en streaming: Apache Flume
• Origenes Flume:• Avro
• Thrift
• Exec (el resultado de la ejecución de un comando Unix)
• Un directorio a la espera de nuevos ficheros y sus contenidos
• NetCat
• Syslog
• HTTP
Ingestión de Datos en streaming: Apache Flume
• Canales Flume:• Memoria
• JDBC
• Fichero
• …
Ingestión de Datos en streaming: Apache Flume
• Sinks Flume:• HDFS
• Avro
• Thrift
• IRC
• Fichero
• Hbase
• …
Ingestión de Datos en streaming: Apache Flume
• Miramos la configuracion de flume:
cd /opt/examples/flume
buscando en un mar de datos
• Crear el índice de búsqueda:
solrctl --zk quickstart.cloudera:2181/solr instancedir --generate solr_configs
• Generar los ficheros de configuración:
<fields>
<field name="_version_" type="long" indexed="true" stored="true" multiValued="false" />
<field name="id" type="string" indexed="true" stored="true" required="true" multiValued="false" />
<field name="ip" type="text_general" indexed="true" stored="true"/>
<field name="request_date" type="date" indexed="true" stored="true"/>
<field name="request" type="text_general" indexed="true" stored="true"/>
<field name="department" type="string" indexed="true" stored="true" multiValued="false"/>
<field name="category" type="string" indexed="true" stored="true" multiValued="false"/>
<field name="product" type="string" indexed="true" stored="true" multiValued="false"/>
<field name="action" type="string" indexed="true" stored="true" multiValued="false"/>
</fields>
Ejercicio 6: Buscando en un mar de datos
• Cargamos la configuración (y morplines.conf)[cloudera@quickstart ~]$ cd /opt/examples/flume
[cloudera@quickstart ~]$ solrctl --zkquickstart.cloudera:2181/solr instancedir --create live_logs./solr_configs
• Creamos la colección[cloudera@quickstart ~]$ solrctl --zkquickstart.cloudera:2181/solr collection --create live_logs -s 1
• Arrancamos el agente flume[cloudera@quickstart ~]$ start_logs
[cloudera@quickstart ~]$ flume-ng agent --conf /opt/examples/flume/conf --conf-file /opt/examples/flume/conf/flume.conf --name agent1 -Dflume.root.logger=DEBUG,INFO,console
104
buscando en un mar de datos
buscando en un mar de datos
buscando en un mar de datos
Ejercicio 6: Buscando en un mar de datos
108
buscando en un mar de datos
Ejercicio 7: Creando un panel de mandos
Creando un panel de mandos
• Las búsquedas son rápidas, pero aún es fácilperdernos
• Vamos a crear un panel de mandos para analizarel comportamiento de las visitas Web en tiemporeal.
Ejercicio 6: Creando un panel de mandos
112
Ejercicio 6: Creando un panel de mandos
Arrastrar a estazona gris
Seleccionarrequest_date
113
Ejercicio 6: Creando un panel de mandos
114
Ejercicio 6: Creando un panel de mandos
Seleccionar un intervalo de +10 minutos
115
Ejercicio 6: Creando un panel de mandos
1.- Seleccionar un layout de 2 columnas
2.- Arrastrar un pie chart
116
Ejercicio 6: Creando un panel de mandos
3.- Seleccionardepartment
117
Ejercicio 6: Creando un panel de mandos
1.- Arrastrar gráfico de tipo facet a la columnaizquierda
2.- Seleccionarproduct
118
Ejercicio 6: Creando un panel de mandos
119
Ejercicio 6: Creando un panel de mandos
Terminamos la edición
Guardamos el panel
30/06/2016 Iñaki Garitano - Taller Big Data 120
Acabando…
• Ideas?
• Es útil?
• Vas a por ello?
• ESKERRIK ASKO!!
Eskerrik asko
www.mondragon.edu
Urko Zurutuza
Mondragon Unibertsitatea
https://es.linkedin.com/in/uzurutuz
a/
@urkovain