Akka-从客户端到节点分块共享一个大文件

时间:2019-04-18 15:07:25

标签: scala akka akka-stream akka-http

我在相对不同的集群中有相对大量的用Scala编码的Akka节点,可以进行远程通信,并且还有一个最初使用的中央ClusterClient。 我的目标是通过给每个节点一个文件的子集(而不是整个文件),从客户端的文件系统共享一个大文件(多个GB)给所有不同的节点。

为此使用的正确Akka概念是什么? Akka的Distributed Data明确声明不要将其用于大数据,此外,它似乎会将整个文件复制到节点上,而不仅仅是一个块。看来Akka的Streams IO是可行的方法,但是我找不到在线实现此目标的任何示例。

谢谢!

1 个答案:

答案 0 :(得分:2)

可以使用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()