Storm Topology优化之lib库分离

最近在基于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文件下添加如下配置:


  org.apache.maven.plugins
  maven-jar-plugin
  2.4
  
    
      false
      
        true
        YOUR_LIB_PATH
      
    
  



  org.apache.maven.plugins
  maven-assembly-plugin
  2.4
  
    
    
      package.xml
    
  
  
    
      make-assembly
      package
      
        single
      
    
  

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

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


    bin
    
    
        zip
    

    
    
        
            
            false
            lib
            false
        
    

    
        
        
            ${project.build.directory}
            
            
                *.jar
            
        
    

转载于:https://my.oschina.net/Denniswang/blog/801975

你可能感兴趣的:(java,大数据)