完整代码
public class SolrToMongodb {
private static final Logger LOGGER = LoggerFactory.getLogger(SolrToMongodb.class);
public static void main(String[] args) throws IOException, SolrServerException {
SolrToMongodb main = new SolrToMongodb();
main.run();
}
public void run() throws IOException, SolrServerException {
SparkConfig config = new SparkConfig();
JavaSparkContext jsc = new JavaSparkContext(config.sparkConf("admiralty-stream"));
SolrClient client = new HttpSolrClient(Constant.SOLR_STREAMING);
SolrQuery q = new SolrQuery();
q.set("q","*:*");
q.set("indent","on");
q.set("wt", "json");
client.query(q);
try {
CloudSolrClient cloudSolrClient = new CloudSolrClient(Constant.ZOOKEEPER_SOLR);
SolrJavaRDD solrRDD = SolrJavaRDD.get(cloudSolrClient.getZkHost(), "admiraltyStream", jsc.sc());
JavaRDD<SolrDocument> resultsRDD = solrRDD.queryShards(q);
JavaRDD<Object> objectJavaRDD = resultsRDD.map(new Function<SolrDocument, Object>() {
@Override
public Object call(SolrDocument v1) throws Exception {
System.out.println(v1.getFieldValueMap());
return v1.getFieldValueMap();
}
});
}
catch (Exception e){
System.out.println("Exception here : "+e.getMessage());
}
}}
错误日志:
2017-08-02 10:02:58,709 [main]错误CloudSolrClient - 请求收集admiraltyStream失败,因为(0)java.net.ConnectException:连接被拒绝(连接被拒绝),重试? 0 2017-08-02 10:02:59,688 [main] ERROR CloudSolrClient - 请求收集admiraltyStream因(0)java.net.ConnectException失败:连接被拒绝(连接被拒绝),重试? 1 2017-08-02 10:03:01,630 [main]错误CloudSolrClient - 请求收集admiraltyStream失败,因为(0)java.net.ConnectException:连接被拒绝(连接被拒绝),重试? 2 2017-08-02 10:03:02,579 [main]错误CloudSolrClient - 请求收集admiraltyStream失败,因为(0)java.net.ConnectException:连接被拒绝(连接被拒绝),重试? 3 2017-08-02 10:03:03,540 [main]错误CloudSolrClient - 请求收集admiraltyStream失败,因为(0)java.net.ConnectException:连接被拒绝(连接被拒绝),重试? 4 2017-08-02 10:03:04,484 [main]错误CloudSolrClient - 请求收集admiraltyStream因(0)java.net.ConnectException失败:连接被拒绝(连接被拒绝),重试? 5
例外:
Exception here : No live SolrServers available to handle this request:[http://xxx.xxx.ph:8983/solr/admiraltyStream, http://xxx.xxx.ph:8983/solr/admiraltyStream, http://xxx.xxx.ph:8983/solr/admiraltyStream]
答案 0 :(得分:0)
使用CloudSolrClient代替HttpSolrClient允许solrj在可用的solr服务器之间进行循环负载平衡,当然建议在SolrCloud上下文中使用。 “No live SolrServers”消息表示集合admiraltyStream存在问题。
具体来说,在幕后,SolrJ正在使用LBHttpSolrClient(使用一组HttpSolrClient实例)来进行分片之间的循环请求。我认为你的问题实际上是这样的:一些碎片不可用(即领导者和复制品)。
我会查看当前的在线副本(http://solr.server:8983/#/~cloud):您应该在线查看所有在线副本的副本。
每个碎片必须至少有一个副本;我认为在你的情况下: