Akka - делится большим файлом частями от клиента к узлу - PullRequest
0 голосов
/ 18 апреля 2019

У меня относительно большое количество узлов Akka, закодированных в Scala, в разных кластерах, осуществляющих удаленную связь, и центральный клиент ClusterClient, который используется изначально. Моя цель - предоставить общий доступ к большому файлу (несколько ГБ) из файловой системы Клиента всем различным узлам, предоставив каждому узлу подмножество файла (а не весь файл).

Какую концепцию Akka использовать для этого? Распределенные данные Akka однозначно заявляют, что они не должны использоваться для больших данных, плюс, похоже, они копируют весь файл на узел, а не просто чанк. Похоже, что потоковый ввод-вывод Akka - это путь, но я не могу найти ни одного примера онлайн-достижения этой цели.

Спасибо!

1 Ответ

2 голосов
/ 03 мая 2019

"Большой файл" может быть прочитан с использованием функции streaming FileIO:

val file = Paths.get("example.csv")

val fileSource : Source[ByteString, Future[IOResult]] = FileIO.fromPath(file)

Этот источник может быть затем проанализирован для создания "подмножеств файла".Вопрос не в том, как создаются подмножества, поэтому давайте предположим, что мы хотим отправить 256 строк на каждый узел.Framing может использоваться для анализа, а grouped создаст фрагменты:

val separator = ByteString("\n")

val maxLineLength = 1024

val chunkSize = 256

val lineParser : Flow[ByteString, ByteString, _] = 
  Framing
    .delimiter(separator, maximumFrameLength = maxLineLength, allowTruncation= false)
    .grouped(chunkSize)

Затем эти фрагменты могут быть отправлены на удаленные узлы,Вопрос не был конкретным о том, как взаимодействовать с узлами, поэтому используется функция-заглушка:

val sendChunk : Seq[ByteString] => Unit = ???

val chunkSink : Sink[Seq[ByteString], _] =
  Sink[Seq[ByteString]].foreach(sendChunk)

fileSource
  .via(lineParser)
  .to(chunkSink)
  .run()
...