2017-06-23 116 views
1

我有一个很大的blob存储空间,其中包含许多日志文件,这些日志文件按照其级别进行组织:存储库,分支,内部版本号,构建步骤号。Azure数据湖中的增量负载

这些是包含对象数组的JSON文件,每个对象都有一个timestampentry值。我已经实现了一个自定义提取器(扩展为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"); 

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

(它的工作,然而,当我处理一个单一的构建,使{步}作为唯一的通配符,进行硬编码名称的其余部分。)

问:是否有办法在许多作业中执行这样的负载 - 但不需要显式(手动)“分区”输入文件列表?

增量负载

假设为我成功地加载这些文件片刻。但是,从现在起几天我需要执行更新 - 我该如何指定文件列表?我有一个保留所有元数据的SQL Server数据库,并且我可以提取确切的日志文件路径 - 但U-SQL的EXTRACT查询强制我提供一个指定输入数据的静态字符串。

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

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

回答

0

为了解决第二个问题:

你可以使用一个联合查询的SQL Server数据库中读取数据,然后利用这些信息与您从文件集创建虚拟列的连接。问题在于,只有在执行时才知道这些值,而不是在编译时,所以你不会减少访问的文件。

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

至于基于创建时间选择文件的能力:这是我们积压的功能。我会建议upvote并添加评论以下功能请求:https://feedback.azure.com/forums/327234-data-lake/suggestions/10948392-support-functionality-to-handle-file-properties-fr并添加一个评论,你也想通过文件集查询他们。

+1

这正是我们现在计划要做的事情:拥有一个C#服务,用于查询我们的SQL Server并生成包含硬编码文件路径的U-SQL脚本。它没有一个脚本来完成这项工作的优雅,但肯定是可行的。 – lbartnik

1

对于您的第一个问题:听起来像您的FileSet模式正在生成大量的输入文件。为了解决这个问题,你可能想尝试这是在U型SQL预览文件的文件集V2预览功能在部分: https://github.com/Azure/AzureDataLake/blob/master/docs/Release_Notes/2017/2017_04_24/USQL_Release_Notes_2017_04_24.md

输入文件秤幅​​度较好(选择在声明顺序现在提供 )

之前,EXTRACT表达式上的U-SQL文件集模式在编译时间超时时间为 时会超过800到5000个文件。

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

例如,为U-SQL脚本查询我们的遥测 系统超过2500个文件,以前需要花费10分钟来编译,现在编译于1 分钟和脚本使用在第9分钟,现在执行35 分钟,而不是少得多的AU。我们还编译了脚本,可以访问30'000个文件。

SET @@ FeaturePreviews = “FileSetV2Dot5:在”

预览功能,可以通过添加以下语句 到你的脚本被打开;

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

我对你的第二个问题没有很好的回答,所以我会让同事回复。希望第一部分能够让你现在畅通无阻。

+0

嘿,谢谢!我试了一下,它确实修复了编译超时。我现在正在运行这个工作,并且在最后一次处理Azure Blob存储的数据超过2GB。有什么方法可以将执行节点添加到该作业中吗?我知道我可以设置虚拟机的限制和“并行性” - 但我没有看到如何提升特定工作的说明。 – lbartnik

+0

当您提交查询(作业)时,您可以指定并行度单位。在Visual Studio中,你可以选择提交按钮旁边的下拉菜单,选择“高级...”,你会看到一个并行滑块。在Powershell中,您可以使用“-DegreeOfParallelism”选项并指定一个int(请参阅https://docs.microsoft.com/en-us/powershell/module/azurerm.datalakeanalytics/Submit-AzureRmDataLakeAnalyticsJob?view=azurermps-4.1.0 )。 – OmidA