Está en la página 1de 16

Laboratorio # 1 GCP

Laren Osorio Toribio


losoriot@uni.pe

CASO TELCO

Objetivo
Explorar la base Telco llamada cellsegmentacion.csv, almacenar en un directorio distribuido
HDFS, crear base de metadatos en HIVE y realizar consultas mediante HiveQL

Procedimiento
1. Análisis Exploratorio de los datos:
Se utiliza Facets:
a. https://pair-code.github.io/facets/
b. Data: cellsegmentacion.csv
c. Objetivo: Cargar los datos y explorar mediante gráficas.
ENTORNO LOCAL (LINUX)

Configuración del espacio de trabajo


1. Crear el cluster Hadoop en Cloud Dataproc.
a. Ir a la consola de GCP
b. Hacer click en las 3 líneas horizontales y buscar el servicio de Cloud
Dataproc, o también se puede utilizar el buscador de productos y
recursos(lupa)
c. Habilitar el API de Cloud Dataproc. En caso se encuentre habilitada obviar
este paso.
2. Seleccionar la opción CREAR CLUSTER

3. En la configuración del clúster. Como sugerencia utilizar el siguiente nombre:


cluster-dp-<nombre_grupo>-<extension>

En componentes seleccionar:

● Habilitar puerta de enlace de componentes


● Seleccionar los siguientes componentes: Hive, Jupyter Notebook, ZooKeeper
4. Configurar los nodos (Master node, Worker nodes)

5. En administrar seguridad, se debe ingresar la opción: Permitir el acceso a la API a


todos los servicios de Google Cloud en el mismo proyecto

Observación: Como alternativa de creación de un cluster dataproc la línea de comando


gcloud. Su ejecución puede ser a través del Cloud Shell (Virtual Machine) o entorno local a
través del SDK de Google Cloud.
Comando de ejecución:

gcloud beta dataproc clusters create cluster-a2c3 --enable-component-gateway


--region us-central1 --zone us-central1-a --master-machine-type
n1-standard-2 --master-boot-disk-size 100 --num-workers 2
--worker-machine-type n1-standard-2 --worker-boot-disk-size 100
--image-version 2.0-debian10 --optional-components
ANACONDA,HIVE_WEBHCAT,JUPYTER,ZOOKEEPER --scopes
'https://www.googleapis.com/auth/cloud-platform' --project ft-bd-gcp-p1-g1

6. Visualizar las instancias creadas VM Instances en Compute Engine

7. Ingresar al cluster mediante SSH (del master)


Observación:
El entorno local se encuentra en Linux por lo que se utilizará los comandos definidos por
defecto. Por ejemplo, para listar el contenido de un directorio:

$ ls

Para ubicarnos en el entorno Hadoop es necesario utilizar el comando de entrada hdfs dfs,
seguido de los comandos Linux. Por ejemplo, para listar el contenido de un directorio en el
entorno Hadoop, en HDFS:

$ hdfs dfs -ls /

(*) Como se puede ver el contenido de cada entorno es diferente


ENTORNO HADOOP

Comandos básicos
1. Listar el nombre del directorio de trabajo actual
$ pwd

2. Listar el contenido del entorno local:


$ ls -l

3. Listar el contenido del directorio raíz en el entorno Hadoop (HDFS)


$ hdfs dfs -ls /

4. Listar el contenido en el entorno Hadoop:


$ hdfs dfs -ls /user/

5. Crear tres carpetas en HDFS. Ingresar los comandos uno seguido de otro
$ hdfs dfs -mkdir /user/user_<nap>/

$ hdfs dfs -mkdir /user/user_<nap>/test/

$ hdfs dfs -mkdir /user/user_<nap>/hadoop/

Observación:
El campo: user_<nap> es la inicial de tu nombre y apellido, por ejemplo: Laren
Osorio→ user_lot
(*) Esta será usada a la lo largo de la sesión

$ hdfs dfs -mkdir /user/user_lot/


$ hdfs dfs -mkdir /user/user_lot/test/
$ hdfs dfs -mkdir /user/user_lot/hadoop/

6. Listar ahora el contenido de mi directorio en Hadoop:


$ hdfs dfs -ls /user/user_<nap>/

$ hdfs dfs -ls /user/user/user_lot/

