Ubuntu 22.04 安装 Apache StormCrawler 3.6.0 指南

Ubuntu 22.04 安装 Apache StormCrawler 3.6.0 指南:JDK 17 与 Maven 环境准备、2.x 与 3.x 版本选型对照、官方 Maven archetype 生成 crawler 工程与手工依赖引入两种方案、Apache Storm 2.8.8 运行时安装、uberjar 构建验证与卸载,全程实测。

Apache StormCrawlerApache StormCrawler2026/10/12

Ubuntu 22.04 安装 Apache StormCrawler 3.6.0 指南

目标:在 Ubuntu 22.04 服务器上完成 Apache StormCrawler 3.6.0(基于 Apache Storm 的低延迟网络爬虫框架,以 Maven 工程形态引入)的安装与验证。本文给出 JDK 17 环境准备、2.x/3.x 版本选型对照、官方 archetype 生成工程与手工 Maven 依赖引入两种方案、Apache Storm 2.8.8 运行时安装,以及 uberjar 构建验证与卸载方式。所有命令与回显均在 Ubuntu 22.04.5 + OpenJDK 17 + Maven 3.6.3 环境实测通过。

一、环境信息

  • 操作系统:Ubuntu 22.04.5 LTS(VERSION_CODENAME=jammy)
  • 架构:x86_64(内核 6.8.0-138-generic)
  • Java:OpenJDK 17.0.20.1(openjdk-17-jdk-headless,Ubuntu 官方源)
  • 构建工具:Apache Maven 3.6.3(Ubuntu 官方源)
  • StormCrawler 版本:3.6.0(当前最新稳定版,groupId 为 org.apache.stormcrawler,class 版本 61.0,需 JDK 17)
  • 依赖的 Storm 运行时:Apache Storm 2.8.8(archetype 生成的 pom 中 storm.version=2.8.8)
  • 演示账号:root
  • 工程目录:/root/build/crawler-demo/
  • Storm 安装目录:/opt/apache-storm-2.8.8/

💡 说明:Apache StormCrawler 是一组以 jar 库发布的爬虫组件(spout/bolt/资源文件),本身不是独立服务;「安装」的本质是准备 JDK/Maven 构建环境、用官方 Maven archetype 生成一个 crawler 工程,并准备好用于运行的 Apache Storm 二进制发行版。

二、前置条件

2.1 更新软件源

sudo apt-get update

2.2 安装 JDK 17 与 Maven

StormCrawler 3.x 的 class 文件版本为 61.0(父 pom 中 maven.compiler.source/target/release 均为 17),必须使用 JDK 17(Ubuntu 22.04 官方源已内置):

sudo apt-get install -y openjdk-17-jdk-headless maven wget

验证 JDK 与 Maven:

java -version
mvn -version

实测回显:

openjdk version "17.0.20.1" 2026-08-18
OpenJDK Runtime Environment (build 17.0.20.1+1-1-22.04-Ubuntu)
OpenJDK 64-Bit Server VM (build 17.0.20.1+1-1-22.04-Ubuntu, mixed mode, sharing)
Apache Maven 3.6.3
Maven home: /usr/share/maven
Java version: 17.0.20.1, vendor: Ubuntu, runtime: /usr/lib/jvm/java-17-openjdk-amd64
Default locale: en_US, platform encoding: UTF-8
OS name: "linux", version: "6.8.0-138-generic", arch: "amd64", family: "unix"

2.3 固化 JAVA_HOME(持久化)

为保证 Maven 与后续 Storm 命令始终使用 JDK 17,将环境变量写入 /etc/profile.d/:

echo "export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64" > /etc/profile.d/jdk17.sh
echo "export PATH=\$JAVA_HOME/bin:\$PATH" >> /etc/profile.d/jdk17.sh
source /etc/profile.d/jdk17.sh

三、版本选型说明

通过 Maven Central 查询当前版本(org.apache.stormcrawler:stormcrawler-core):

wget -qO- "https://search.maven.org/solrsearch/select?q=g:org.apache.stormcrawler+AND+a:stormcrawler-core&rows=5&wt=json"

实测返回(节选):

"a": "stormcrawler-core",
"latestVersion": "3.6.0",

StormCrawler 存在两条版本线,对照如下:

版本线最新版本Maven groupIdclass 版本所需 JDK配套 Storm结论
3.x3.6.0org.apache.stormcrawler61.0JDK 17Storm 2.8.x(archetype 生成 2.8.8)新项目用 3.x
2.x2.11com.digitalpebble.stormcrawler55.0JDK 11Storm 2.4.x仅维护旧项目时用

