在路上

 找回密码
 立即注册
在路上 站点首页 学习 查看内容

storm topology优化之lib库分离

2017-2-7 13:38| 发布者: zhangjf| 查看: 565| 评论: 0

摘要: 最近在基于storm做实时分析统计工作,每次将topology打包上传到服务器上,都是一个艰难的事情,原因有里两个: 1,因为一个topology,如果引用了第三方包,体积就会变大,上传时间随着包体成正比例。 2,加大Nim ...

最近在基于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节点上,是否有自己的任务。当轮询到有自己的任务,将会任务信息(包括代码)。

5,topology开始执行之后,spout不断发stream流,bolt不断接受stream流。如果执行过程中,某个worker多次执行失败,supervisor会发挥给nimbus重新调度分配。


上述5步中,1、3、4都涉及到代码的网络传输。假如topology包体很大的话,并且分配的worker比较多,那传输包体的瞬时带宽就很高。


利用maven打包优化

mvn 打包时,配置classpathPrefix来指定所有依赖JAR文件的前缀,即在运行时,添加一个额外的ClassPath。然后在storm集群,新建刚刚指定的classpathPrefix目录,将topology所依赖的包都放进去。完成后,当我们打包时,只要将具体的业务代码上传就可以。


示例:

在pom文件下添加如下配置:

  1. <plugin>
  2. <groupId>org.apache.maven.plugins</groupId>
  3. <artifactId>maven-jar-plugin</artifactId>
  4. <version>2.4</version>
  5. <configuration>
  6. <archive>
  7. <addMavenDescriptor>false</addMavenDescriptor>
  8. <manifest>
  9. <addClasspath>true</addClasspath>
  10. <classpathPrefix>YOUR_LIB_PATH</classpathPrefix>
  11. </manifest>
  12. </archive>
  13. </configuration>
  14. </plugin>
  15. <plugin>
  16. <groupId>org.apache.maven.plugins</groupId>
  17. <artifactId>maven-assembly-plugin</artifactId>
  18. <version>2.4</version>
  19. <configuration>
  20. <!-- 配置assembly组件 -->
  21. <descriptors>
  22. <descriptor>package.xml</descriptor>
  23. </descriptors>
  24. </configuration>
  25. <executions>
  26. <execution>
  27. <id>make-assembly</id>
  28. <phase>package</phase>
  29. <goals>
  30. <goal>single</goal>
  31. </goals>
  32. </execution>
  33. </executions>
  34. </plugin>
复制代码

将上面的YOUR_LIB_PATH替换成你的目录。

再在项目下添加package.xml文件(上面的pom.xml中指定的),文件内容如下:

  1. <assembly>
  2. <id>bin</id>
  3. <!-- 最终打包成一个用于发布的zip文件 -->
  4. <formats>
  5. <format>zip</format>
  6. </formats>
  7. <!-- Adds dependencies to zip package under lib directory -->
  8. <dependencySets>
  9. <dependencySet>
  10. <!--
  11. 不使用项目的artifact,第三方jar不要解压,打包进zip文件的lib目录
  12. -->
  13. <useProjectArtifact>false</useProjectArtifact>
  14. <outputDirectory>lib</outputDirectory>
  15. <unpack>false</unpack>
  16. </dependencySet>
  17. </dependencySets>
  18. <fileSets>
  19. <!-- 把项目自己编译出来的jar文件,打包进zip文件的根目录 -->
  20. <fileSet>
  21. <directory>${project.build.directory}</directory>
  22. <outputDirectory></outputDirectory>
  23. <includes>
  24. <include>*.jar</include>
  25. </includes>
  26. </fileSet>
  27. </fileSets>
  28. </assembly>
复制代码


来自: http://my.oschina.net/ericquan8/blog/600446

最新评论

小黑屋|在路上 ( 蜀ICP备15035742号-1 

;

GMT+8, 2025-7-8 19:46

Copyright 2015-2025 djqfx

返回顶部