SlideShare uma empresa Scribd logo
1 de 14
Desarrollo con Storm
Desarrollo con Storm
● Recordemos que los componentes de Storm se pueden definir en cualquier
lenguaje de programación
○ Java
○ Ruby
○ Python
○ Javascript
○ Perl
○ ...
Topología simple
TopologyBuilder builder = new TopologyBuilder();
builder.setSpout(“words”, new TestWordSpout(), 10);
builder.setBolt(“exclaim1”, new ExclamationBolt(), 3)
.shuffleGrouping(“words”);
Builder.setBolt(“exclaim2”, new ExclamationBolt(), 2)
.shuffleGrouping(“exclaim1”);
Una topología con 1 Spout y 2 Bolts. El Spout emite palabras y los
Bolts añaden “!!!” al final.
Los métodos set() reciben como parámetro un id de tipo String, un objeto que
contiene la lógica de procesado y el nivel de paralelismo del nodo. El último
parámetro indica el número de hilos que se ejecutan en ese componente.
El objeto de procesado implementa la interfaz IRichSpout para los Spouts e
IRichBolt para los bolts.
Topología simple
TopologyBuilder builder = new TopologyBuilder();
builder.setSpout(“words”, new TestWordSpout(), 10);
builder.setBolt(“exclaim1”, new ExclamationBolt(), 3)
.shuffleGrouping(“words”);
Builder.setBolt(“exclaim2”, new ExclamationBolt(), 2)
.shuffleGrouping(“exclaim1”);
setBolt devuelve un objeto InputDeclarer que se utiliza para definir las entradas en
el bolt. Indicamos que “exclaim1” quiere leer todas las tuplas de “words” utilizando
shuffle grouping y que “exclaim2” quiere leer todas las tuplas de “exclaim1”.
“ShuffleGrouping” indica que las tuplas se distributen de forma
uniformemente aleatoria entre las entrada-salida.
El método importante a implementar es nextTuple().
public void nextTuple() {
// hacemos lo que sea
Utils.sleep(100);
final String[] words = new String[]{“bigData”, “ebd”, “utad”};
final Random rand = new Random();
final String word = words[rand.nextInt(words.length)];
_collector.emit(new Values(word));
}
nextTuple() es invocado de forma periódica en el mismo bucle que los métodos
ack() y fail(). Libera el control del hilo cuando no hay trabajo y permite que se
ejecuten los otros métodos.
Spout
Tiene los siguientes métodos:
public void prepare(Map conf, TopologyContext ctx, OutputCollector c){
_collector = c;
}
Proporciona al bolt un OutputCollector que se utiliza para emitir las
tuplas de este Bolt. Las tuplas se pueden emitir en cualquier parte del
bolt. Es llamado antes de que el bolt empiece a procesar tuplas.
public void execute(Tuple tuple) {
_collector.emit(tuple, new Values(tuple.getString(0) + “!!!”));
_collector.ack(tuple);
}
Procesa una tupla de las entradas del Bolt. En el ejemplo le añade la
cadena “!!!” al string. Si el bolt está subscrito a multiples fuentes de
entrada, se puede determinar el origen con el método
Tuple#getSourceComponen
Bolt
public void cleanup(){}
Este método es invocado cuando se va a apagar el bolt y debería
limpiar ordenadamente los recursos abiertos.
public void declareOutputFields(OutputFieldsDeclarer declarer){
declarer.declare(new Fields(“word”));
}
Este método indica que el bolt emite una tupla con el campo “word”.
Declara el esquema de salida del bolt.
Public Map getComponentConfiguration() {}
Permite configurar aspectos de como se ejecuta el componente.
Bolt
Introducción
La forma más sencilla de crear bolts es extender la clase BaseRichBolt:
public static class ExclamationBolt extends BaseRichBolt {
OutputCollector Mycollector;
public void prepare(Map conf, TopologyContext ctx, OutputCollector collector)
{
Mycollector = collector;
}
public void execute(Tuple tuple) {
Mycollector.emit(tuple, new Values(tuple.getSting(0)+”!!!”));
Mycollector.ack(tuple);
}
public void declareOutputFields(OutputFieldsDeclarer declarer) {
declarer.declare(new Fields(“word”));
}
}
Bolt
Ejemplo: Hola mundo
public class HolaMundoSpout extends BaseRichSpout {
private static final long serialVersionUID = 1L;
private SpoutOutputCollector collector;
private int referenceRandom;
private static final int MAX_RANDOM = 10;
public HolaMundoSpout() {
final Random rand = new Random();
referenceRandom = rand.nextInt(MAX_RANDOM);
}
@Override
public void nextTuple() {
Utils.sleep(100);
final Random rand = new Random();
int instanceRandom = rand.nextInt(MAX_RANDOM);
if (instanceRandom == referenceRandom) {
collector.emit(new Values("Hola Mundo"));
} else {
collector.emit(new Values("Otro Mundo Aleatorio"));
}
}
@Override
public void open(Map conf, TopologyContext context, SpoutOutputCollector collector) {
this.collector = collector;
}
@Override
public void declareOutputFields(OutputFieldsDeclarer declarer) {
declarer.declare(new Fields("sentence"));
}
}
Hola mundo: Spout
El método Open() inicializa el objeto SpoutOutputCollector.
El Spout va a invocar de forma repetida el método nextTuple().
El método declareOutputFields() indica el contenido de las tuplas
enviadas con emit() en el método nextTuple().
Esta clase consume las tuplas producidas e implementa la lógica necesaria.
La creamos dentro del mismo paquete storm.ebd y que herede
de la clase BaseRichBolt. Declaramos una variable miembre privada y
proporcionamos la siguiente implementación para el método execute( ) que realiza
la mayor parte del trabajo.
public void execute(Tuple input) {
String test = input.getStringByField("sentence");
if("Hola Mundo".equals(test)){
myCount++;
System.out.println("Encontrado Hola Mundo!. Contador:" + Integer.toString(myCount));
}
}
Hola mundo: Bolt
public class HolaMundoTopology {
public static void main(String[] args) {
TopologyBuilder builder = new TopologyBuilder();
builder.setSpout("randomHolaMundo", new HolaMundoSpout(), 10);
builder.setBolt("HolaMundoBolt", new HolaMundoBolt(), 2).shuffleGrouping("randomHolaMundo");
Config conf = new Config();
conf.setDebug(true);
if(args != null && args.length > 0) {
conf.setNumWorkers(3);
try {
StormSubmitter.submitTopology(args[0], conf, builder.createTopology());
} catch (AlreadyAliveException e) {
e.printStackTrace();
} catch (InvalidTopologyException e) {
e.printStackTrace();
}
} else {
LocalCluster cluster = new LocalCluster();
cluster.submitTopology("test", conf, builder.createTopology());
Utils.sleep(10000);
cluster.killTopology("test");
cluster.shutdown();
}
}
}
Hola mundo: Topology
Ahora creamos nuestra primera Topology donde
unimos los Spouts y Bolts.
Hola mundo: Ejecucion
El HolaMundoSpout genera un número aleatorio en su constructor y luego en el
método nextTuple() genera números aleatorios y los compara con el que se ha
generado en el constructor. El método nextTuple() emite una sentencia entre
dos posibles: "Hola Mundo", "Otro Mundo Aleatorio" dependiendo de si el
número aleatorio coincide con el generado en el constructor o no.
El bolt simplemente cuenta las apariciones de la frase “Hola Mundo” y muestra
los incrementos
secuenciales
● Desde consola:
mvn compile exec:java-Dexec.classpathScope=compile -
Dexec.mainClass=storm.ebd.HolaMundoTopology
● Se puede empaquetar para enviar al cluster
mvn package
Python
(ns wordcount
(:use [streamparse.specs])
(:gen-class))
(defn wordcount [options]
[
;; spout configuration
{"word-spout" (python-spout-spec
options
"spouts.words.WordSpout"
["word"]
)
}
;; bolt configuration
{"count-bolt" (python-bolt-spec
options
{"word-spout" :shuffle}
"bolts.wordcount.WordCounter"
["word" "count"]
:p 2
)
}
]
)
Importa las funciones de CLojure DSL de Storm

