我的U-SQL输入文件大小似乎达到了1GB的上限。是否有这样的限制,如果有,这怎么可以增加?
简而言之,这就是我的情况:
我正在开发一个自定义xml提取器,我正在处理大约2.5gb的XML文件。这些XML文件符合维护良好的XSD架构。使用xsd.exe我已经为Xml序列化生成了.NET类。自定义提取程序使用这些已弃用的.NET对象来填充输出行。
这一切都在Visual Studio的本地ADLA帐户上运行非常简洁的U-SQL。对于2.5 gb输入xml,内存使用量上升到大约3 gb,因此这应该完全适合每个文件的单个顶点。 使用Data Lake上的< 1gb输入文件仍然可以很好地工作。 但是,当试图在Data Lake Store扩展时,似乎通过达到1gb输入文件大小边界来终止作业。
我知道流式传输外部XML,然后序列化内部XML片段是另一种选择,但我们不希望创建 - 特别是维护 - 过多的自定义代码,具体取决于那些外部管理的模式。 因此,提高上限将是很大的。
答案 0 :(得分:1)
我现在看到两个问题。我们可以解决的问题,以及我们今年晚些时候正在开发的功能。
默认情况下,U-SQL假定您要扩展对文件的处理,并将其拆分为1GB"块"用于提取。如果您的提取器需要查看所有数据(例如,为了解析XML或JSON或图像),您需要标记提取器以下列方式原子地处理文件(而不是拆分它):
[SqlUserDefinedExtractor(AtomicFileProcessing = true)]
public class MyExtractor : IExtractor
{ ...
现在,当一个顶点有3GB的数据时,我们目前将UDO(如提取器)的内存大小限制为500MB。因此,如果您以需要大量内存的方式处理XML,则当前仍会出现System.OutOfMemory
错误。我们正在努力为UDO添加注释,让您指定内存要求以覆盖默认值,但此时仍在开发中。解决这个问题的唯一方法是使数据足够小,或者 - 例如在XML的情况下 - 使用不分配太多内存的流解析策略(例如,使用XML Reader接口)。