Storm新特性之Flux

Posted llguanli

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Storm新特性之Flux相关的知识,希望对你有一定的参考价值。

Storm新特性之Flux


Flux是Storm版本号0.10.0中的新组件,主要目的是为了方便拓扑的开发与部署。原先在开发Storm拓扑的时候整个拓扑的结构都是硬编码写在代码中的,当要对其进行改动时,须要改动代码并又一次编译和打包,这是一件繁琐和痛苦的事情,Flux攻克了这一问题。

特性

以下是Flux提供的全部的特性:

  • easy配置和部署拓扑(包含Storm和Trident)
  • 支持变更已存在的拓扑
  • 通过YAML文件来定义Spouts和Bolts,甚至能够支持Storm的其它组件。如storm-kafka/storm-hdfs/storm-hbase等
  • easy支持多语言协议组件
  • 方便在不同环境中切换

使用

想要用Flux最简单的方法就是加入Maven依赖,然后打包成一个胖jar文件。

依赖配置例如以下:

<!-- include Flux and user dependencies in the shaded jar -->
<dependencies>
    <!-- Flux include -->
    <dependency>
        <groupId>org.apache.storm</groupId>
        <artifactId>flux-core</artifactId>
        <version>${storm.version}</version>
    </dependency>

    <!-- add user dependencies here... -->

</dependencies>
<!-- create a fat jar that includes all dependencies -->
<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-shade-plugin</artifactId>
            <version>1.4</version>
            <configuration>
                <createDependencyReducedPom>true</createDependencyReducedPom>
            </configuration>
            <executions>
                <execution>
                    <phase>package</phase>
                    <goals>
                        <goal>shade</goal>
                    </goals>
                    <configuration>
                        <transformers>
                            <transformer
                                    implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer"/>
                            <transformer
                                    implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                                <mainClass>org.apache.storm.flux.Flux</mainClass>
                            </transformer>
                        </transformers>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

接下来是YAML文件的定义,一个拓扑的定义须要包含以下的部分:

  1. 拓扑名
  2. 拓扑组件的列表
  3. spouts、bolts、stream。或者是一个能够提供org.apache.storm.generated.StormTopology实例的JVM类。

以下是YAML文件实例:

name: "yaml-topology"
config:
  topology.workers: 1

# spout definitions
spouts:
  - id: "spout-1"
    className: "org.apache.storm.testing.TestWordSpout"
    parallelism: 1

# bolt definitions
bolts:
  - id: "bolt-1"
    className: "org.apache.storm.testing.TestWordCounter"
    parallelism: 1
  - id: "bolt-2"
    className: "org.apache.storm.flux.wrappers.bolts.LogInfoBolt"
    parallelism: 1

#stream definitions
streams:
  - name: "spout-1 --> bolt-1" # name isn‘t used (placeholder for logging, UI, etc.)
    from: "spout-1"
    to: "bolt-1"
    grouping:
      type: FIELDS
      args: ["word"]

  - name: "bolt-1 --> bolt2"
    from: "bolt-1"
    to: "bolt-2"
    grouping:
      type: SHUFFLE

在有了jar文件和YAML文件后就能够通过以下的命令执行Flux拓扑了。当中myTopology-0.1.0-SNAPSHOT.jar是打包后的jar文件,org.apache.storm.flux.Flux是Flux的入口类,--local表示是在本地执行拓扑,my_config.yaml使YAML配置文件。

storm jar myTopology-0.1.0-SNAPSHOT.jar org.apache.storm.flux.Flux --local my_config.yaml

其它特性具体解释

不同环境切换

在不同的环境中执行拓扑须要不一样的配置,如开发环境和生产环境,这些环境中切换一般不会改变拓扑的结构。仅仅是要改动主机、port号和并行度等。

假设用两份不一样的YAML文件来进行会产生不必要的反复,Flux能够通过.properites文件来载入不同的环境变量。

仅仅须要加入--filter參数就可以:

torm jar myTopology-0.1.0-SNAPSHOT.jar org.apache.storm.flux.Flux --local my_config.yaml --filter dev.properties

以YAML文件里的Kafka主机为例。YAML文件改动例如以下:

- id: "zkHosts"
    className: "org.apache.storm.kafka.ZkHosts"
    constructorArgs:
      - "${kafka.zookeeper.hosts}"

而dev.properties问价例如以下:

kafka.zookeeper.hosts: localhost:2181

注:YAML文件里也能够解析系统环境变量${ENV-VARIABLE}

多语言协议的支持

多语言特性的支持比較简单。仅仅须要改动YAML文件里构造參数,如以下是一个由Python写成的bolts:

bolts:
  - id: "splitsentence"
    className: "org.apache.storm.flux.bolts.GenericShellBolt"
    constructorArgs:
      # command line
      - ["python", "splitsentence.py"]
      # output fields
      - ["word"]
    parallelism: 1

 展望

Flux尽管能够加方便拓扑的改动与部署,但这仍然不支持动态的改动拓扑结构,在改动拓扑时仍要中断并重新启动。只是如今在开发中的几个特性有望改善这个情况。

參考内容: Flux github

以上是关于Storm新特性之Flux的主要内容,如果未能解决你的问题,请参考以下文章

Storm-Flux简介

译ECMAScript 2016, 2017, 2018 新特性之必读篇

Storm 1.0 新特性

Storm 1.0 新特性

在storm ui中,没有tuples被拓扑发出或传递。

Spring5---新特性(WebFlux)