Java整合Storm上传到远程服务器执行

参考之前的小例子https://blog.csdn.net/xxkalychen/article/details/117021471?spm=1001.2014.3001.5501,我们稍作修改,实现提交到远程集群执行。

一、修改pom.xml

1. storm-sore依赖需要添加作用域provided


    org.apache.storm
    storm-core
    2.2.0
    provided

特别要说明:因为远程服务器上本身就有这个包,但是可能并不包含我们所需要的其他依赖包,所以我们要提交到远程集群的包要用assembly模式,包含所有依赖包,这样就会和服务器上的storm包发生冲突。所以我们加上作用域,表示打包的时候不包含这个包。但是如果要切换本地测试,就要把作用域这一行去掉或者注释掉,否则无法编译运行。

2. 配置maven-assembly-plugin插件。我们要打完整包,就需要这个插件

在pom添加


    
        
            org.apache.maven.plugins
            maven-compiler-plugin
            
                1.8
                1.8
            
        

        
            maven-assembly-plugin
            
                
                    jar-with-dependencies
                
                
                    
                        com.chris.storm.topology.MyTopology
                    
                
            
        
    

需要指定主类。

二、修改主类MyTopology。为了便于切换本地测试模式和远程提交执行,我保留了原来的本地模式,分别封装成两个方法,可以切换调用。

package com.chris.storm.topology;

import com.chris.storm.bolt.CountBolt;
import com.chris.storm.bolt.LineBolt;
import com.chris.storm.bolt.PrintBolt;
import com.chris.storm.spout.DataSourceSpout;
import org.apache.storm.Config;
import org.apache.storm.LocalCluster;
import org.apache.storm.StormSubmitter;
import org.apache.storm.topology.TopologyBuilder;

import java.util.Collections;

/**
 * @author Chris Chan
 * Create on 2021/5/19 9:42
 * Use for:
 * Explain:
 */
public class MyTopology {
    public static void main(String[] args) throws Exception {
        new MyTopology().execute(args);
    }

    private void execute(String[] args) throws Exception {
        //拓扑构造器
        TopologyBuilder builder = new TopologyBuilder();

        //设置流水线数据源spout
        builder.setSpout("data", new DataSourceSpout(), 1);
        //设置流水线的各个处理环节bolt shuffleGrouping对应上一环节的id
        builder.setBolt("line", new LineBolt(), 2).shuffleGrouping("data");
        //shuffleGrouping的各参数就是绑定的streamId
        builder.setBolt("print", new PrintBolt(), 2).shuffleGrouping("line", "print");
        builder.setBolt("count", new CountBolt(), 2).shuffleGrouping("line", "count");

        //提交到本地
        //submitToLocal(builder);

        //提交到远程集群 运行时后面跟着的第一个参数设置为Topology名称
        submitToRemote(builder, args[0]);
    }

    /**
     * 提交到远程集群
     *
     * @param builder
     * @param topologyName
     */
    private void submitToRemote(TopologyBuilder builder, String topologyName) throws Exception {
        //配置
        Config config = new Config();
        config.setDebug(false);
        config.setNumAckers(3);
        config.setMaxTaskParallelism(20);

        StormSubmitter.submitTopologyAs(topologyName, config, builder.createTopology(), null, null, "root");
    }

    /**
     * 提交到本地环境
     *
     * @param builder
     * @throws Exception
     */
    private void submitToLocal(TopologyBuilder builder) throws Exception {
        //配置
        Config config = new Config();
        config.setDebug(false);
        config.setNumAckers(3);
        config.setMaxTaskParallelism(20);

        //本地提交
        LocalCluster cluster = new LocalCluster.Builder().build();
        cluster.submitTopology("test_topo", config, builder.createTopology());
    }
}

在submitToRemote方法中,topologyName不再写死,而是根据运行jar包时传入参数来指定,以免反复启动测试时Topology名称冲突导致启动失败。

三、打包

mvn clean package assembly:assembly

四、上传。参考https://blog.csdn.net/xxkalychen/article/details/117043729?spm=1001.2014.3001.5501

五、运行测试。记得先删除ElasticSearch相关索引

storm jar storm-demo-20210519-1.0.0-SNAPSHOT-jar-with-dependencies.jar com.chris.storm.topology.MyTopology chris-topology

Storm UI可以看到我们启动的Toplogy

控制台输出不方便查看就算了。我们来看看ElasticSearch的数据。

Java整合Storm上传到远程服务器执行_第1张图片

Java整合Storm上传到远程服务器执行_第2张图片

可以看出,数据顺序跟我们想象的不一样,因我们设置了并行处理。

 

你可能感兴趣的:(大数据,Java,Idea,java,elasticsearch,大数据,storm)