{"id":31786005,"url":"https://github.com/lucadibello/apache-storm-starter","last_synced_at":"2026-02-18T05:01:07.266Z","repository":{"id":316090409,"uuid":"1061919423","full_name":"lucadibello/apache-storm-starter","owner":"lucadibello","description":"Everything you need to start hacking on Apache Storm: preconfigured devcontainer, Gradle build, and a running example out of the box.","archived":false,"fork":false,"pushed_at":"2025-11-13T00:20:11.000Z","size":992,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-11-13T02:29:42.729Z","etag":null,"topics":["apache-storm","gradle","java-21-lts","starter"],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/lucadibello.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-09-22T15:02:18.000Z","updated_at":"2025-11-13T00:20:15.000Z","dependencies_parsed_at":null,"dependency_job_id":"a45b7938-55ce-45dd-bd8c-12642b43fc45","html_url":"https://github.com/lucadibello/apache-storm-starter","commit_stats":null,"previous_names":["lucadibello/apache-storm-starter"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/lucadibello/apache-storm-starter","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lucadibello%2Fapache-storm-starter","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lucadibello%2Fapache-storm-starter/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lucadibello%2Fapache-storm-starter/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lucadibello%2Fapache-storm-starter/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/lucadibello","download_url":"https://codeload.github.com/lucadibello/apache-storm-starter/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lucadibello%2Fapache-storm-starter/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29569853,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-18T04:18:28.490Z","status":"ssl_error","status_checked_at":"2026-02-18T04:13:49.018Z","response_time":162,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["apache-storm","gradle","java-21-lts","starter"],"created_at":"2025-10-10T12:28:57.099Z","updated_at":"2026-02-18T05:01:07.215Z","avatar_url":"https://github.com/lucadibello.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"# apache-storm-starter\n\nEverything you need to prototype Apache Storm topologies quickly: a Gradle build, a ready-to-use devcontainer, and a joke-driven word count example that proves the toolchain end to end.\n\n## Example topology\n\n- `RandomJokeSpout` (2 executors) reads the bundled `jokes.json` dataset and emits random jokes (id, category, rating, body).\n- `SplitSentenceBolt` (3 executors) tokenizes each joke body into lowercase words.\n- `WordCounterBolt` (3 executors) maintains per-word counters and emits the running total.\n- `HistogramBolt` (single executor) collects the counts into a global histogram and writes a timestamped snapshot to `data/histogram.txt` every 5 seconds.\n\n`WordCountTopology` wires these components with shuffle and fields groupings and, in local mode, keeps the embedded Storm cluster alive for about one minute so you have time to inspect the output. Production mode can be toggled via the `STORM_PROD` environment variable or the `-Dstorm.prod` system property (both default to `false`).\n\n## Topology diagram\n\n![Storm Topology Diagram](assets/diagram.svg)\n\nDataset source: \u003chttps://github.com/taivop/joke-dataset/blob/master/stupidstuff.json\u003e\n\n## Run it locally\n\n1. From the repo root run `./gradlew run`.\n2. Watch the console logs; each spout/bolt uses SLF4J to report the tuples it processes.\n3. Open `data/histogram.txt` while the topology is running (or right after shutdown) to see the aggregated word frequencies.\n\nTip: remove `data/histogram.txt` between runs if you prefer a clean snapshot.\n\nNeed to submit directly from the Gradle task? Use `STORM_PROD=true ./gradlew run`, `./gradlew run -Dstorm.prod=true`, or pass an explicit flag with `./gradlew run --args='--prod'` so the topology is submitted to Nimbus instead of the embedded LocalCluster.\n\n## Devcontainer tasks\n\n\u003e [!IMPORTANT]  \n\u003e These commands rely on the [go-task](https://taskfile.dev/) runner. If it is not installed locally, either install it (`brew install go-task`, `scoop install task`, or download a binary from the releases page) or run them from within the devcontainer where it is preinstalled.\n\n- `task devcontainer`: build, start, and attach to the devcontainer (runs build → up → attach).\n- `task devcontainer-recreate`: force a teardown and rebuild from scratch.\n- `task devcontainer-build`: build only.\n- `task devcontainer-up`: start or reuse the container.\n- `task devcontainer-attach`: exec into the container and attach to the tmux session.\n- `task devcontainer-down`: stop and remove the container plus its volumes.\n\n## Submit to a remote Storm cluster\n\n1. Toggle production mode at runtime by exporting `STORM_PROD=true` **or** passing `-Dstorm.prod=true` when invoking the JVM/Gradle task (no code changes needed).\n2. Build the fat jar: `./gradlew clean jar`. The artifact lands in `build/libs/apache-storm-starter.jar`, bundles your application dependencies, and relies on the Storm runtime provided by the cluster (Storm jars stay external to avoid resource clashes).\n3. Enter the devcontainer (`task devcontainer` or `task devcontainer-attach`). It already ships with a Storm CLI configured via `/root/storm.yaml`, including Nimbus and ZooKeeper endpoints, so no extra flags are required.\n4. Submit the topology from inside the container (remember to enable production mode, e.g. `STORM_PROD=true`):\n\n   ```bash\n   STORM_PROD=true storm jar build/libs/apache-storm-starter.jar \\\n     org.apache.storm.example.WordCountTopology \\\n     WordCountTopology\n   ```\n\n   Replace the last argument if you want a different topology name.\n5. Monitor the deployment through the Storm UI (`http://\u003cnimbus-host\u003e:8080`) or the CLI (`storm list`). When you're done, stop it with `storm kill WordCountTopology` (or your chosen name).\n\nIf you need to submit from outside the devcontainer, copy both `build/libs/apache-storm-starter.jar` and the provided `conf/storm.yaml` to the target machine and adjust the hostnames to match your cluster.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flucadibello%2Fapache-storm-starter","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Flucadibello%2Fapache-storm-starter","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flucadibello%2Fapache-storm-starter/lists"}