I can run an apache-storm program in local mode (using Intellij and Maven), but when I run on the storm cluster it bombs immediately with the error "Exception in thread “main” java.lang.NoClassDefFoundException: org.apache.http.client.HttpClient". I have verified the storm cluster works on a toy program with no http calls. Here is my pom.xml file:
<?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/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.jmm</groupId>
<artifactId>twitter2</artifactId>
<version>1.0</version>
<dependencies>
<dependency>
<groupId>org.apache.storm</groupId>
<artifactId>storm-core</artifactId>
<version>2.1.1</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.6.3</version>
</dependency>
<dependency>
<groupId>org.json</groupId>
<artifactId>json</artifactId>
<version>20090211</version>
</dependency>
</dependencies>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
</project>
And the start of my spout code:
import org.apache.storm.spout.SpoutOutputCollector;
import org.apache.storm.task.TopologyContext;
import org.apache.storm.topology.OutputFieldsDeclarer;
import org.apache.storm.topology.base.BaseRichSpout;
import org.apache.storm.tuple.Fields;
import org.apache.storm.tuple.Tuple;
import org.apache.storm.tuple.Values;
import org.apache.storm.utils.Utils;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Map;
import java.time.format.DateTimeFormatter;
import java.time.LocalDateTime; import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.HttpClient;
import org.apache.http.client.config.CookieSpecs;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.utils.URIBuilder;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;
import twitter4j.Status;
public class twitterSpout extends BaseRichSpout {
private SpoutOutputCollector collector;
String bearerToken = ""; //deleted here, but filled in for my program
HttpGet httpGet;
HttpResponse response;
HttpEntity entity;
URIBuilder uriBuilder;
And the topology:
import org.apache.storm.Config;
import org.apache.storm.StormSubmitter;
import org.apache.storm.topology.TopologyBuilder;
import org.apache.storm.tuple.Fields;
import org.apache.storm.LocalCluster;
public class twitterTopology {
public static void main(String[] args) throws Exception {
twitterSpout spout = new twitterSpout();
System.out.println("\nafter initializing twitterSpout\n");
LossyBolt countBolt = new LossyBolt();
ReportBolt reportBolt = new ReportBolt();
TopologyBuilder builder = new TopologyBuilder();
builder.setSpout("twitterSpout", spout);
builder.setBolt("lossy", countBolt).fieldsGrouping("twitterSpout", new Fields("bucket"));
builder.setBolt("report", reportBolt).fieldsGrouping("lossy", new Fields("bcurrent"));
Config config = new Config();
config.setDebug(true);
config.setNumWorkers(3);
/* this code works when I uncomment it and comment out StormSubmitter
LocalCluster cluster = new LocalCluster();
cluster.submitTopology("twitterTopology", config, builder.createTopology());
Thread.sleep(70000);
cluster.killTopology("twitterTopology");;
cluster.shutdown();
*/
StormSubmitter.submitTopology("twitterTopology", config, builder.createTopology());
Thread.sleep(70000);
}
}
Any insight as to why it works in local mode but not in storm cluster mode would be appreciated!!