【问题标题】:How to enable parallelism for a custom U-SQL Extractor如何为自定义 U-SQL 提取器启用并行性
【发布时间】:2017-03-13 16:35:34
【问题描述】:

我正在为我们的内部文件格式(二进制序列化)实现一个自定义 U-SQL 提取器。它在“原子”模式下运行良好:

[SqlUserDefinedExtractor(AtomicFileProcessing = true)]
public class BinaryExtractor : IExtractor

如果我关闭“Atomic”模式,看起来 U-SQL 会在随机位置拆分文件(我猜只是 250MB 块)。这对我来说是不能接受的。文件格式有一个特殊的行分隔符。我可以在我的提取器中定义一个自定义行分隔符并为其启用并行性吗?从技术上讲,如果有帮助的话,我可以将我们的行分隔符更改为新的分隔符。 有人可以帮我解决这个问题吗?

【问题讨论】:

    标签: azure-data-lake u-sql


    【解决方案1】:

    该文件确实被分成了多个块(我认为目前是 1 GB,但确切的值是实现定义的,并且可能会因性能原因而改变)。

    如果文件确实是行分隔的,并且假设该行的原始输入数据小于 4MB,则可以使用 UDO 中的 input.Split() 函数将其拆分为行。如果原始输入数据跨越块边界(假设小于 4MB),调用将自动处理这种情况。

    Here 是一个例子:

    public override IEnumerable<IRow> Extract(IUnstructuredReader input, IUpdatableRow outputrow)
    {
       // this._row_delim = this._encoding.GetBytes(row_delim); in class ctor
       foreach (Stream current in input.Split(this._row_delim))
       {
           using (StreamReader streamReader = new StreamReader(current, this._encoding))
           {
               int num = 0;
               string[] array = streamReader.ReadToEnd().Split(new string[]{this._col_delim}, StringSplitOptions.None);
               for (int i = 0; i < array.Length; i++)
               {
                  // DO YOUR PROCESSING
               }
           }
           yield return outputrow.AsReadOnly();
        }
    }
    

    请注意,您自己无法跨块边界进行读取,您应该确保您的数据确实可以拆分为行。

    【讨论】:

    • 谢谢迈克尔这么快的回答!它对我们有用。此外,我们将它用于我们的 Avro Extractor,它从 Avro 格式的文件中提取数据。
    • 我在这里还有一个问题:我们可以增加分配用于使用提取器提取文件的顶点数吗?例如,U-SQL 分配 3 个顶点用于从 2.5GB 文件中提取数据,但我们知道我们可以在 8 个 AU 上更快地处理文件。
    • 目前没有办法表明这一点。如果您觉得这是一项缺失的功能,请通过 aka.ms/adlfeedback 提交功能请求。
    • @ValeriIlyin 你能分享/链接到你的 AvroExtractor 的代码吗? MS示例有一些缺点,例如缺乏并行性
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多