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

26 篇文章 2 订阅
14 篇文章 0 订阅

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

一、修改pom.xml

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

<dependency>
    <groupId>org.apache.storm</groupId>
    <artifactId>storm-core</artifactId>
    <version>2.2.0</version>
    <scope>provided</scope>
</dependency>

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

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

在pom添加

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <configuration>
                <source>1.8</source>
                <target>1.8</target>
            </configuration>
        </plugin>

        <plugin>
            <artifactId>maven-assembly-plugin</artifactId>
            <configuration>
                <descriptorRefs>
                    <descriptorRef>jar-with-dependencies</descriptorRef>
                </descriptorRefs>
                <archive>
                    <manifest>
                        <mainClass>com.chris.storm.topology.MyTopology</mainClass>
                    </manifest>
                </archive>
            </configuration>
        </plugin>
    </plugins>
</build>

需要指定主类。

二、修改主类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的数据。

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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值