【四】storm作业提交到集群上运行

maven的pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>com.sid.bigdata</groupId>
  <artifactId>storm</artifactId>
  <version>0.0.1</version>
  <packaging>jar</packaging>

  <name>storm</name>
  <url>http://maven.apache.org</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <storm.version>1.1.1</storm.version>
  </properties>

  <dependencies>
    
  <dependency>
  	<groupId>org.apache.storm</groupId>
  	<artifactId>storm-core</artifactId>
  	<version>${storm.version}</version> 
  </dependency>
  
  </dependencies>
</project>

代码:

package com.sid.bigdata.storm.sum;

import java.util.Map;

import org.apache.storm.Config;
import org.apache.storm.StormSubmitter;
import org.apache.storm.generated.AlreadyAliveException;
import org.apache.storm.generated.AuthorizationException;
import org.apache.storm.generated.InvalidTopologyException;
import org.apache.storm.spout.SpoutOutputCollector;
import org.apache.storm.task.OutputCollector;
import org.apache.storm.task.TopologyContext;
import org.apache.storm.topology.OutputFieldsDeclarer;
import org.apache.storm.topology.TopologyBuilder;
import org.apache.storm.topology.base.BaseRichBolt;
import org.apache.storm.topology.base.BaseRichSpout;
import org.apache.storm.tuple.Fields;
import org.apache.storm.tuple.Tuple;
import org.apache.storm.tuple.Values;
import org.apache.storm.utils.Utils;

/**
 * @author liyijie
 * @date 2018年6月7日下午5:33:27
 * @email 37024760@qq.com
 * @remark
 * @version 
 * 
 * 用storm实现累加求和的操作
 */
public class ClusterSumStormTopology {
	
	/**
	 * Spout需要继承BaseRichSpout
	 * 产生数据并且发送出去
	 * */
	public static class DataSourceSpout extends BaseRichSpout{

		private SpoutOutputCollector collector;
		/**
		 * 初始化方法,在执行前只会被调用一次
		 * @param conf 配置参数
		 * @param context 上下文
		 * @param collector 数据发射器
		 * */
		public void open(Map conf, TopologyContext context, SpoutOutputCollector collector) {
			this.collector = collector;
		}

		int number = 0;
		/**
		 * 产生数据,生产上一般是从消息队列中获取数据
		 * */
		public void nextTuple() {
			this.collector.emit(new Values(++number));
			System.out.println("spout发出:"+number);
			Utils.sleep(1000);
		}

		/**
		 * 声明输出字段
		 * @param declarer
		 * */
		public void declareOutputFields(OutputFieldsDeclarer declarer) {
			/**
			 * num是上nextTuple中emit中的new Values对应的。上面发几个,这里就要定义几个字段。
			 * 在bolt中获取的时候,只需要获取num这个字段就行了。
			 * */
			declarer.declare(new Fields("num"));
		}
		
	}
	
	/**
	 * 数据的累计求和Bolt
	 * 接收数据并且处理
	 * */
	public static class SumBolt extends BaseRichBolt{

		/**
		 * 初始化方法,只会被执行一次
		 * */
		public void prepare(Map stormConf, TopologyContext context, OutputCollector collector) {
			
		}

		int sum=0;
		/**
		 * 获取spout发送过来的数据
		 * */
		public void execute(Tuple input) {
			//这里的num就是在spout中的declareOutputFields定义的字段名
			//可以根据index获取,也可以根据上一个环节中定义的名称获取
			Integer value = input.getIntegerByField("num");
			sum+=value;
			System.out.println("Bolt:sum="+sum);
		}

		/**
		 * 声明输出字段
		 * @param declarer
		 * */
		public void declareOutputFields(OutputFieldsDeclarer declarer) {
			
		}
		
	}
	
	public static void main (String[] args){
		
		
		//TopologyBuilder根据spout和bolt来构建Topology
		//storm中任何一个作业都是通过Topology方式进行提交的
		//Topology中需要指定spout和bolt的执行顺序
		TopologyBuilder tb = new TopologyBuilder();
		tb.setSpout("DataSourceSpout", new DataSourceSpout());
		//SumBolt以随机分组的方式从DataSourceSpout中接收数据
		tb.setBolt("SumBolt", new SumBolt()).shuffleGrouping("DataSourceSpout");
		
		//代码提交到storm集群上运行
		try {
			StormSubmitter.submitTopology("ClusterSumStormTopology", new Config(), tb.createTopology());
		} catch (AlreadyAliveException e) {
			e.printStackTrace();
		} catch (InvalidTopologyException e) {
			e.printStackTrace();
		} catch (AuthorizationException e) {
			e.printStackTrace();
		}
		
	}
}