7. Eliminar la carpeta test


$ hdfs dfs -rm -r /user/user_<nap>/test
$ hdfs dfs -rm -r /user/user_lot/test

8. Nuevamente, listar el contenido del directorio


$ hdfs dfs -ls /user/user_<nap>/

$ hdfs dfs -ls /user/user_lot/

9. Crear una carpeta dentro de: /user_<nap>/hadoop/ denominada data


$ hdfs dfs -mkdir /user/user_<nap>/hadoop/data

$ hdfs dfs -mkdir /user/user_lot/hadoop/data

10. Nuevamente listamos el contenido del directorio /user_<nap>/hadoop/


$ hdfs dfs -ls /user/user_<nap>/hadoop/

$ hdfs dfs -ls /user/user_lot/hadoop/

11. Subir un archivo al entorno Hadoop (HDFS)


$ hdfs dfs -put /home/<local>/cellsegmentacion.csv/ /user/user_<nap>/hadoop/data/

$ hdfs dfs -put /home/bda/cellsegmentacion.csv/ /user/user_lot/hadoop/data/

Observación:
Para conocer el valor de <local> se debe de introducir el comando pwd en el entorno
Linux

12. Ver todo el contenido de un archivo en el entorno Hadoop


$ hdfs dfs -cat /user/user_<nap>/hadoop/data/cellsegmentacion.csv

$ hdfs dfs -cat /user/user_lot/hadoop/data/cellsegmentacion.csv

13. Ver una parte del contenido del archivo


$ hdfs dfs -tail -f /user/user_<nap>/hadoop/data/cellsegmentacion.csv

$ hdfs dfs -tail -f /user/user_lot/hadoop/data/cellsegmentacion.csv

14. Verificar el tamaño de los archivos subidos


$ hdfs dfs -du -h /user/user_<nap>/hadoop*
$ hdfs dfs -du -h /user/user_lot/hadoop*

15. Ver el peso de las carpetas


$ hdfs dfs -du -s -h '/user/user_<nap>/*'

$ hdfs dfs -du -s -h '/user/user_lot/*'


ENTORNO HIVE

1. Para ingresar al entorno Hive podemos utilizar cualquier de los dos comandos:
$ hive

$ beeline -u jdbc:hive2://

(*) Esta última te ofrece una interfaz más amigable

2. Crear la base de datos


$ create database bd_telco_user_<nap> location '/user/user_<nap>/hadoop/';

$ create database bd_telco_user_lot location '/user/user_lot/hadoop/';

3. Mostrar la base de datos


$ show databases;

4. En la base de datos se deben crear dos tablas


tabla 1 (sin location): tb_cs_user_<nap>_sloc
tabla 2 (con location): tb_cs_user_<nap>_loc

Observación:
● Tablas gestionadas: Por defecto Hive crea tablas gestionadas, donde los ficheros,
metadatos y estadísticas son administrados por procesos internos de Hive.
Una tabla gestionada es guardada en la propiedad hive.metastore.warehouse.dir o en
el directorio hdfs /user/apps/hive/warehouse/dbname.db/tablename/.
Si una tabla gestionada es borrada, los datos y los metadatos asociados a la tabla o
partición son borrados.

● Tablas externas: Las tablas externas tienen sus metadatos o esquemas en ficheros
externos, son archivos que pueden ser accedidos y administrados por procesos
desde fuera de Hive.
Hacen referencia a datos de otras bases de datos. El directorio de las tablas puede
ser dentro de hdfs o file storage.

● Tablas Temporales: Las tablas temporales se almacenan en directorios temporales.


Al cerrar la sesión la tabla desaparece
Tabla 1

CREATE EXTERNAL TABLE IF NOT EXISTS bd_telco_user_<nap>.tb_cs_user_<nap>_sloc


(
region String,
Edad int,
casado String,
jubilado String,
genero int,
minutos_preferido int,
adicionales int,
equipo_dolares int,
minutos_no_preferido int,
internet_gigas int,
fijo int,
largadistancia int,
internetcasa int,
numoculto int,
facturaelect int,
ingreso_miles int
)
COMMENT 'tabla gestionada sin location y serde CSV'
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde'
WITH SERDEPROPERTIES (
"separatorChar" = ",",
"quoteChar"= "\"")
STORED AS TEXTFILE
;

