Оптимальное количество экземпляров акторов (потоков), необходимых для загрузки документа в облако solr

У меня возникла ситуация, когда мне нужно загрузить документы из моего приложения (миллионами) в *облако solr с помощью zookeeper в качестве службы синхронизации конфигурации *. Я застрял с проблемами производительности из-за большого потока входящих документов. Допустим, у меня есть два запущенных сегмента solr и два экземпляра узла zookeeper для каждого сегмента. Итак, мой подход примерно такой:

  var rtr = system.actorOf(Props(new solrCloudActor(zkHost,core)).withRouter(SmallestMailboxRouter(nrOfInstances = 8)))
  //router vector created globally with 8 instances based on some black box tests that single solr instance can utilize 8 threads in parallel for loading.
  .
  ..
  ... 
  val doc:SolrInputDocument = new SolrInputDocument() //repeated million times depending on number of documents and creating docs here
  doc.addfield("key","value")
  .
  ...
  rtr ! loadDoc(doc) // broadcasting the doc here 

class solrCloudActor(zkHost:String,solrCoreName:String) extends Actor{
  val server:CloudSolrServer  = new CloudSolrServer(zkHost)
  server.setDefaultCollection(solrCoreName)
  def recieve{
    case loadDoc(d:SolrInputDocument) => server.add(d)
  }
}

Мои несколько опасений здесь:

  1. Является ли этот подход правильным? На самом деле это имело смысл, когда у меня был один экземпляр solr и я создал 8 экземпляров вектора маршрутизатора httpclient Actor вместо solrcloud с zookeeper .

  2. Каково оптимальное количество потоков, необходимое для загрузки solr на пике, когда у меня есть миллионы документов в очереди. Это numofshards x some_optimal_number или количество потоков зависит от каждого осколка на основе ядра или это среднее значение :(numofshards x некоторое_оптимальное_число + число ядер)/число ядер ..

  3. Нужно ли мне вообще беспокоиться о параллелизме? Может ли единственный экземпляр сервера solrcloud, который я инициировал, указав все хосты zookeeper, разделенные запятыми, позаботиться о распространении документов.

  4. Если вообще я иду в совершенно неправильном направлении, пожалуйста, предложите лучший способ улучшить производительность.


person Harsh Gupta    schedule 02.01.2014    source источник
comment
Есть часть вашего вопроса, которая для меня загадочна, а именно, создаются ли документы последовательно. Если вы не чередуете создание документа и загрузку документа, вы не сможете многого добиться от использования акторов.   -  person Edmondo1984    schedule 02.01.2014
comment
Что ж, мое приложение в основном анализирует огромный файл событий построчно (и этот процесс также является асинхронным), загрузка solr является его частью . Таким образом, при чтении нового файла всегда возникает непрерывный поток строк.   -  person Harsh Gupta    schedule 02.01.2014


Ответы (1)


Количество участников и количество потоков — это не одно и то же. Актеры используют потоки из пула, когда у них есть работа.

Количество потоков, которые могут выполняться одновременно, ограничено размером пула, который (если не указано иное) является динамическим, но обычно соответствует количеству ядер.

Таким образом, идеальное количество субъектов в пуле примерно равно количеству потоков в пуле.

Количество потоков в пуле в идеальном мире равно количеству ядер.

Но... мы живем не в идеальном мире. В идеальном мире нет блокирующих операций, сетевых или других задержек ввода-вывода, никаких других процессов, конкурирующих за ресурсы на машине, и т. д. и т. д.

В неидеальном (он же реальном) мире. Лучшее число зависит от вашей кодовой базы и конкретной среды. Только вы и ваш профилировщик можете ответить на этот вопрос.

person Kevin Wright    schedule 02.01.2014
comment
Согласен с частью пула потоков, но как насчет части solrcloud, как он распределяет ресурсы и как сделать эффективную загрузку в solrcloud - person Harsh Gupta; 03.01.2014