最近在基于storm做实时分析统计工作,每次将topology打包上传到服务器上,都是一个艰难的事情,原因有里两个:
1,因为一个topology,如果引用了第三方包,体积就会变大,上传时间随着包体成正比例。
2,加大Nimbus、Supervisor、Zookeeper的网络压力。
先简单描述storm运行一个topology的流程:
1,提交topology.jar后,jar包上传到Nimbus的${storm.local.dir}/inbox目录中,之后把该jar包序列化到stormdist目录中。
2,Nimbus根据topology设定的spout、bolt数分配worker,nimbus会根据spout、bolt的数量尽量平均分配到每个worker
3,nimbus将任务信息(包括代码)提交到zookeeper集群上,保存当前topology与所有worker进程的心跳信息(workerbeats节点);同时将topology的任务分配信息、代码存储目录、任务之间的关联关系保存到assignments节点下。
4,supervisor不断轮询zookeeper的assignments节点上,是否有自己的任务。当轮询到有自己的任务,将任务信息(包括代码)下载到本地,分配给对应的worker开始执行topology。
5,topology开始执行之后,spout不断发stream流,bolt不断接受stream流。如果执行过程中,某个worker多次执行失败,supervisor会发挥给nimbus重新调度分配。
上述5步中,1、3、4都涉及到代码的网络传输。假如topology包体很大的话,并且分配的worker比较多,那传输包体的瞬时带宽就很高。
利用maven打包优化
mvn 打包时,配置classpathPrefix来指定所有依赖JAR文件的前缀,即在运行时,添加一个额外的ClassPath。然后在storm集群,新建刚刚指定的classpathPrefix目录,将topology所依赖的包都放进去。完成后,当我们打包时,只要将具体的业务代码上传就可以。
示例:
在pom文件下添加如下配置:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.4</version>
<configuration>
<archive>
<addMavenDescriptor>false</addMavenDescriptor>
<manifest>
<addClasspath>true</addClasspath>
<classpathPrefix>YOUR_LIB_PATH</classpathPrefix>
</manifest>
</archive>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>2.4</version>
<configuration>
<!-- 配置assembly组件 -->
<descriptors>
<descriptor>package.xml</descriptor>
</descriptors>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
将上面的YOUR_LIB_PATH替换成你的目录。
再在项目下添加package.xml文件(上面的pom.xml中指定的),文件内容如下:
<assembly>
<id>bin</id>
<!-- 最终打包成一个用于发布的zip文件 -->
<formats>
<format>zip</format>
</formats>
<!-- Adds dependencies to zip package under lib directory -->
<dependencySets>
<dependencySet>
<!--
不使用项目的artifact,第三方jar不要解压,打包进zip文件的lib目录
-->
<useProjectArtifact>false</useProjectArtifact>
<outputDirectory>lib</outputDirectory>
<unpack>false</unpack>
</dependencySet>
</dependencySets>
<fileSets>
<!-- 把项目自己编译出来的jar文件,打包进zip文件的根目录 -->
<fileSet>
<directory>${project.build.directory}</directory>
<outputDirectory></outputDirectory>
<includes>
<include>*.jar</include>
</includes>
</fileSet>
</fileSets>
</assembly>
转载于:https://my.oschina.net/Denniswang/blog/801975
分享到:
相关推荐
java开发的基于kafka、xlog的web日志实时分析storm topology storm-kafka-xlog 使用java语言开发的基于storm、kafka、xlog的web日志实时分析系统,实时分析指定时间周期内web日志中每个ip访问的各项数据指标(访问总...
【课程大纲】01.Storm项目实战课程大纲02.CDH5搭建之CM5安装部署03.CDH5搭建和CM界面化集群管理04.Hadoop、HBase、Zookeeper集群管理和角色分配05.Kafka基础知识和集群搭建06.Kafka基本操作和最优设置07.Kafka Java ...
本项目"java开发的基于kafka、xlog的web日志实时分析storm topology"聚焦于使用Java编程语言,结合Kafka消息队列、Xlog日志处理库以及Apache Storm流处理框架,构建了一个能够实时分析Web日志的系统。下面我们将深入...
【标题】"storm提交topology的过程"涉及到的是Apache Storm这一分布式实时计算系统中的核心操作——部署和运行流处理任务,即topology。Apache Storm被广泛应用于实时数据处理、在线机器学习、持续计算以及大规模...
项目3-非跳出UV-Storm topology开发二】 在本项目中,我们将探讨如何利用Apache Storm开发一个实时数据分析系统,特别是关注非跳出用户视图(UV)的计算。非跳出UV是指在网站上至少访问了两个不同页面的用户数,它...
大家都知道,要提交StormTopology到Cluster,需要运行如下命令:bin目录下storm是一个Python文件,我们可以看一下Python脚本的main方法首先解析args参数,解析完了之后,把所有的参数传递给COMMANDS,由COMMANDS调用...
STORM的TOPOLOGY在线上运行时,随着数据量的增加,在一定的服务器性能及集群规模下,会渐渐达到一个极限,到达极限后,服务器的load、io、cpu、mem等可能会出现耗尽,系统很卡,storm吞吐量骤降的情况。本文档中截图...
3D拓扑优化算法,经典169行代码,MATLAB语言
6. **lib目录**:包含各种依赖库,如Hadoop客户端库(如果Storm配置为与HDFS集成),以及各种网络和序列化库。 7. **config目录**:可能包含默认配置文件,如`storm.yaml`,用于配置Storm集群的参数。 在使用storm...
Apache Storm 是一个开源的分布式实时计算系统,它允许开发者处理无界数据流,提供高度容错性和可扩展性。在本教程中,我们将详细介绍如何安装和...通过不断实践和优化,Storm可以在大数据实时处理领域发挥巨大作用。
未来,Storm将进一步优化其性能和可靠性,增强对更多编程语言的支持,并与其他大数据生态系统更好地集成。 #### 二、Storm安装 **2.1 版本选择** 在安装之前,应先了解所需的Storm版本及其兼容性。通常建议使用...
`lib/storm.thrift`包含了Thrift定义的Storm服务接口和数据结构,通过这些接口,用户可以编写Spouts、Bolts,并提交Topology到集群。 此外,`storm-core`模块中的`backtype.storm.util`提供了各种工具类,如`...
3. `lib` 目录:包含 Storm 及其依赖的库文件,这些文件是 Storm 运行所必需的。 4. `docs` 目录:文档和用户指南,帮助开发者了解如何使用 Storm。 5. `examples` 目录:示例项目,用于演示如何构建和运行 Storm ...
Storm的基本单位是“topology”(拓扑结构),它可以理解为一个实时计算的网络图,包含spouts和bolts两个主要组件。 Spout是拓扑中的数据源组件,主要负责从外部数据源如文件、数据库或者消息队列中获取原始数据,...
1. `storm-client`: 这是Storm的核心客户端库,包含用于编写和提交topology的API。 2. `storm-server`: 提供了Storm集群的服务器端组件,包括nimbus、supervisor等节点。 3. `jedis`: 这是Redis客户端,可能被用作...
风暴拓扑示例 概述: 该项目提供了有关使用各种Apache Storm拓扑的示例集合... cd /tmp/storm-topology-examples && bash -x bin/install_mongodb.sh 如果使用HiveBolt,则创建表(您可能要修改ddl) cd /tmp/storm
- **Nimbus**:Nimbus是Storm集群的核心组件之一,负责整个集群的管理和协调工作,包括任务调度、故障恢复等。Nimbus通过Zookeeper来实现状态同步和集群协调。 - **Supervisor**:Supervisor运行在每个Worker节点上...