
大数据流处理后端【免费下载链接】stormApache Storm项目地址https://gitcode.com/gh_mirrors/storm6/storm点击查看免费下载导读本篇文章以 Apache Storm 二进制发行版storm-dist/binary/final-package中lib-worker目录的说明文档为核心结合发行版组装脚本、Maven 装配描述符与 Supervisor 端类路径构建源码深入讲解 Storm 发行版中 daemon 与 worker 两套类路径的组成方式以及如何通过lib-worker为每个 worker JVM 注入只属于 worker 的第三方 Jar。读完本文你将掌握 Storm 二进制包的目录语义、lib/lib-common/lib-worker/extlib四类目录的分工、发行版构建阶段的 Jar 去重机制以及在实际集群中为 worker 添加依赖的正确姿势。一、lib-worker 目录是什么在 Storm 的二进制发行版中lib-worker是一个即插即用drop-in的目录专门用于放置只属于 worker 的 Jar。其官方说明位于 storm-dist/binary/final-package/src/main/dist/lib-worker/README.md核心语义如下放入该目录的 Jar 会被加入Supervisor 启动的每一个 worker JVM的类路径这些 Jar不会进入 daemonNimbus / Supervisor / UI的类路径发行版本身不携带任何 worker-only Jar。这意味着lib-worker是一个面向运维与二次开发者的扩展位如果你的拓扑Topology在 worker 内部需要某个发行版未内置的库且你不想把它打进拓扑 Jar 里就可以把该 Jar 直接放到所有机器或专门机器$STORM_HOME/lib-worker下让每个 worker 进程自动加载它。注意worker 类路径是 daemon 类路径的子集关系下文详述因此任何放进lib-worker的 Jar 都不会反向污染控制面进程这是该机制最核心的设计价值。二、发行版目录布局与类路径组成根据该 README发行版的目录分工如下目录内容进入的类路径lib-common/daemon 与 worker共享的 Jardaemon worker 都包含lib/仅 daemonNimbus / Supervisor / UI使用的 Jar仅 daemonlib-worker/worker 专用 Jar发行版默认为空仅含 README仅 workerextlib/用户额外放置的 Jardaemon worker都包含因此类路径的组成公式为daemon classpath lib-common lib worker classpath lib-common lib-worker且extlib/会追加到两套类路径上详见下文bin/storm.py的get_classpath实现。2.1 从 bin/storm.py 看类路径的实际拼接客户端侧CLI 与提交端的类路径由 bin/storm.py 中的get_classpath()负责拼接第 109-124 行def get_classpath(extrajars, daemonTrue, clientFalse): ret get_wildcard_dir(STORM_DIR) ret.extend(get_wildcard_dir(STORM_COMMON_LIB_DIR)) # lib-common 永远加入 if client: ret.extend(get_wildcard_dir(STORM_WORKER_LIB_DIR)) # client/worker 场景 else: ret.extend(get_wildcard_dir(STORM_LIB_DIR)) # daemon 场景 ret.extend(get_wildcard_dir(os.path.join(STORM_DIR, extlib))) # 两者都加 if daemon: ret.extend(get_wildcard_dir(os.path.join(STORM_DIR, extlib-daemon))) ...对应的目录常量在 init_storm_env() 中定义STORM_WORKER_LIB_DIR os.path.join(STORM_DIR, lib-worker) STORM_LIB_DIR os.path.join(STORM_DIR, lib) STORM_COMMON_LIB_DIR os.path.join(STORM_DIR, lib-common)可见lib-common无条件出现在 daemon 与 workerclient两套类路径中lib只在 daemon 分支出现lib-worker只在 worker/client 分支出现extlib两者都出现而extlib-daemon仅当daemonTrue时加入。2.2 从 Supervisor 端看 worker 的框架类路径Supervisor 真正启动 worker 进程时框架类路径由 BasicContainer.frameworkClasspath() 构建。它以通配符dir/*形式依次加入File stormCommonLibDir new File(stormHome, lib-common); File stormWorkerLibDir new File(stormHome, lib-worker); ... File stormExtlibDir new File(stormHome, extlib); pathElements.add(getWildcardDir(stormCommonLibDir)); pathElements.add(getWildcardDir(stormWorkerLibDir)); pathElements.add(getWildcardDir(stormExtlibDir)); pathElements.add(extcp); // STORM_EXT_CLASSPATH pathElements.add(topoConfDir); // 拓扑配置目录方法注释明确写道daemon 与 worker 共享的 Jar 被去重到lib-common对应发行版构建阶段的dedup-libs.pystorm-client 及其依赖就位于其中因此 worker 类路径必须同时包含lib-common与lib-worker。对应的单元测试 BasicContainerTest.java 也专门断言了这一点worker classpath must include lib-common/*, got: ... worker classpath must include lib-worker/*, got: ...三、为什么发行版里 lib-worker 是空的构建期的 Jar 去重README 指出发行版本身不携带任何 worker-only Jardaemon 与 worker 共享的 Jar 位于lib-common/仅 daemon 使用的位于lib/。 这是 Storm 3.x 发行版刻意做瘦身的结果其实现依赖构建期的去重脚本 dedup-libs.py。3.1 去重原理由于 worker 类路径是 daemon 类路径的严格子集每个lib-worker下的 Jar 都应当同时存在于 daemon 类路径中。去重脚本的核心逻辑dedup()扫描lib、lib-worker、lib-common三个目录下的所有*.jar只读阶段先做冲突检测对同名但 SHA-256 不同、或同一 Maven artifact 但版本不同的 Jar输出冲突错误并拒绝继续no files were changed保证失败的构建不会破坏目录树无冲突时进入变更阶段把每个lib-worker的 Jar 移入lib-common若lib中存在字节完全相同的副本则删除之回收空间完成后lib-worker变空并被移除避免布局歧义。脚本还会统计worker-only Jar数量即提升到lib-common但在lib中完全不存在的 artifact。在单 reactor 构建下该值预期为 0一旦非零即说明两套类路径已发生漂移是早期预警信号。3.2 冲突检测的细节为了防止同名不同内容或同 artifact 不同版本被静默合并脚本采用了比文件名比较更严格的手段第 74-83 行同名文件必须 SHA-256 完全一致才允许去重按去除版本号后的 artifact 基名artifactId-version.jar中首个-后跟数字之前的部分如commons-io-2.13.0.jar→commons-io比较避免lib/foo-1.0.jar与lib-worker/foo-1.1.jar这类文件名不同但实际冲突的情况悄悄通过。这是因为一旦两个版本同时存在lib-common中的副本会在 daemon 类路径上遮蔽shadowlib中的副本属于必须避免的隐患。3.3 构建中的编排final-package/pom.xml 在prepare-package阶段依次执行maven-dependency-plugin将运行时依赖复制到staging/libdaemon 侧第 52-68 行maven-resources-plugin将 storm-client-bin 装配产物其dependencySet的outputDirectory正是lib-worker中的*.jar复制到staging/lib-common第 69-92 行exec-maven-plugin调用python3 dedup-libs.py staging完成去重第 93-112 行最后maven-assembly-plugin依据装配描述符打包成apache-storm-version.tar.gz/.zip。而装配描述符 common.xml 明确将src/main/dist/lib-worker只有 README 的空目录原样输出到发行版的lib-worker注释说明它保留在 worker 类路径上作为 worker-only Jar 的投放点与去重前的 2.x 布局保持一致。也就是说空目录的保留是刻意设计——让你往里放 Jar 就能生效。该脚本配套的单元测试见 test_dedup_libs.py覆盖了同名不同字节冲突、同 artifact 不同版本冲突、staged-build 布局、字节相同去重等场景pom 中还通过unix_py_testsprofile 在test阶段先行运行这些测试第 170-207 行。四、extlib 与 extlib-daemon两套投放目录除了lib-workerREADME 还提示读者参考extlib/。在 bin/storm.py 中可以看到更细的划分extlib/加入daemon 与 worker 两套类路径适合需要同时被控制面与执行面使用的插件extlib-daemon/只加入 daemon类路径适合仅控制面需要的组件。因此运维上可以这样理解投放规则想投放的 Jar 的作用范围放到哪里仅 worker拓扑执行侧$STORM_HOME/lib-worker/仅 daemonNimbus/Supervisor/UI$STORM_HOME/lib/或$STORM_HOME/extlib-daemon/daemon worker 都要$STORM_HOME/lib-common/或$STORM_HOME/extlib/装配描述符 common.xml 同样生成了空的extlib/与extlib-daemon/目录作为发行版中的标准扩展位。五、实操如何为 worker 添加专用 Jar基于上述机制在已部署的 Storm 集群中为每个 worker 注入专用依赖的推荐步骤确认目标库未被发行版内置若已存在于lib-common/则无需投放将 Jar 复制到每台部署了 Supervisor 的机器的$STORM_HOME/lib-worker/目录下$STORM_HOME即 Storm 发行版的解压根目录其lib-worker初始只含 README重启对应 Supervisor 或让新启动的 worker 进程生效——因为类路径是在 worker 进程启动时由BasicContainer.frameworkClasspath()动态构造的已运行的 worker 不会自动重载可选地用$STORM_HOME/bin/storm classpath之类的客户端命令核对拼接结果lib-common/*与lib-worker/*都应出现在输出中。注意不要往lib-worker放入与lib-common/lib同名或同 artifact 不同版本的 Jar否则在 worker 类路径上会出现版本遮蔽问题——这正是dedup-libs.py在构建期极力避免、却在运行期需要由运维自行规避的情况。六、适用前提与版本说明以上目录语义以当前仓库storm-dist/binary/final-package为准其final-package模块版本为3.1.1-SNAPSHOT见 final-package/pom.xml适用于对应版本的二进制发行版lib-common是 3.x 引入的去重产物在旧版布局中lib-worker直接存放共享 Jarbin/storm.py的代码注释也说明lib-common在旧布局中不存在时不贡献任何内容保证兼容bin/storm.pyworker 类路径是 daemon 类路径的子集这一前提仅在单 reactor 构建下成立若通过其他方式拼装发行版应使用dedup-libs.py的 worker-only 统计项自查。总结lib-worker是 Apache Storm 二进制发行版中一个小而关键的目录它让运维者可以在不改动发行版、不重打拓扑 Jar 的前提下为每个 worker JVM 单独注入依赖同时严格隔离于 daemon 类路径。其背后是lib-common共享、libdaemon-only、lib-workerworker-only、extlib/extlib-daemon扩展位一整套经过构建期去重脚本与单元测试保障的目录约定。理解这套约定是正确运维 Storm 集群、排查类路径冲突与二次封装发行版的基础。赞分享大数据流处理后端【免费下载链接】stormApache Storm项目地址https://gitcode.com/gh_mirrors/storm6/storm点击查看免费下载相关推荐Apache Storm 二进制发行版详解Full 与 Lite 的选择、按需插件机制与 lib-common 去重Apache Storm 二进制发行版详解Full 与 Lite 的选择、按需插件机制与 lib common 去重 Apache Storm 自 3.0.0大数据流处理后端Apache Storm 守护进程容错机制完全解析从 Worker 心跳到 Nimbus HAApache Storm 守护进程容错机制完全解析从 Worker 心跳到 Nimbus HA 本篇文章以 Apache Storm 官方文档 docs/Da大数据流处理后端Apache Storm 实战 FAQTrident 批次调度、Spout 协调机制与 Worker 调优权威指南Apache Storm 实战 FAQTrident 批次调度、Spout 协调机制与 Worker 调优权威指南 本篇技术指南以 Apache Storm大数据流处理后端上一篇如何在Windows上让DualShock 3控制器重获新生DsHidMini虚拟HID驱动技术解析下一篇FFXIV国际服中文汉化终极教程三步实现全界面中文化创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考