打包

对项目名单机右键选择run as --> maven install

完成后Jar包在项目中target下


将这个jar包上传到nimbus所在的节点上


启动storm后

运行jar包

./bin/storm jar topology-jar-path class ...

class指定main在的类及起带的参数

如果想执行一些jar包,它并没有包含在应用jar包中,可以用--jars将其传递进去,多个jar时用逗号分隔。

如果想用一些maven中的东西,

用--artifacts来指定,多个时用逗号分隔,排除不要的用^

例如--artifacts "redis.clients:jedis:2.9.0,org.apache.kafka:kafka_2.10:0.8.2.2^org.slf4j:slf4j-log4j12"


这里是执行:

只用在nimbus节点操作。

cd /app/storm

./bin/storm jar /app/sid_test_data/storm-0.0.1.jar com.sid.bigdata.storm.sum.ClusterSumStormTopology


在storm的UI中查看日志可以看到代码中system.out.print的输出


storm常用命令介绍

storm list 显示正在运行的作业的状态。


storm kill ClusterSumStormTopology名字 停掉作业



  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Storm是一个分布式实时计算系统,它可以在一个集群中运行多个计算节点,实时处理数据流。下面是Storm集群的工作流程以及运行时的原理: 1. 架构概述 Storm的集群架构包括以下几个主要的组件: - Nimbus:是Storm集群的主节点,负责协调和管理整个集群的运行。它负责分配任务、监控任务的执行情况、调度和负载均衡等工作。 - Supervisor:是Storm集群的工作节点,负责实际执行计算任务。每个Supervisor节点都会运行一个或多个工作进程(Worker),每个Worker执行一个或多个计算任务(Topology)。 - ZooKeeper:是一个分布式协调系统,用于协调Storm集群中各个组件之间的通信和协作。 - Topology:是Storm集群中的一个计算任务,由多个Spout和Bolt组成,用于实时处理数据流。Topology可以在Storm集群中部署和运行,由Nimbus节点分配到各个Supervisor节点上执行。 2. 工作流程 Storm集群的工作流程如下: - 开发Topology:首先需要开发一个Topology,包括定义Spout和Bolt的计算逻辑、数据流的处理方式等。 - 提交Topology:将Topology提交到Nimbus节点,由Nimbus节点负责分配任务到各个Supervisor节点上执行。 - 分配任务:Nimbus节点根据集群资源情况和负载均衡策略,将Topology的各个组件分配到不同的Supervisor节点上执行。 - 执行任务:Supervisor节点接收到任务后,启动对应的Worker进程,执行Topology的计算任务。 - 数据处理:Spout和Bolt组件接收输入数据,并按照定义好的处理方式进行数据转换、过滤、聚合等操作。 - 数据传输:Spout和Bolt之间通过数据流进行数据传输。数据流是Storm的核心概念,它用于实时传输数据,可以在Spout和Bolt之间建立任意的连接关系。 - 拓扑调度:Nimbus节点会监控集群中各个组件的运行情况,根据需要进行拓扑调度,例如动态调整任务分配、调整数据流连接方式等。 - 容错处理:Storm集群具有较强的容错性,可以在节点失效、网络故障等情况下自动进行容错处理,确保数据处理的正确性和可靠性。 3. 运行时原理 Storm集群的运行时原理主要包括以下几个方面: - 数据流传输:Storm集群中的数据流是基于Tuple的,每个Tuple包含一个或多个字段,可以表示任意类型的数据。Spout和Bolt之间通过数据流传输Tuple,实现数据的实时处理和传输。 - 执行模型:Storm采用的是多线程模型,每个Worker进程会启动多个线程,用于处理数据流和计算任务。Spout和Bolt之间采用异步方式传递数据,可以充分利用多线程处理数据。 - 容错处理:Storm集群具有较强的容错性,可以在节点失效、网络故障等情况下自动进行容错处理。例如,当一个节点出现故障时,Nimbus节点会将该节点上的任务重新分配到其他节点上执行,确保数据处理的正确性和可靠性。 - 负载均衡:Storm集群采用的是负载均衡策略,可以根据集群资源情况和任务负载情况,动态调整任务分配和数据流传输,实现集群资源的充分利用和任务的高效执行。 总的来说,Storm集群的架构和工作流程比较复杂,但是它提供了一种高效、可靠、实时的数据处理方案,可以应用于各种实时数据分析和处理场景。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值