我有一个Azure Webjob,可以将大型CSV(500 MB到10+ GB)复制到SQL Azure表中。我每天都会获得一个新的CSV并且我只保留1个月的记录,因为将它们保存在SQL中是很昂贵的,所以它们非常不稳定。
为了让它们开始,我批量上传了上个月的数据(~200 GB),我看到所有30个CSV文件同时被处理。这会导致上传中非常疯狂的备份,如下图所示:
我有大约5页看起来像这样计算所有的重试。 如果我一次上传2个,一切都很棒!但是从运行时间可以看出,有些可能需要14个多小时才能完成。
我想要做的是批量上传30个CSV并让Webjob一次只处理3个文件,然后一旦完成,就开始下一个。这是否可以使用当前的SDK?
答案 0 :(得分:5)
是的,绝对可能。
假设您在这里使用的模式是使用在队列上弹出消息的Scheduled或On-Demand WebJobs,然后由持续运行的WebJob拾取,该WebJob处理来自队列的消息,然后执行您可以使用的工作JobHost.Queues.BatchSize属性,用于限制一次可以处理的队列消息数。 ħ
static void Main()
{
JobHostConfiguration config = new JobHostConfiguration();
//AzCopy cannot be invoked multiple times in the same host
//process, so read and process one message at a time
config.Queues.BatchSize = 1;
var host = new JobHost(config);
host.RunAndBlock();
}
如果你想看看它的实际效果,请随时克隆我最近发布的关于如何使用WebJobs和AzCopy创建自己的Blob备份服务的GitHub repo。我遇到了同样的问题,即我不能同时运行太多的工作。
https://github.com/markjbrown/AzCopyBackup
希望这有帮助。
编辑,我差点忘了。虽然您可以更改上面的BatchSize属性,但您也可以利用多个VM的主机并处理这些作业,这基本上允许您将其扩展为多个独立的并行进程。您可能会发现可以非常快速地扩展VM的数量并处理数据,而不必使用BatchSize来限制它。