Mais conteúdo relacionado

Mais procurados

Sistema de Mensajeria de Colas con ZeroMQ y Python
Sistema de Mensajeria de Colas con ZeroMQ y PythonSistema de Mensajeria de Colas con ZeroMQ y Python
Sistema de Mensajeria de Colas con ZeroMQ y PythonErnesto Crespo
 
INVESTIGACION DE ELEMENTOS Y CODIGOS DE C++
INVESTIGACION DE ELEMENTOS Y CODIGOS DE C++INVESTIGACION DE ELEMENTOS Y CODIGOS DE C++
INVESTIGACION DE ELEMENTOS Y CODIGOS DE C++Alfredo Rivera
 
Apache Storm: Introduccion
Apache Storm: IntroduccionApache Storm: Introduccion
Apache Storm: IntroduccionStratebi
 
Programando en java
Programando en javaProgramando en java
Programando en javajulianbm60
 
1.4.2 stack segment
1.4.2  stack  segment1.4.2  stack  segment
1.4.2 stack segmentgabo
 
Rooted2020 encontrando 0days-en_2020_-_antonio_morales
Rooted2020 encontrando 0days-en_2020_-_antonio_moralesRooted2020 encontrando 0days-en_2020_-_antonio_morales
Rooted2020 encontrando 0days-en_2020_-_antonio_moralesRootedCON
 