💡 版本选择建议:3.x 线的 groupId 已从 com.digitalpebble.stormcrawler 迁移为 org.apache.stormcrawler(Apache 官方孵化归属),且模块全面更新(Elasticsearch 模块演化为 OpenSearch 模块等)。新安装一律选 3.x 当前版 3.6.0。本指南全程按 JDK 17 + StormCrawler 3.6.0 + Storm 2.8.8 实测。

四、方案 A:官方 Maven archetype 生成 crawler 工程(官方推荐)

StormCrawler 官方推荐用 Maven archetype 一键生成一个开箱可用的 crawler 工程(含完整拓扑定义 crawler.flux、默认配置 crawler-conf.yaml 与过滤器资源文件)。

4.1 创建构建目录并执行 archetype

export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64
export PATH=$JAVA_HOME/bin:$PATH
mkdir -p /root/build && cd /root/build
mvn archetype:generate -B \
  -DarchetypeGroupId=org.apache.stormcrawler \
  -DarchetypeArtifactId=stormcrawler-archetype \
  -DarchetypeVersion=3.6.0 \
  -DgroupId=com.demo.crawl -DartifactId=crawler-demo -Dversion=1.0-SNAPSHOT -Dpackage=com.demo.crawl \
  -Dhttp-agent-name="DemoCrawler" -Dhttp-agent-version="1.0" \
  -Dhttp-agent-description="Demo crawler for local test" \
  -Dhttp-agent-url="http://www.example.com" -Dhttp-agent-email="root@example.com"

实测结果:命令正常退出(退出码 0),生成工程目录。

⚠️ 注意:archetype 要求必须提供 http-agent-name、http-agent-version、http-agent-description、http-agent-url、http-agent-email 五个属性,缺省会报错 Property http-agent-name is missing.。爬虫代理名需符合 RFC 9309 规范(仅字母、数字、下划线、连字符)。

4.2 生成的工程结构

find /root/build/crawler-demo -type f | sort

实测回显:

/root/build/crawler-demo/README.md
/root/build/crawler-demo/crawler-conf.yaml
/root/build/crawler-demo/crawler.flux
/root/build/crawler-demo/pom.xml
/root/build/crawler-demo/src/main/resources/default-regex-filters.txt
/root/build/crawler-demo/src/main/resources/default-regex-normalizers.xml
/root/build/crawler-demo/src/main/resources/jsoupfilters.json
/root/build/crawler-demo/src/main/resources/parsefilters.json
/root/build/crawler-demo/src/main/resources/urlfilters.json
文件作用
pom.xml构建定义(锁定 StormCrawler 3.6.0、Storm 2.8.8、编译目标 17、shade 打 uberjar)
crawler.flux生产拓扑定义(URLFrontier 状态后端 + StdOutIndexer)
crawler-conf.yaml爬虫自定义配置(覆盖 crawler-default.xml 默认值)
urlfilters.jsonURL 过滤链(BasicURLFilter、HostURLFilter、RegexURLFilter 等)
default-regex-filters.txtURL 正则过滤规则(默认拒绝 file/ftp/mailto、图片后缀、localhost 与私网地址)
default-regex-normalizers.xmlURL 正则正规化规则
parsefilters.json / jsoupfilters.json解析过滤器链

4.3 生成 pom 的关键参数

生成工程 pom.xml 中的核心版本锁定(实测值):

配置项值说明
stormcrawler.version3.6.0StormCrawler 版本
storm.version2.8.8配套 Apache Storm 版本
urlfrontier.version2.4URLFrontier 客户端版本
maven-compiler-plugin source/target17Java 编译目标
maven-shade-plugin mainClassorg.apache.storm.flux.Fluxuberjar 主类(Flux 拓扑启动器)
核心依赖stormcrawler-core、stormcrawler-tika、stormcrawler-urlfrontier、storm-client(provided)、flux-core默认模块组合

五、方案 B:手工创建 Maven 工程引入依赖(自定义模块组合)

不需要 archetype 默认模块组合(如只需 core,或要接入 OpenSearch/Solr/SQL 后端)时,可手工创建 pom.xml 自选依赖。最小依赖组合示例:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.demo.crawl</groupId>
    <artifactId>crawler-minimal</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>jar</packaging>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.apache.stormcrawler</groupId>
            <artifactId>stormcrawler-core</artifactId>
            <version>3.6.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.storm</groupId>
            <artifactId>storm-client</artifactId>
            <version>2.8.8</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.apache.storm</groupId>
            <artifactId>flux-core</artifactId>
            <version>2.8.8</version>
        </dependency>
    </dependencies>
