增加 U-SQL 1gb 的输入文件限制?
increase U-SQL 1gb limit on input file?
我的 U-SQL 输入文件大小似乎达到了 1GB upper-boundary。是否有这样的限制,如果有,如何增加?
简而言之,这是我的案例:
我正在开发自定义 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 片段是另一种选择,但我们不想创建 - 尤其是维护 - 太多自定义代码取决于在那些外部管理的模式上。
所以,提高upper-limit就好了。
我现在看到两个问题。一个我们可以解决,一个我们正在为今年晚些时候开发的功能。
默认情况下,U-SQL 假定您要扩展对文件的处理并将其拆分为 1GB "chunks" 以进行提取。如果您的提取器需要查看所有数据(例如,为了解析 XML 或 JSON 或图像),您需要将提取器标记为以原子方式处理文件(而不是拆分文件)以下方式:
[SqlUserDefinedExtractor(AtomicFileProcessing = true)]
public class MyExtractor : IExtractor
{ ...
现在,虽然一个顶点有 3GB 的数据,但我们目前将提取器等 UDO 的内存大小限制为 500MB。因此,如果您以需要大量内存的方式处理 XML,您目前仍会因 System.OutOfMemory
错误而失败。我们正在努力向 UDO 添加注释,让您指定内存要求以覆盖默认值,但目前仍在开发中。解决这个问题的唯一方法是使数据足够小,或者 - 例如 XML - 使用不会分配太多内存的流解析策略(例如,使用 XML Reader界面)。
我的 U-SQL 输入文件大小似乎达到了 1GB upper-boundary。是否有这样的限制,如果有,如何增加?
简而言之,这是我的案例:
我正在开发自定义 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 片段是另一种选择,但我们不想创建 - 尤其是维护 - 太多自定义代码取决于在那些外部管理的模式上。 所以,提高upper-limit就好了。
我现在看到两个问题。一个我们可以解决,一个我们正在为今年晚些时候开发的功能。
-
默认情况下,
U-SQL 假定您要扩展对文件的处理并将其拆分为 1GB "chunks" 以进行提取。如果您的提取器需要查看所有数据(例如,为了解析 XML 或 JSON 或图像),您需要将提取器标记为以原子方式处理文件(而不是拆分文件)以下方式:
[SqlUserDefinedExtractor(AtomicFileProcessing = true)] public class MyExtractor : IExtractor { ...
现在,虽然一个顶点有 3GB 的数据,但我们目前将提取器等 UDO 的内存大小限制为 500MB。因此,如果您以需要大量内存的方式处理 XML,您目前仍会因
System.OutOfMemory
错误而失败。我们正在努力向 UDO 添加注释,让您指定内存要求以覆盖默认值,但目前仍在开发中。解决这个问题的唯一方法是使数据足够小,或者 - 例如 XML - 使用不会分配太多内存的流解析策略(例如,使用 XML Reader界面)。