Java scanner para lectura de datos
Java scanner para lectura de datosJava scanner para lectura de datos
Java scanner para lectura de datosFlv Martín
 
Pablo González - Jugando a lo Super Mario entre túneles y máquinas [rooted2018]
Pablo González - Jugando a lo Super Mario entre túneles y máquinas [rooted2018]Pablo González - Jugando a lo Super Mario entre túneles y máquinas [rooted2018]
Pablo González - Jugando a lo Super Mario entre túneles y máquinas [rooted2018]RootedCON
 
Tarea programacion web
Tarea programacion webTarea programacion web
Tarea programacion webErandi23
 

Mais procurados (18)

Sistema de Mensajeria de Colas con ZeroMQ y Python
Sistema de Mensajeria de Colas con ZeroMQ y PythonSistema de Mensajeria de Colas con ZeroMQ y Python
Sistema de Mensajeria de Colas con ZeroMQ y Python
 
Paralela2
Paralela2Paralela2
Paralela2
 
Sincronizacion
SincronizacionSincronizacion
Sincronizacion
 
Hebras En Accion
Hebras En AccionHebras En Accion
Hebras En Accion
 
INVESTIGACION DE ELEMENTOS Y CODIGOS DE C++
INVESTIGACION DE ELEMENTOS Y CODIGOS DE C++INVESTIGACION DE ELEMENTOS Y CODIGOS DE C++
INVESTIGACION DE ELEMENTOS Y CODIGOS DE C++
 
Apache Storm: Introduccion
Apache Storm: IntroduccionApache Storm: Introduccion
Apache Storm: Introduccion
 
Programando en java
Programando en javaProgramando en java
Programando en java
 
1.4.2 stack segment
1.4.2  stack  segment1.4.2  stack  segment
1.4.2 stack segment
 
Diego alexis 8
Diego alexis 8Diego alexis 8
Diego alexis 8
 
Comandos de java
Comandos de javaComandos de java
Comandos de java
 
Rooted2020 encontrando 0days-en_2020_-_antonio_morales
Rooted2020 encontrando 0days-en_2020_-_antonio_moralesRooted2020 encontrando 0days-en_2020_-_antonio_morales
Rooted2020 encontrando 0days-en_2020_-_antonio_morales
 
Paralela9
Paralela9Paralela9
Paralela9
 
Guia final so
Guia final soGuia final so
Guia final so
 
Java scanner para lectura de datos
Java scanner para lectura de datosJava scanner para lectura de datos
Java scanner para lectura de datos
 
Pablo González - Jugando a lo Super Mario entre túneles y máquinas [rooted2018]
Pablo González - Jugando a lo Super Mario entre túneles y máquinas [rooted2018]Pablo González - Jugando a lo Super Mario entre túneles y máquinas [rooted2018]
Pablo González - Jugando a lo Super Mario entre túneles y máquinas [rooted2018]
 
PCJ Sesión 9: Threads
PCJ Sesión 9: ThreadsPCJ Sesión 9: Threads
PCJ Sesión 9: Threads
 
C docx22 (1)
C docx22 (1)C docx22 (1)
C docx22 (1)
 
