我在相对不同的集群中有相对大量的用Scala编码的Akka节点,可以进行远程通信,并且还有一个最初使用的中央ClusterClient。 我的目标是通过给每个节点一个文件的子集(而不是整个文件),从客户端的文件系统共享一个大文件(多个GB)给所有不同的节点。
为此使用的正确Akka概念是什么? Akka的Distributed Data明确声明不要将其用于大数据,此外,它似乎会将整个文件复制到节点上,而不仅仅是一个块。看来Akka的Streams IO是可行的方法,但是我找不到在线实现此目标的任何示例。
谢谢!
答案 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()