</project>

可选后端模块(按需加入,版本同为 3.6.0):

Artifact用途
stormcrawler-opensearchOpenSearch/Elasticsearch 状态与索引后端
stormcrawler-solrSolr 后端
stormcrawler-sql关系数据库后端(状态/索引)
stormcrawler-tika非 HTML 文档解析(PDF/Office 等)
stormcrawler-urlfrontierURLFrontier 分布式抓取队列后端
stormcrawler-awsAWS(CloudWatch 指标等)集成
stormcrawler-playwright / stormcrawler-selenium浏览器渲染抓取
stormcrawler-langid / stormcrawler-ai / stormcrawler-warc语言识别 / AI 能力 / WARC 归档

💡 说明:storm-client 官方声明为 provided——构建 uberjar 时不打入 Storm 本体,运行时由 Storm 发行版提供,避免包冲突。

六、构建 uberjar 与验证

进入工程目录执行构建(方案 A 生成的工程,首次构建需联网下载依赖):

export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64
export PATH=$JAVA_HOME/bin:$PATH
cd /root/build/crawler-demo
mvn -B clean package

实测回显(尾部,依赖已缓存时):

[INFO] BUILD SUCCESS
[INFO] Total time:  20.001 s

构建产物:

ls -lh target/*.jar

实测回显:

-rw-r--r-- 1 root root 106M Oct 12 13:32 target/crawler-demo-1.0-SNAPSHOT.jar
-rw-r--r-- 1 root root 6.1K Oct 12 13:32 target/original-crawler-demo-1.0-SNAPSHOT.jar

💡 说明:crawler-demo-1.0-SNAPSHOT.jar 为 shade 合并后的 uberjar(约 106MB,mainClass 已设为 org.apache.storm.flux.Flux),可直接交给 storm 命令运行;original-*.jar 是 shade 前的原始 jar。构建期出现 gson 与 urlfrontier-client 的重叠类 WARNING 属正常提示。

七、配置说明

7.1 运行时:安装 Apache Storm 2.8.8 二进制发行版

StormCrawler 工程构建出的 uberjar 需要交给 Apache Storm 运行(本地模式或分布式模式均通过 Storm 发行版的 bin/storm 命令启动)。Storm 2.8.8 与 archetype 生成的 storm.version 一致:

cd /opt
wget "https://archive.apache.org/dist/storm/apache-storm-2.8.8/apache-storm-2.8.8.tar.gz"
echo "075a165ac6f5f7d3284ff1fd46cfb0e30b63ed70b65ef59723c8c9c0d6107026ad25f5f86f45531837ceed22499f97fed81abf7018b02658e5d4c405e178a68a  apache-storm-2.8.8.tar.gz" | sha512sum -c -

实测回显:

apache-storm-2.8.8.tar.gz: OK

解压(得到 /opt/apache-storm-2.8.8/):

tar xzf apache-storm-2.8.8.tar.gz

验证 Storm 可用:

/opt/apache-storm-2.8.8/bin/storm version

实测回显:

Running: /usr/lib/jvm/java-17-openjdk-amd64/bin/java -client -Ddaemon.name= -Dstorm.options= -Dstorm.home=/opt/apache-storm-2.8.8 -Dstorm.log.dir=/opt/apache-storm-2.8.8/logs -Djava.library.path=/usr/local/lib:/opt/local/lib:/usr/lib:/usr/lib64 -Dstorm.conf.file= -cp /opt/apache-storm-2.8.8/*:/opt/apache-storm-2.8.8/lib/*:/opt/apache-storm-2.8.8/extlib/*:/opt/apache-storm-2.8.8/extlib-daemon/*:/opt/apache-storm-2.8.8/conf org.apache.storm.utils.VersionInfo
Storm 2.8.8
Branch v2.8.8
From source with checksum dd8ab586a06db2ced58135f6be47980

⚠️ 注意:archive.apache.org 下载较慢时可改用镜像站(如 https://mirrors.huaweicloud.com/apache/storm/apache-storm-2.8.8/apache-storm-2.8.8.tar.gz,与官方 sha512 校验一致)。Apache 官方当前归档保留的 Storm 2.x 最新版本以 https://archive.apache.org/dist/storm/ 目录列表为准。

7.2 爬虫基础配置:http.agent 与后端

  • 代理标识:crawler-conf.yaml 中的 http.agent.name(必填,用于 robots.txt 指令匹配)与 http.agent.version、http.agent.description、http.agent.url、http.agent.email 组成完整 User-Agent;
  • 状态后端:archetype 默认拓扑(crawler.flux)使用 URLFrontier 后端(gRPC 服务,默认端口 7071),配置项 urlfrontier.host、urlfrontier.port;本地演示可改用 StormCrawler 自带的内存后端组件(见《构建并运行示例抓取应用指南》篇);
  • 过滤配置:urlfilters.config.file、parsefilters.config.file、jsoup.filters.config.file 指向 classpath 内的 JSON 过滤链文件。

各配置项的完整含义、默认值与生产模板见《Apache StormCrawler 3.6.0 配置参数详解》篇。

八、注意事项

⚠️ 注意:

  1. StormCrawler 3.x 必须 JDK 17+(class 版本 61.0)。JDK 11 下即使空工程能构建(无 Java 源码时编译器不会真正执行),运行期加载 StormCrawler 类会抛 UnsupportedClassVersionError。
  2. archetype 缺少 http-agent-* 属性会直接报错退出,五个属性一个都不能少。
  3. crawler-conf.yaml 引用了 parse.tika.config.file: "tika-config.xml",但 archetype 不生成该文件;需在工程根目录自建最小 tika-config.xml(<properties></properties>),避免 Tika 解析 bolt 初始化失败。
  4. archetype 自带的 default-regex-filters.txt 默认拒绝 localhost/127.x/私网地址的 URL(防 SSRF 泄漏),抓取本机测试站点前需按需注释对应规则。
  5. 生产环境运行 worker 需关注 JVM 堆:Storm 默认 worker 堆较大,可通过 topology.worker.childopts 或 STORM_JAR_JVM_OPTS 限制到 256-512MB(本地模式验证方法见下节)。

九、常见问题

Q1:mvn 编译报 invalid target release: 17 或运行时报 UnsupportedClassVersionError ... class file version 61.0? 原因:使用了低于 17 的 JDK。StormCrawler 3.6.0 与其依赖的 Storm 2.8.8 组件均按 Java 17 编译。解决:安装 openjdk-17-jdk-headless 并按第 2.3 节固化 JAVA_HOME,再执行 mvn -version 确认 Java version 为 17。

Q2:archetype:generate 报 Property http-agent-name is missing.? archetype 元数据把代理信息定义为必填属性。补齐 -Dhttp-agent-name/-Dhttp-agent-version/-Dhttp-agent-description/-Dhttp-agent-url/-Dhttp-agent-email 后重新执行(见第四节命令)。

Q3:mvn clean package 慢或超时? 首次构建需从 Maven Central 下载全部依赖(实测约 4 分半)。依赖缓存后二次构建约 20 秒。内网环境可配置公司 Nexus/Artifactory 镜像。

Q4:storm version 报 JAVA_HOME 未设置? Storm 脚本依赖 JAVA_HOME 定位 java 可执行文件。按第 2.3 节固化后再执行,或临时 export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64。

Q5:本地模式运行时如何限制 JVM 堆在 256-512MB? storm local 命令读取环境变量 STORM_JAR_JVM_OPTS 注入 JVM 参数,例如 STORM_JAR_JVM_OPTS="-Xms256m -Xmx512m";启动后回显的 Running: 行会包含该参数,可用 jps -v 核对生效值(实测 Running: 行含 -Xms256m -Xmx512m)。

十、卸载方式

删除工程与本地 Maven 仓库中的 StormCrawler 依赖:

rm -rf /root/build/crawler-demo
rm -rf ~/.m2/repository/org/apache/stormcrawler

删除 Storm 运行时:

rm -rf /opt/apache-storm-2.8.8 /opt/apache-storm-2.8.8.tar.gz

如同时移除 JDK 17 与 Maven:

sudo apt-get remove -y openjdk-17-jdk-headless maven
sudo apt-get autoremove -y

十一、参考链接

  • StormCrawler 官网与文档:https://stormcrawler.net/
  • StormCrawler 源码仓库:https://github.com/apache/stormcrawler
  • Maven Central 版本目录:https://repo1.maven.org/maven2/org/apache/stormcrawler/
  • Apache Storm 下载归档:https://archive.apache.org/dist/storm/
  • Storm 官方文档:https://storm.apache.org/