我试图在Python中编写一个Dataflow管道,需要一个大的numpy矩阵作为边输入。矩阵保存在云存储中。理想情况下,每个Dataflow工作人员都会直接从云存储中加载矩阵。
我的理解是,如果我说matrix = np.load(LOCAL_PATH_TO_MATRIX)
,然后
p | "computation" >> beam.Map(computation, matrix)
矩阵从笔记本电脑发送到每个Datflow工作人员。
我怎样才能指导每个工作人员直接从云存储中加载矩阵?是否存在"二进制blob"?
的光束源答案 0 :(得分:5)
你的方法是正确的。
在这种情况下,数据流的作用是将NumPy矩阵作为侧输入处理。这意味着它会从您的计算机上传到服务一次,Dataflow服务会将其发送给每个工作人员。
鉴于矩阵很大,这将使您的工作人员使用I / O从服务接收它,并承担将整个矩阵保留在内存中的负担,但它应该有效。
如果您想避免在机器中计算/加载矩阵,可以将矩阵作为文本文件上传到GCS,读取该文件并获取矩阵。你可以这样做:
matrix_file = 'gs://mybucket/my/matrix'
p | beam.ParDo(ComputationDoFn(matrix_file))
你的DoFn可能是这样的:
class ComputationDoFn(beam.DoFn):
def __init__(self, matrix_file):
self._matrix_file = matrix_file
self._matrix = None
def start_bundle(self, element):
# We check because one DoFn instance may be reused
# for different bundles.
if self._matrix is None:
self.load_matrix(self._matrix_file)
def process(self, element):
# Now process the element
def load_matrix(self, matrix_file):
# Load the file from GCS using the GCS API
我希望这是有道理的。如果您觉得需要更多帮助,我可以充实这些功能。