Spark使用Java - 没有可用于处理此请求的实时SolrServers

时间:2017-08-02 03:14:17

标签: java apache-spark solr

完整代码

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]

1 个答案:

答案 0 :(得分:0)

使用CloudSolrClient代替HttpSolrClient允许solrj在可用的solr服务器之间进行循环负载平衡,当然建议在SolrCloud上下文中使用。 “No live SolrServers”消息表示集合admiraltyStream存在问题。

具体来说,在幕后,SolrJ正在使用LBHttpSolrClient(使用一组HttpSolrClient实例)来进行分片之间的循环请求。我认为你的问题实际上是这样的:一些碎片不可用(即领导者和复制品)。

我会查看当前的在线副本(http://solr.server:8983/#/~cloud):您应该在线查看所有在线副本的副本。
每个碎片必须至少有一个副本;我认为在你的情况下:

  • 您尝试使用HttpSolrClient直接连接的节点已启动并正在运行
  • 使用CloudSolrClient(即Zookeeper - &gt; Solr)时,群集状态出现问题:Solr认为至少有一个分片没有副本,因此LBHttpSolrClient的给定实例中可用的HttpSolrClient实例列表是空的