Tarea programacion web
Tarea programacion webTarea programacion web
Tarea programacion web
 

Semelhante a Apache Storm: Desarrollo

Semelhante a Apache Storm: Desarrollo (20)

Entrega de reporte no 1, lab 1
Entrega de reporte no 1, lab 1Entrega de reporte no 1, lab 1
Entrega de reporte no 1, lab 1
 
Workshop iOS 4: Closures, generics & operators
Workshop iOS 4: Closures, generics & operatorsWorkshop iOS 4: Closures, generics & operators
Workshop iOS 4: Closures, generics & operators
 
Tarea sesion 08_gottlieb
Tarea sesion 08_gottliebTarea sesion 08_gottlieb
Tarea sesion 08_gottlieb
 
Desarrollo De Programas Ejemplos 01
Desarrollo De Programas Ejemplos 01Desarrollo De Programas Ejemplos 01
Desarrollo De Programas Ejemplos 01
 
Desarrollo de programas_ejemplos_01
Desarrollo de programas_ejemplos_01Desarrollo de programas_ejemplos_01
Desarrollo de programas_ejemplos_01
 
Sincronizar Threads
Sincronizar ThreadsSincronizar Threads
Sincronizar Threads
 
Reporte de grafos con semagforos de 3,3,4 y 6 procesos
Reporte de grafos con semagforos de 3,3,4 y 6 procesosReporte de grafos con semagforos de 3,3,4 y 6 procesos
Reporte de grafos con semagforos de 3,3,4 y 6 procesos
 
Chap 15bpin
Chap 15bpinChap 15bpin
Chap 15bpin
 
Programación en c++
Programación en c++Programación en c++
Programación en c++
 
Creacion de proyecto_en_netbeans
Creacion de proyecto_en_netbeansCreacion de proyecto_en_netbeans
Creacion de proyecto_en_netbeans
 
Java ArrayList Iterator
Java ArrayList IteratorJava ArrayList Iterator
Java ArrayList Iterator
 
procesos
procesosprocesos
procesos
 
Separata java script
Separata java scriptSeparata java script
Separata java script
 
Programación en OTcl
Programación en OTclProgramación en OTcl
Programación en OTcl
 
Java básico
Java  básicoJava  básico
Java básico
 
6 Upv Solo Pruebas 2009
6 Upv Solo Pruebas 20096 Upv Solo Pruebas 2009
6 Upv Solo Pruebas 2009
 
Multitarea e hilos en java con ejemplos
Multitarea e hilos en java con ejemplosMultitarea e hilos en java con ejemplos
Multitarea e hilos en java con ejemplos
 
C# calculadora
C# calculadoraC# calculadora
C# calculadora
 
Informe tecnico unidad 4
Informe tecnico unidad 4Informe tecnico unidad 4
Informe tecnico unidad 4
 
Unidad iii pilas y colas
Unidad iii pilas y colasUnidad iii pilas y colas
Unidad iii pilas y colas
 

Mais de Stratebi

Destinos turisticos inteligentes
Destinos turisticos inteligentesDestinos turisticos inteligentes
Destinos turisticos inteligentesStratebi
 
Azure Synapse
Azure SynapseAzure Synapse
Azure SynapseStratebi
 
Options for Dashboards with Python
Options for Dashboards with PythonOptions for Dashboards with Python
Options for Dashboards with PythonStratebi
 
Dashboards with Python
Dashboards with PythonDashboards with Python
Dashboards with PythonStratebi
 
PowerBI Tips y buenas practicas
PowerBI Tips y buenas practicasPowerBI Tips y buenas practicas
PowerBI Tips y buenas practicasStratebi
 
Machine Learning Meetup Spain
Machine Learning Meetup SpainMachine Learning Meetup Spain
Machine Learning Meetup SpainStratebi
 
LinceBI IIoT (Industrial Internet of Things)
LinceBI IIoT (Industrial Internet of Things)LinceBI IIoT (Industrial Internet of Things)
LinceBI IIoT (Industrial Internet of Things)Stratebi
 
SAP - PowerBI integration
SAP - PowerBI integrationSAP - PowerBI integration
SAP - PowerBI integrationStratebi
 
