I’m trying to use Solr queries inside a JavaRDD snippet. It seems to me there are two options:
- using spark-solr to create a JavaRDD
- using CloudSolrClient to perform a query.
The latter works in a common Java snippet, however fails with a “class not found” exception in the JavaRDD snippet. I have tried on a Spark 1.6.2 and a 2.3 job servers, KNIME 3.5.3 and 3.6 (nightly) using different versions of SolrJ and Spark-Solr, and set the options spark.jars, spark.driver.extraClassPath, and spark.executor.extraClassPath accordingly.
But I get more or less the same errors in both cases:
java.lang.NoClassDefFoundError: com/lucidworks/spark/rdd/SolrJavaRDD
at SparkJavaSnippetSource5be85e31d6a5b35d678c7…apply(…
and
java.lang.NoClassDefFoundError: org/apache/solr/common/params/SolrParams
at java.lang.Class.getDeclaredConstructors0(Native Method)
at java.lang.Class.privateGetDeclaredConstructors(Class.java:2671)
at java.lang.Class.getConstructor0(Class.java:3075)
at java.lang.Class.newInstance(Class.java:412)
at org.knime.bigdata.spark1_6.jobs.scripting.java.JavaSnippetJob.runJob(JavaSnippetJob.java:69)
…
respectively.
Thanks in advance for any help.
Sven
Snippet code:
String urlZooKeeper = “host:2181/solr”;
CloudSolrClient solrClient = new CloudSolrClient.Builder()
.withZkHost(urlZooKeeper)
.build();
List result = new ArrayList<>();
try{
SolrQuery query = new SolrQuery();
query.setQuery(":");
query.setRows(100);
final QueryResponse response = solrClient.query(“table”, query);
final SolrDocumentList documents = response.getResults();
for(SolrDocument document : documents) {
RowBuilder rb = RowBuilder.emptyRow();
for(String s: document.getFieldNames()) {
rb.add((String) document.getFieldValue(s));
}
result.add(rb.build());
}
solrClient.close();
} catch (Exception e) {
e.printStackTrace();
}
return sc.parallelize(result);
and
String urlZooKeeper = “host:2181/solr”;
SolrJavaRDD solrRDD = SolrJavaRDD.get(urlZooKeeper, “table”, sc.sc());
JavaRDD resultsRDD = solrRDD.queryShards(":");
return resultsRDD.map(
new Function<SolrDocument, Row>() {
private static final long serialVersionUID = 1L;
@Override
public Row call(SolrDocument doc) {
RowBuilder rb = RowBuilder.emptyRow();
for (String s: doc.getFieldNames()) {
rb.add((String) doc.getFieldValue(s));
};
return rb.build();
}
}
);