【问题标题】:Incremental load in Azure Data LakeAzure 数据湖中的增量负载
【发布时间】:2017-06-23 04:19:06
【问题描述】:

我有一个很大的 Blob 存储,里面装满了日志文件,这些日志文件根据它们的标识符在多个级别进行组织:存储库、分支、内部版本号、构建步骤号。

这些是包含对象数组的 JSON 文件,每个对象都有一个 timestamp 和一个 entry 值。我已经实现了一个自定义提取器(扩展 IExtractor),它接受一个输入流并生成许多纯文本行。

初始加载

现在我正在尝试将所有这些数据加载到 ADL 存储。我创建了一个类似于此的查询:

@entries =
  EXTRACT
    repo string,
    branch string,
    build int,
    step int,
    Line int,
    Entry string
  FROM @"wasb://my.blob.core.windows.net/{repo}/{branch}/{build}/{step}.json"
  USING new MyJSONExtractor();

当我运行这个提取查询时,我得到一个编译器错误 - 它超过了 25 分钟编译时间的限制。我的猜测是:文件太多。所以我在INSERT INTO 查询中添加了WHERE 子句:

INSERT INTO Entries
(Repo, Branch, Build, Step, Line, Entry)
SELECT * FROM @entries
WHERE (repo == "myRepo") AND (branch == "master");

仍然没有运气 - 编译器超时。

(但是,当我处理单个构建时,它确实有效,将 {step} 作为唯一的通配符,并对其余名称进行硬编码。)

问题:有没有办法在许多作业中执行类似的加载 - 但不需要显式(手动)“分区”输入文件列表?

增量加载

让我们暂时假设我成功加载了这些文件。但是,几天后我需要执行更新 - 我应该如何指定文件列表?我有一个保存所有元数据的 SQL Server 数据库,我可以提取准确的日志文件路径 - 但 U-SQL 的 EXTRACT 查询强制我提供一个指定输入数据的静态字符串。

一个简单的方案是为每个日期定义一个顶级目录并每天处理它们。但是系统的设计方式使这非常困难,如果不是不可能的话。

问题:有没有办法根据文件的创建时间来识别文件?或者也许有一种方法可以将 SQL Server 数据库的查询与提取查询结合起来?

【问题讨论】:

    标签: azure azure-data-lake u-sql


    【解决方案1】:

    对于您的第一个问题:听起来您的 FileSet 模式正在生成大量输入文件。为了解决这个问题,您可能需要尝试在 U-SQL 预览功能部分中记录的 FileSets v2 预览: https://github.com/Azure/AzureDataLake/blob/master/docs/Release_Notes/2017/2017_04_24/USQL_Release_Notes_2017_04_24.md

    输入文件集可以更好地扩展数量级(选择加入语句是 现在提供)

    以前,U-SQL 对 EXTRACT 表达式的文件集模式遇到了 编译超时大约 800 到 5000 个文件。

    U-SQL 的文件集模式现在可以扩展到更多文件并生成 更有效的计划。

    例如,一个 U-SQL 脚本在我们的遥测数据中查询超过 2500 个文件 系统以前编译需要 10 多分钟,现在编译 1 分钟,脚本现在在 9 分钟内执行,而不是超过 35 分钟 分钟使用更少的 AU。我们还编译了脚本 访问 30'000 个文件。

    添加如下语句即可开启预览功能 到你的脚本:

    SET @@FeaturePreviews = "FileSetV2Dot5:on";

    如果您想根据文件路径的分区生成多个提取语句,则必须使用一些外部代码来生成一个或多个 U-SQL 脚本。

    我对你的第二个问题没有很好的答案,所以我会请一位同事来回答。希望第一部分现在可以让您畅通无阻。

    【讨论】:

    • 嘿,谢谢!我试了一下,它确实修复了编译超时。我现在和过去都在运行这项工作,它是如何处理来自 Azure Blob 存储的略多于 2GB 的数据的。有没有办法将执行节点添加到该作业?我知道我可以为虚拟机和“并行性”设置限制——但我还没有看到关于如何提升特定工作的说明。
    • 提交查询(作业)时,您可以指定并行度单位。在 Visual Studio 中,您可以选择“提交”按钮旁边的下拉菜单,选择“高级...”,您将看到一个并行滑块。在 Powershell 中,您可以使用“-DegreeOfParallelism”选项并指定一个 int(请参阅docs.microsoft.com/en-us/powershell/module/…)。
    【解决方案2】:

    解决您的第二个问题:

    您可以使用联合查询从 SQL Server 数据库中读取数据,然后将这些信息与您从文件集创建的虚拟列结合使用。这样做的问题是这些值仅在执行时才知道,而不是在编译时知道,因此您不会减少访问的文件。

    或者,您可以编写一个 SQL 查询来获取您需要的数据,然后参数化您的 U-SQL 脚本,以便您可以将该信息传递到 U-SQL 脚本中。

    关于根据创建时间选择文件的能力:这是我们待办事项中的一项功能。我建议对以下功能请求进行投票并添加评论:https://feedback.azure.com/forums/327234-data-lake/suggestions/10948392-support-functionality-to-handle-file-properties-fr 并添加您想要通过文件集查询它们的评论。

    【讨论】:

    • 这正是我们现在计划做的:拥有一个 C# 服务来查询我们的 SQL Server 并生成带有硬编码文件路径的 U-SQL 脚本。它没有一个脚本来完成这项工作那么优雅,但肯定是可行的。
    猜你喜欢
    • 2020-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-27
    • 1970-01-01
    相关资源
    最近更新 更多