Aplicaciones Big Data Marketing
Aplicaciones Big Data MarketingAplicaciones Big Data Marketing
Aplicaciones Big Data MarketingStratebi
 
A federated information infrastructure that works
A federated information infrastructure that works A federated information infrastructure that works
A federated information infrastructure that works Stratebi
 
9 problemas en proyectos Data Analytics
9 problemas en proyectos Data Analytics9 problemas en proyectos Data Analytics
9 problemas en proyectos Data AnalyticsStratebi
 
PowerBI: Soluciones, Aplicaciones y Cursos
PowerBI: Soluciones, Aplicaciones y CursosPowerBI: Soluciones, Aplicaciones y Cursos
PowerBI: Soluciones, Aplicaciones y CursosStratebi
 
Sports Analytics
Sports AnalyticsSports Analytics
Sports AnalyticsStratebi
 
Vertica Extreme Analysis
Vertica Extreme AnalysisVertica Extreme Analysis
Vertica Extreme AnalysisStratebi
 
Businesss Intelligence con Vertica y PowerBI
Businesss Intelligence con Vertica y PowerBIBusinesss Intelligence con Vertica y PowerBI
Businesss Intelligence con Vertica y PowerBIStratebi
 
Vertica Analytics Database general overview
Vertica Analytics Database general overviewVertica Analytics Database general overview
Vertica Analytics Database general overviewStratebi
 
Talend Cloud en detalle
Talend Cloud en detalleTalend Cloud en detalle
Talend Cloud en detalleStratebi
 
Master Data Management (MDM) con Talend
Master Data Management (MDM) con TalendMaster Data Management (MDM) con Talend
Master Data Management (MDM) con TalendStratebi
 
Talend Introducion
Talend IntroducionTalend Introducion
Talend IntroducionStratebi
 
Talent Analytics
Talent AnalyticsTalent Analytics
Talent AnalyticsStratebi
 

Mais de Stratebi (20)

Destinos turisticos inteligentes
Destinos turisticos inteligentesDestinos turisticos inteligentes
Destinos turisticos inteligentes
 
Azure Synapse
Azure SynapseAzure Synapse
Azure Synapse
 
Options for Dashboards with Python
Options for Dashboards with PythonOptions for Dashboards with Python
Options for Dashboards with Python
 
Dashboards with Python
Dashboards with PythonDashboards with Python
Dashboards with Python
 
PowerBI Tips y buenas practicas
PowerBI Tips y buenas practicasPowerBI Tips y buenas practicas
PowerBI Tips y buenas practicas
 
Machine Learning Meetup Spain
Machine Learning Meetup SpainMachine Learning Meetup Spain
Machine Learning Meetup Spain
 
LinceBI IIoT (Industrial Internet of Things)
LinceBI IIoT (Industrial Internet of Things)LinceBI IIoT (Industrial Internet of Things)
LinceBI IIoT (Industrial Internet of Things)
 
SAP - PowerBI integration
SAP - PowerBI integrationSAP - PowerBI integration
SAP - PowerBI integration
 
Aplicaciones Big Data Marketing
Aplicaciones Big Data MarketingAplicaciones Big Data Marketing
Aplicaciones Big Data Marketing
 
A federated information infrastructure that works
A federated information infrastructure that works A federated information infrastructure that works
A federated information infrastructure that works
 
9 problemas en proyectos Data Analytics
9 problemas en proyectos Data Analytics9 problemas en proyectos Data Analytics
9 problemas en proyectos Data Analytics
 
PowerBI: Soluciones, Aplicaciones y Cursos
PowerBI: Soluciones, Aplicaciones y CursosPowerBI: Soluciones, Aplicaciones y Cursos
PowerBI: Soluciones, Aplicaciones y Cursos
 
Sports Analytics
Sports AnalyticsSports Analytics
Sports Analytics
 
Vertica Extreme Analysis
Vertica Extreme AnalysisVertica Extreme Analysis
Vertica Extreme Analysis
 
Businesss Intelligence con Vertica y PowerBI
Businesss Intelligence con Vertica y PowerBIBusinesss Intelligence con Vertica y PowerBI
Businesss Intelligence con Vertica y PowerBI
 
Vertica Analytics Database general overview
Vertica Analytics Database general overviewVertica Analytics Database general overview
Vertica Analytics Database general overview
 
