后端大数据【免费下载链接】stormApache Storm项目地址https://gitcode.com/gh_mirrors/storm22/storm点击查看免费下载本指南面向希望在 Apache Storm 上开始编写拓扑Topology的开发者完整介绍从零创建一个 Storm 项目的两个核心步骤将 Storm jars 加入 classpath以及在使用多语言multilang组件时将multilang/resources/目录加入 classpath。文中以官方示例项目 examples/storm-starter 为主线结合 Eclipse 与 Maven 两种工程形态给出可复现的配置方法并深入剖析storm-client依赖的作用域、ConfigurableTopology的运行机制与 multilang 的 Shell 协议实现。读完本文你将能够独立搭建一个可编译、可本地运行、可打包提交到集群的 Storm 开发项目。创建 Storm 项目的两个核心步骤在 Apache Storm 中拓扑是普通的 Java 程序开发一个 Storm 项目的实质是解决两类依赖问题将 Storm jars 加入 classpath——你的拓扑代码需要引用storm-client中的 API如TopologyBuilder、ConfigurableTopology、ShellBolt编译器必须能找到它们如果使用 multilang 组件将 multilang 目录加入 classpath——用 Python、Ruby、JavaScript 等语言实现的 spout/bolt 脚本存放在multilang/resources/下Storm 在本地模式local mode下运行时依赖 classpath 来定位这些脚本。官方文档以 storm-starter 项目为例演示了上述配置的完整过程下文逐一展开。该示例项目包含ExclamationTopology、WordCountTopology、ReachTopologyDRPC 示例与LambdaTopologyJava 8 Lambda 写法等入门拓扑其中WordCountTopology正是同时演示 stream grouping 与 multilang 能力的经典案例。第一步将 Storm jars 加入 classpath要让你的拓扑代码可编译首先必须解决 Storm 依赖的引入问题。官方强烈推荐使用 Maven 管理依赖Storm 各模块已发布到 Maven 中央仓库。使用 Maven推荐在 docs/Maven.md 中给出了引入 Storm 的最简依赖声明在pom.xml中加入如下片段dependency groupIdorg.apache.storm/groupId artifactIdstorm-client/artifactId version{{page.version}}/version scopeprovided/scope /dependency其中scope设置为provided是关键它告诉 Maven 编译与测试时需要storm-client但不要把它打包进最终的分发 jar。因为 Storm 集群的 worker 环境本身已经包含了 Storm 的运行时 jar如果将 Storm 依赖一并打进 fat jar提交到集群后反而可能引发版本冲突。这也解释了为什么storm jar命令提交的通常是uberjar包含全部非 Storm 依赖的胖 jar。以 storm-starter 的实际配置为例examples/storm-starter/pom.xml 中的依赖声明更加完整dependency groupIdorg.apache.storm/groupId artifactIdstorm-clojure/artifactId version${project.version}/version /dependency dependency groupIdorg.apache.storm/groupId artifactIdstorm-client/artifactId version${project.version}/version !-- Use provided scope to keep storm out of the jar-with-dependencies For IntelliJ dev, intellij will load properly. -- scope${provided.scope}/scope /dependency dependency groupIdorg.apache.storm/groupId artifactIdmultilang-javascript/artifactId version${project.version}/version /dependency dependency groupIdorg.apache.storm/groupId artifactIdmultilang-ruby/artifactId version${project.version}/version /dependency dependency groupIdorg.apache.storm/groupId artifactIdmultilang-python/artifactId version${project.version}/version /dependency这里的storm-client是编写拓扑所需的核心 API 模块storm-clojure提供 Clojure DSL 支持storm-starter 同时保留src/clj下的 Clojure 版本示例三个multilang-*模块则为 Python、Ruby、JavaScript 提供协议适配层。值得注意的细节是scope使用了占位符${provided.scope}而不是硬编码provided。这个属性定义在仓库根 pom.xml 中默认值为provided见pom.xml中provided.scopeprovided/provided.scope但当开发者使用 IntelliJ IDEA 时可以启用intellijprofile 将其覆盖为compile从而让 IDE 在本地开发时能够正确解析并加载 Storm 类避免只在打包时可用、IDE 里报错的尴尬。这种设计说明provided 作用域在集群部署中是规范但在 IDE 开发环境中需要酌情放宽。不使用 Maven 的替代方案如果不使用 Maven官方文档给出的替代做法是直接从 Storm 发布包中把 jars 放进 classpath。下载apache-storm-version发布包后其lib/目录下包含运行时所需的依赖 jars。在 Eclipse 中手动配置时需要确保lib/与lib/dev/下的所有 jars 都出现在项目的Referenced Libraries中。构建与验证从源码到可提交的拓扑 jar如果你使用的是开发版本例如直接 clone 了本仓库必须先在仓库根目录对 Storm 本身执行一次本地构建否则 Maven 会报出 Could not resolve dependencies for project org.apache.storm:storm-starter:...-SNAPSHOT 之类的错误。依据 examples/storm-starter/README.markdown 的操作步骤# 必须在 Storm 代码仓库的顶层目录执行 mvn clean install -DskipTeststrue该命令会把 Storm 各模块构建并安装到本地 Maven 仓库$HOME/.m2/repository之后 storm-starter 才能解析到同版本的org.apache.storm依赖。打包用于提交集群的 fat jarmvn package命令执行后在target/storm-starter-{version}.jar生成 uberjar。随后通过stormCLI 提交拓扑# 示例 1以本地模式运行 ExclamationTopologyLocalCluster storm jar target/storm-starter-*.jar org.apache.storm.starter.ExclamationTopology -local # 示例 2以集群模式运行 RollingTopWords拓扑名称为 production-topology storm jar target/storm-starter-*.jar org.apache.storm.starter.RollingTopWords production-topology如果要在 IDE 中直接运行示例则需要额外引入storm-server模块依赖并使用LocalCluster创建本地集群来提交拓扑完整说明见 docs/Local-mode.md。第二步将 multilang 目录加入 classpath当你的 spout/bolt 使用 Java 之外的语言实现时Storm 官方称这种组件为 multilang components 或 shelling这些实现必须放在项目的multilang/resources/目录下。为了让 Storm 在本地模式下找到这些脚本resources/目录必须位于 classpath 上。在 storm-starter 中multilang/resources/存放了 Python 实现的 bolt 脚本。例如WordCountTopology中用于切分句子的SplitSentencebolt其 Python 实现位于 examples/storm-starter/multilang/resources/splitsentence.pyimport storm class SplitSentenceBolt(storm.BasicBolt): def process(self, tup): words tup.values[0].split( ) for word in words: storm.emit([word]) SplitSentenceBolt().run()对应的 Java 侧声明位于 examples/storm-starter/src/jvm/org/apache/storm/starter/WordCountTopology.javapublic static class SplitSentence extends ShellBolt implements IRichBolt { public SplitSentence() { super(python3, splitsentence.py); } Override public void declareOutputFields(OutputFieldsDeclarer declarer) { declarer.declare(new Fields(word)); } }ShellBolt的构造参数(python3, splitsentence.py)表示以python3命令启动一个子进程并执行splitsentence.py脚本。这正是 docs/Using-non-JVM-languages-with-Storm.md 中描述的机制——Java 侧通过继承ShellBolt/ShellSpout声明输出字段实际处理逻辑由其他语言脚本完成两者之间通过 JSON 消息在 stdin/stdout 上进行通信协议细节见 docs/Multilang-protocol.md。在 Maven 项目中将multilang/目录作为资源目录随包发布是标准做法。storm-starter 的pom.xml中已有对应配置build sourceDirectorysrc/jvm/sourceDirectory testSourceDirectorytest/jvm/testSourceDirectory resources resource directory${basedir}/multilang/directory /resource /resources ... /build${basedir}/multilang被声明为资源目录意味着splitsentence.py会被打包进 jar 的 classpath从而同时满足本地模式与集群模式通过storm jar提交的脚本定位需求。而在 Eclipse 这类 IDE 中不使用 Maven 构建路径时则需要手动操作将multilang/添加为项目的source folder如有必要再将multilang/resources也添加为 source directory。这样脚本文件便进入了 classpath本地模式下 Storm 即可按约定路径找到它们。更详细的跨语言拓扑编写说明可参考 docs/Using-non-JVM-languages-with-Storm.md。在 Eclipse 中配置 storm-starter 项目官方文档以 Eclipse 为例给出了手工配置 classpath 的完整流程适用于不使用 Maven 的场景新建一个 Java 项目将src/jvm/添加为源路径source path——storm-starter 的 Java 源码约定存放在src/jvm/下与src/clj/的 Clojure 源码并列从 examples/storm-starter 的目录结构可见这一布局约定确保发布包lib/与lib/dev/目录下的所有 jars都被加入项目的Referenced Libraries如果使用 multilang将multilang/必要时还有multilang/resources/添加为 source folder使脚本进入 classpath。对使用 IntelliJ IDEA 的开发者examples/storm-starter/README.markdown 给出了等价做法通过File Import Project...以 Maven 外部模型导入 storm-starter并务必启用intellijprofile该 profile 将${provided.scope}覆盖为compile保证 IDE 内依赖解析正确。验证环境运行 WordCountTopology环境配置完成后官方文档给出了一个简单可靠的验证手段直接运行WordCountTopology.java。该类的入口代码位于 examples/storm-starter/src/jvm/org/apache/storm/starter/WordCountTopology.javapublic class WordCountTopology extends ConfigurableTopology { public static void main(String[] args) throws Exception { ConfigurableTopology.start(new WordCountTopology(), args); } Override protected int run(String[] args) throws Exception { TopologyBuilder builder new TopologyBuilder(); builder.setSpout(spout, new RandomSentenceSpout(), 5); builder.setBolt(split, new SplitSentence(), 8).shuffleGrouping(spout); builder.setBolt(count, new WordCountBolt(), 12).fieldsGrouping(split, new Fields(word)); conf.setDebug(true); String topologyName word-count; conf.setNumWorkers(3); if (args ! null args.length 0) { topologyName args[0]; } return submit(topologyName, conf, builder); } }从源码结构看ConfigurableTopology实现位于 storm-client/src/jvm/org/apache/storm/topology/ConfigurableTopology.java提供了ConfigurableTopology.start()静态入口它先解析命令行参数支持--config等选项加载 YAML 配置文件随后调用子类实现的run()方法完成拓扑构建与提交。submit(name, conf, builder)会根据配置决定以本地模式LocalCluster还是远程模式提交到 Nimbus运行。WordCountTopology之所以能开箱即用正是因为该抽象类封装了本地/远程两种运行方式的差异。在 Eclipse 中直接Run该文件后拓扑会以本地模式启动spout 不断生成随机句子Python 实现的SplitSentencebolt 切分单词WordCountBolt统计词频。由于conf.setDebug(true)开启了调试输出你会在控制台看到持续约 10 秒的元组处理日志——这正是官方文档所说的验证信号当控制台开始持续打印消息时说明 Storm 类路径、multilang 脚本路径与运行时环境均已配置正确。小结一套配置两种模式回顾整个创建流程可以把关键要点归纳为一张配置清单配置项做法目的Storm 依赖Maven 声明org.apache.storm:storm-clientscope 设为provided编译可用打包不携带避免与集群运行时冲突非 Maven 工程将发布包lib/、lib/dev/下所有 jars 加入 Referenced Libraries提供编译与本地运行所需类Java 源码路径Eclipse 中加入src/jvm/为 source path定位拓扑源码multilang 脚本放在multilang/resources/并把multilang/加入 classpathMaven 工程则声明为资源目录本地模式与storm jar提交后都能找到脚本验证运行WordCountTopology.java观察控制台 10 秒输出确认 classpath 与 multilang 配置正确这套两个步骤的配置方法论贯穿所有 Storm 项目无论是纯 Java 拓扑还是混用 Python/Ruby/JavaScript 的 multilang 拓扑最终都收敛到Storm jars 在 classpath 上 资源脚本在 classpath 上这两个基本前提。在此之上再结合 docs/Command-line-client.md 的stormCLI 用法与 docs/Setting-up-a-Storm-cluster.md 的集群部署说明即可将本地验证通过的拓扑平滑迁移到生产集群。赞分享后端大数据【免费下载链接】stormApache Storm项目地址https://gitcode.com/gh_mirrors/storm22/storm点击查看免费下载相关推荐从零搭建 Apache Storm 开发项目classpath 配置、Maven 工程化与 multilang 多语言支持实战从零搭建 Apache Storm 开发项目classpath 配置、Maven 工程化与 multilang 多语言支持实战 本篇指南围绕 Apache S大数据流处理后端Apache Storm开发环境搭建Eclipse、IntelliJ IDEA配置指南Apache Storm开发环境搭建Eclipse、IntelliJ IDEA配置指南 Apache Storm作为业界领先的分布式实时计算系统为大数据处理后端大数据SmartJavaAI开发环境搭建IDEAMaven配置SmartJavaAI开发环境搭建IDEAMaven配置 还在为Java项目集成AI功能而烦恼面对复杂的Python环境配置、模型部署、跨语言调用等问题束人工智能计算机视觉OCR语音NLP上一篇魔兽争霸3终极优化指南5个简单步骤让经典游戏在现代电脑完美运行下一篇洛雪音乐桌面版完整教程一款免费聚合五家平台音乐的开源播放器创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
阅读完成 · 觉得有帮助?