CREATE EXTERNAL TABLE IF NOT EXISTS bd_telco_user_lot.tb_cs_user_lot_sloc


(
region String,
Edad int,
casado String,
jubilado String,
genero int,
minutos_preferido int,
adicionales int,
equipo_dolares int,
minutos_no_preferido int,
internet_gigas int,
fijo int,
largadistancia int,
internetcasa int,
numoculto int,
facturaelect int,
ingreso_miles int
)
COMMENT 'tabla gestionada sin location y serde CSV'
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde'
WITH SERDEPROPERTIES (
"separatorChar" = ",",
"quoteChar"= "\"")
STORED AS TEXTFILE;
Tabla 2

CREATE EXTERNAL TABLE IF NOT EXISTS


bd_telco_user_<nap>.tb_cs_user_<nap>_loc
(
region String,
Edad int,
casado String,
jubilado String,
genero int,
minutos_preferido int,
adicionales int,
equipo_dolares int,
minutos_no_preferido int,
internet_gigas int,
fijo int,
largadistancia int,
internetcasa int,
numoculto int,
facturaelect int,
ingreso_miles int
)
COMMENT 'tabla gestionada con location y serde CSV'
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde'
WITH SERDEPROPERTIES (
"separatorChar" = ",",
"quoteChar"= "\"")
STORED AS TEXTFILE
LOCATION '/user/user_<nap>/hadoop/data/'
;

CREATE EXTERNAL TABLE IF NOT EXISTS bd_telco_user_lot.tb_cs_user_lot_loc


(
region String,
Edad int,
casado String,
jubilado String,
genero int,
minutos_preferido int,
adicionales int,
equipo_dolares int,
minutos_no_preferido int,
internet_gigas int,
fijo int,
largadistancia int,
internetcasa int,
numoculto int,
facturaelect int,
ingreso_miles int
)
COMMENT 'tabla gestionada con location y serde CSV'
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde'
WITH SERDEPROPERTIES (
"separatorChar" = ",",
"quoteChar"= "\"")
STORED AS TEXTFILE
LOCATION '/user/user_lot/hadoop/data/'
;

5. Mostrar la ubicación de la metadata


$ DESCRIBE [FORMATTED|EXTENDED] bd_telco_user_<nap>.tb_cs_user_<nap>_sloc;

$ DESCRIBE [FORMATTED|EXTENDED] bd_telco_user_<nap>.tb_cs_user_<nap>_loc;

$ DESCRIBE FORMATTED bd_telco_user_lot.tb_cs_user_lot_sloc;


$ DESCRIBE FORMATTED bd_telco_user_lot.tb_cs_user_lot_loc;

6. Mostrar los 10 primeros registros de las tablas creadas:


$ select*from bd_telco_user_<nap>.tb_cs_user_<nap>_sloc limit 10;

$ select*from bd_telco_user_<nap>.tb_cs_user_<nap>_loc limit 10;

$ select*from bd_telco_user_lot.tb_cs_user_lot_sloc limit 10;

$ select*from bd_telco_user_lot.tb_cs_user_lot_loc limit 10;

7. Realizar la siguientes consultas sobre la Tabla 2


select
r.region as region,
r.casado as casado,
r.genero as genero,
avg(r.minutos_preferido) as prom_minutos_preferidos
from bd_telco_user_<nap>.tb_cs_user_<nap>_loc as r
group by
r.region,
r.casado,
r.genero;

#####################################################################

select
r.casado as casado,
r.genero as genero,
CASE
WHEN r.region = 'Zona 1' THEN 'Lima'
WHEN r.region = 'Zona 2' THEN 'Callao'
ELSE 'Otras Regiones'
END AS region_zona,
avg(r.minutos_preferido) as prom_minutos_preferidos,
avg(r.adicionales) as prom_min_adicionales,
avg(r.ingreso_miles) as prom_ingreso_miles
from bd_telco_user_<nap>.tb_cs_user_<nap>_loc as r
where r.Edad < 60
group by
r.casado,
r.genero,
r.region;
select
r.region as region,
r.casado as casado,
r.genero as genero,
avg(r.minutos_preferido) as prom_minutos_preferidos
from bd_telco_user_lot.tb_cs_user_lot_loc as r
group by
r.region,
r.casado,
r.genero;