Talend Cloud en detalle
Talend Cloud en detalleTalend Cloud en detalle
Talend Cloud en detalle
 
Master Data Management (MDM) con Talend
Master Data Management (MDM) con TalendMaster Data Management (MDM) con Talend
Master Data Management (MDM) con Talend
 
Talend Introducion
Talend IntroducionTalend Introducion
Talend Introducion
 
Talent Analytics
Talent AnalyticsTalent Analytics
Talent Analytics
 

Apache Storm: Desarrollo

  • 2. Desarrollo con Storm ● Recordemos que los componentes de Storm se pueden definir en cualquier lenguaje de programación ○ Java ○ Ruby ○ Python ○ Javascript ○ Perl ○ ...
  • 3. Topología simple TopologyBuilder builder = new TopologyBuilder(); builder.setSpout(“words”, new TestWordSpout(), 10); builder.setBolt(“exclaim1”, new ExclamationBolt(), 3) .shuffleGrouping(“words”); Builder.setBolt(“exclaim2”, new ExclamationBolt(), 2) .shuffleGrouping(“exclaim1”); Una topología con 1 Spout y 2 Bolts. El Spout emite palabras y los Bolts añaden “!!!” al final. Los métodos set() reciben como parámetro un id de tipo String, un objeto que contiene la lógica de procesado y el nivel de paralelismo del nodo. El último parámetro indica el número de hilos que se ejecutan en ese componente. El objeto de procesado implementa la interfaz IRichSpout para los Spouts e IRichBolt para los bolts.
  • 4. Topología simple TopologyBuilder builder = new TopologyBuilder(); builder.setSpout(“words”, new TestWordSpout(), 10); builder.setBolt(“exclaim1”, new ExclamationBolt(), 3) .shuffleGrouping(“words”); Builder.setBolt(“exclaim2”, new ExclamationBolt(), 2) .shuffleGrouping(“exclaim1”); setBolt devuelve un objeto InputDeclarer que se utiliza para definir las entradas en el bolt. Indicamos que “exclaim1” quiere leer todas las tuplas de “words” utilizando shuffle grouping y que “exclaim2” quiere leer todas las tuplas de “exclaim1”. “ShuffleGrouping” indica que las tuplas se distributen de forma uniformemente aleatoria entre las entrada-salida.
  • 5. El método importante a implementar es nextTuple(). public void nextTuple() { // hacemos lo que sea Utils.sleep(100); final String[] words = new String[]{“bigData”, “ebd”, “utad”}; final Random rand = new Random(); final String word = words[rand.nextInt(words.length)]; _collector.emit(new Values(word)); } nextTuple() es invocado de forma periódica en el mismo bucle que los métodos ack() y fail(). Libera el control del hilo cuando no hay trabajo y permite que se ejecuten los otros métodos. Spout
  • 6. Tiene los siguientes métodos: public void prepare(Map conf, TopologyContext ctx, OutputCollector c){ _collector = c; } Proporciona al bolt un OutputCollector que se utiliza para emitir las tuplas de este Bolt. Las tuplas se pueden emitir en cualquier parte del bolt. Es llamado antes de que el bolt empiece a procesar tuplas. public void execute(Tuple tuple) { _collector.emit(tuple, new Values(tuple.getString(0) + “!!!”)); _collector.ack(tuple); } Procesa una tupla de las entradas del Bolt. En el ejemplo le añade la cadena “!!!” al string. Si el bolt está subscrito a multiples fuentes de entrada, se puede determinar el origen con el método Tuple#getSourceComponen Bolt
  • 7. public void cleanup(){} Este método es invocado cuando se va a apagar el bolt y debería limpiar ordenadamente los recursos abiertos. public void declareOutputFields(OutputFieldsDeclarer declarer){ declarer.declare(new Fields(“word”)); } Este método indica que el bolt emite una tupla con el campo “word”. Declara el esquema de salida del bolt. Public Map getComponentConfiguration() {} Permite configurar aspectos de como se ejecuta el componente. Bolt Introducción
  • 8. La forma más sencilla de crear bolts es extender la clase BaseRichBolt: public static class ExclamationBolt extends BaseRichBolt { OutputCollector Mycollector; public void prepare(Map conf, TopologyContext ctx, OutputCollector collector) { Mycollector = collector; } public void execute(Tuple tuple) { Mycollector.emit(tuple, new Values(tuple.getSting(0)+”!!!”)); Mycollector.ack(tuple); } public void declareOutputFields(OutputFieldsDeclarer declarer) { declarer.declare(new Fields(“word”)); } } Bolt
  • 10. public class HolaMundoSpout extends BaseRichSpout { private static final long serialVersionUID = 1L; private SpoutOutputCollector collector; private int referenceRandom; private static final int MAX_RANDOM = 10; public HolaMundoSpout() { final Random rand = new Random(); referenceRandom = rand.nextInt(MAX_RANDOM); } @Override public void nextTuple() { Utils.sleep(100); final Random rand = new Random(); int instanceRandom = rand.nextInt(MAX_RANDOM); if (instanceRandom == referenceRandom) { collector.emit(new Values("Hola Mundo")); } else { collector.emit(new Values("Otro Mundo Aleatorio")); } } @Override public void open(Map conf, TopologyContext context, SpoutOutputCollector collector) { this.collector = collector; } @Override public void declareOutputFields(OutputFieldsDeclarer declarer) { declarer.declare(new Fields("sentence")); } } Hola mundo: Spout El método Open() inicializa el objeto SpoutOutputCollector. El Spout va a invocar de forma repetida el método nextTuple(). El método declareOutputFields() indica el contenido de las tuplas enviadas con emit() en el método nextTuple().
  • 11. Esta clase consume las tuplas producidas e implementa la lógica necesaria. La creamos dentro del mismo paquete storm.ebd y que herede de la clase BaseRichBolt. Declaramos una variable miembre privada y proporcionamos la siguiente implementación para el método execute( ) que realiza la mayor parte del trabajo. public void execute(Tuple input) { String test = input.getStringByField("sentence"); if("Hola Mundo".equals(test)){ myCount++; System.out.println("Encontrado Hola Mundo!. Contador:" + Integer.toString(myCount)); } } Hola mundo: Bolt
  • 12. public class HolaMundoTopology { public static void main(String[] args) { TopologyBuilder builder = new TopologyBuilder(); builder.setSpout("randomHolaMundo", new HolaMundoSpout(), 10); builder.setBolt("HolaMundoBolt", new HolaMundoBolt(), 2).shuffleGrouping("randomHolaMundo"); Config conf = new Config(); conf.setDebug(true); if(args != null && args.length > 0) { conf.setNumWorkers(3); try { StormSubmitter.submitTopology(args[0], conf, builder.createTopology()); } catch (AlreadyAliveException e) { e.printStackTrace(); } catch (InvalidTopologyException e) { e.printStackTrace(); } } else { LocalCluster cluster = new LocalCluster(); cluster.submitTopology("test", conf, builder.createTopology()); Utils.sleep(10000); cluster.killTopology("test"); cluster.shutdown(); } } } Hola mundo: Topology Ahora creamos nuestra primera Topology donde unimos los Spouts y Bolts.
  • 13. Hola mundo: Ejecucion El HolaMundoSpout genera un número aleatorio en su constructor y luego en el método nextTuple() genera números aleatorios y los compara con el que se ha generado en el constructor. El método nextTuple() emite una sentencia entre dos posibles: "Hola Mundo", "Otro Mundo Aleatorio" dependiendo de si el número aleatorio coincide con el generado en el constructor o no. El bolt simplemente cuenta las apariciones de la frase “Hola Mundo” y muestra los incrementos secuenciales ● Desde consola: mvn compile exec:java-Dexec.classpathScope=compile - Dexec.mainClass=storm.ebd.HolaMundoTopology ● Se puede empaquetar para enviar al cluster mvn package
  • 14. Python (ns wordcount (:use [streamparse.specs]) (:gen-class)) (defn wordcount [options] [ ;; spout configuration {"word-spout" (python-spout-spec options "spouts.words.WordSpout" ["word"] ) } ;; bolt configuration {"count-bolt" (python-bolt-spec options {"word-spout" :shuffle} "bolts.wordcount.WordCounter" ["word" "count"] :p 2 ) } ] ) Importa las funciones de CLojure DSL de Storm