使用外部代码处理分布式dask集合

使用外部代码处理分布式dask集合,dask,dask-distributed,Dask,Dask Distributed,我将输入数据作为单个大文件存储在S3上。 我希望Dask能够自动切碎文件,分发给工人并管理数据流。因此,使用分布式收集的想法,例如包 在每个worker上,我都有一个命令行工具(Java),可以从文件中读取数据。因此,我想将整个数据块写入文件,调用外部CLI/代码来处理数据,然后从输出文件读取结果。这看起来像是处理成批数据,而不是一次记录一次 解决这个问题的最佳方法是什么?是否可以将分区写入辅助进程上的磁盘并将其作为一个整体进行处理 PS.没有必要,但希望留在分布式收集模型中,因为对数据的其他操

我将输入数据作为单个大文件存储在S3上。 我希望Dask能够自动切碎文件,分发给工人并管理数据流。因此,使用分布式收集的想法,例如包

在每个worker上,我都有一个命令行工具(Java),可以从文件中读取数据。因此,我想将整个数据块写入文件,调用外部CLI/代码来处理数据,然后从输出文件读取结果。这看起来像是处理成批数据,而不是一次记录一次

解决这个问题的最佳方法是什么?是否可以将分区写入辅助进程上的磁盘并将其作为一个整体进行处理

PS.没有必要,但希望留在分布式收集模型中,因为对数据的其他操作可能是更简单的Python函数,可以逐个记录地处理数据。

您可能需要该函数。这会将文件分成许多块,并用分隔符(如结束线)清晰地分割。它将返回指向这些字节块的对象列表

此文档页面上有更多信息:

以下是docstring中的一个示例:

>>> sample, blocks = read_bytes('s3://bucket/2015-*-*.csv', delimiter=b'\n')  

大家好,欢迎来到Stack Overflow,请花点时间浏览一下以了解您在这里的道路(以及赢得您的第一个徽章),阅读如何创建并检查以增加获得反馈和有用答案的机会。read_bytes()在我的嫌疑犯列表中。但是我有一个关于记录分隔符的问题。很明显,我想指定工作程序要读取的大致块大小(例如20MB),同时指定一个分隔符,因为记录长度不同。框架将如何找出确切的分隔符位置?计划程序是否会读取整个文件(不需要)?若文件只是被切成规则的片段,那个么一些记录就会被切成两半。在这种情况下,工作者需要知道如何从不同的(“早期”)索引中读取?
read\u bytes
函数根据块大小查找位置,然后向前读取,直到找到分隔符。假设您的分隔符间隔比较频繁,这将是相当有效的,将尊重您的近似块大小,并且始终以分隔符结束,然后在一个分隔符之后开始。我用read_字节做了一些实验,但效果不错。。查看API,我怀疑通过对数据帧调用map_partitions(),对从每个分区提取的数据运行自定义处理并返回修改后的数据帧,可能会获得类似/相同的效果。通过这种方式,我可能能够保持在dask数据帧API的限制范围内。这是正确的还是我遗漏了什么?(为了澄清,我在这里假设我的输入数据是一个CSV文件)是的,如果您的文件是一个大的CSV文件,那么
dd.read\u CSV
是一个很好的方法