#####################################################################

select
r.casado as casado,
r.genero as genero,
CASE
WHEN r.region = 'Zona 1' THEN 'Lima'
WHEN r.region = 'Zona 2' THEN 'Callao'
ELSE 'Otras Regiones'
END AS region_zona,
avg(r.minutos_preferido) as prom_minutos_preferidos,
avg(r.adicionales) as prom_min_adicionales,
avg(r.ingreso_miles) as prom_ingreso_miles
from bd_telco_user_lot.tb_cs_user_lot_loc as r
where r.Edad < 60
group by
r.casado,
r.genero,
r.region;

8. Crear una tabla particionada

● Particiones: Particionar una tabla significa guardar los datos en


subdirectorios categorizados por los valores de una columna, esto permite a
Hive excluir datos innecesarios cuando tiene que realizar una consulta
Cuando se cree la tabla con particiones, éstas pueden ser estáticas o
dinámicas.

● Estáticas: Las estáticas indican que la partición ya se ha realizado en los


directorios adecuados y pueden pedir a Hive alguna de esas particiones.

● Dinámicas:Utilizamos particiones dinámicas cuando solo sabemos los


valores que va a tener una columna en tiempo de ejecución. Dejamos a Hive
que particione los datos automáticamente. Para disponer de particiones
dinámicas es necesario habilitarlo.

CREATE EXTERNAL TABLE bd_telco_user_<nap>.tb_pt_din_zona_user_<nap>


(
region_zona String,
prom_min_preferidos float,
prom_min_adicionales float,
prom_ing_miles float
)
PARTITIONED BY (region STRING)
STORED AS PARQUET
LOCATION '/user/user_<nap>/hive/telco/tb_part_dinamica';
################################################################

set hive.exec.dynamic.partition.mode=nonstrict;

insert into table bd_telco_user_<nap>.tb_pt_din_zona_user_<nap>


partition(region)
select
CASE
WHEN r.region = 'Zona 1' THEN 'Lima'
WHEN r.region = 'Zona 2' THEN 'Callao'
ELSE 'Otras Regiones'
END AS region_zona,
avg(r.minutos_preferido) as prom_minutos_preferidos,
avg(r.adicionales) as prom_min_adicionales,
avg(r.ingreso_miles) as prom_ingreso_miles,
region
from bd_telco_user_<nap>.tb_cs_user_<nap>_loc as r
where r.Edad < 60
group by
r.region
;

################################################################

select*from bd_telco_<nap>_lot.tb_pt_din_zona_user_lot;

hdfs dfs -ls /user/user_<nap>/hive/telco/tb_part_dinamica

CREATE EXTERNAL TABLE bd_telco_user_lot.tb_pt_din_zona_user_lot_2


(
region_zona String,
prom_min_preferidos float,
prom_min_adicionales float,
prom_ing_miles float
)
PARTITIONED BY (region STRING)
STORED AS PARQUET
LOCATION '/user/user_lot/hive/telco/tb_part_dinamica';

################################################################

set hive.exec.dynamic.partition.mode=nonstrict;

insert into table bd_telco_user_lot.tb_pt_din_zona_user_lot partition(region)


select
CASE
WHEN r.region = 'Zona 1' THEN 'Lima'
WHEN r.region = 'Zona 2' THEN 'Callao'
ELSE 'Otras Regiones'
END AS region_zona,
avg(r.minutos_preferido) as prom_minutos_preferidos,
avg(r.adicionales) as prom_min_adicionales,
avg(r.ingreso_miles) as prom_ingreso_miles,
region
from bd_telco_user_lot.tb_cs_user_lot_loc as r
where r.Edad < 60
group by
r.region
;

################################################################

select*from bd_telco_user_lot.tb_pt_din_zona_user_lot;

hdfs dfs -ls /user/user_lot/hive/telco/tb_part_dinamica


Referencias:
● https://cwiki.apache.org/confluence/display/Hive/CSV+Serde
● https://cwiki.apache.org/confluence/display/Hive/DeveloperGuide#DeveloperGuide-H
iveSerDe
● https://datacadamia.com/db/hive/csv_serde
● https://docs.aws.amazon.com/athena/latest/ug/csv-serde.html

También podría gustarte