Использование синглтон-паттерна в Apache Spark - PullRequest
0 голосов
/ 24 января 2019

Мне нужно использовать внешнюю библиотеку в функции mapPartition RDD, и для этого я должен вызвать ее посредством реализации шаблона синглтона, который я не могу изменить, поскольку библиотека не моя

Я пытаюсь использовать функции библиотеки по разделам, но существует конфликт параллелизма, поскольку иногда выполнение является удовлетворительным, но в других случаях возникают исключения nullPointerException, и я предполагаю, что это одновременный доступ к этой библиотеке различными разделами. Так библиотека называется Strategy.getStrategy. Как я могу заставить эту библиотеку работать с глобальной конфигурацией, которую я предлагаю, но независимо в каждом разделе без одновременного доступа к ее внутренним процессам?

private def executeStrategy(iter: Iterator[Row]): Iterator[(String,(MyState,Double))] = {
  val listBest = new util.ArrayList[State]
  Predicate.fuzzyValues = iter.toList

  for (i <- 0 until conf.runNumber) {
    Strategy.getStrategy.executeStrategy(conf.iterByRun, 1, conf.algorithm("algorithm").asInstanceOf[GeneratorType])
    listBest.addAll(Strategy.getStrategy.listBest)
  }

  val result = postMining(listBest)

  result.map(x => (x.getCode.toString, (MyState(x.getCode), x.getEvaluation.get(0).asInstanceOf[Double]))).iterator
}

def run(sparkSession: SparkSession, n: Int): Unit = {
  var data0 = conf.dataBase.repartition(n).persist(StorageLevel.MEMORY_AND_DISK_SER)
  var listBest = new util.ArrayList[State]

  val data1 = data0.rdd.mapPartitions(executeStrategy).reduceByKey((x,y) => x)
}

Я ожидаю, что эта библиотека с глобальной конфигурацией, которую я предлагаю, выполняет код Strategy.getStrategy.executeStrategy (conf.iterByRun, 1, conf.algorithm("algorithm").asInstanceOf[GeneratorType]) по разделам, но без конфликтов совпадений

...