zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    (11)选择排序之二 树形选择排序
    (13)归并排序之一 2路归并排序递归形式
    (15)内部排序C++源码
    (10)选择排序之一 简单选择排序
    (14)归并排序之二 2路归并排序非递归形式
    (12)选择排序之三 堆排序
    Linux常用命令日常积累
    构建工具更新记录
    用javascript读取xml,并进行修改xml数据,解决保存没有权限问题
    免费的午餐(编程利用GoogleAPI发短信)移动联通都支持
  • 原文地址:https://www.cnblogs.com/llguanli/p/8313075.html
Copyright © 2011-2022 走看看