在云数据准备冒险期间,我遇到了另一个非常烦人的错误。
当创建需要通过参考数据集进行连接的复杂流结构时,会发生此问题。如果对这些集合执行多个并集或联接时超过了某个限制,则数据流将无法启动作业。
我与支持人员联系很多,他们正在努力解决此问题:
“我们的系统工程师团队能够确定导致失败的作业的根本原因。他们提到作业太大。这意味着配方(从所有数据集组合)太大,而Dataflow拒绝了。我们的工程团队仍在研究解决此问题的方法。
一种解决方法是将作业分为两个较小的作业。首先运行该流程以进行数据丰富,然后将输出用作其他流程中的输入。尽管这并不理想,但暂时将是一个可行的解决方案。”
答案 0 :(得分:0)
我遇到了同样的问题,对答案有相当有根据的猜测。请记住,DataPrep只是接受所有基于GUI的输入,并将其转换为Apache Beam代码。传递参考数据集时,它可能会编写一些AB代码,从而将参考数据集转换为侧面输入(https://beam.apache.org/documentation/programming-guide/)。 DataFlow将执行Parellel Do(ParDo)函数,该函数将从PCollection中获取每个元素,将其填充到工作节点中,然后将侧面输入的数据应用于转换。
所以我很确定引用集是否太大(在Joins中可能发生),底层代码将从数据集A中获取一个元素,并将其传递给具有侧面输入B的函数...但是如果side -输入B非常大,它将无法放入工作程序内存中。查看您的作业的Stackdriver日志,以调查是否是这种情况。如果您在日志中看到“ GC(分配失败)”,则表明存储空间不足。
您可以尝试执行以下操作:假设您有两个要读取和处理的CSV文件,文件A为4 GB,文件B也为4 GB。如果您启动某项工作以执行某种类型的Join,它将很快使工作人员的记忆力和uke之以鼻。如果可以,请查看是否可以以其中一个文件在MB范围内而仅增加另一个文件的方式进行预处理。
如果您的数据结构不适合该选项,则可以按照Sys Engs的建议进行操作,将一个文件分成许多小块,然后与另一个较大的文件迭代地馈入配方。
要测试的另一个选项是为工作程序指定计算类型。您可以迭代地将计算类型越来越大,以查看其最终能否通过。
另一种选择是在Apache Beam中自己编写代码,在本地进行测试,然后移植到Google Cloud DataFlow。
希望这些家伙能尽快解决问题,他们肯定不容易向他们提问。