在Azure blob存储中创建测试数据容器

时间:2016-06-15 10:04:13

标签: azure-storage azure-storage-blobs azure-stream-analytics

我正在为我当前的项目添加一些测试,该项目使用Azure blob存储来存储来自流分析作业的遥测数据。我想测试获取遥测数据的例程,因此我为测试数据创建了一个单独的容器。我下载了一组示例数据,修改了数据以满足我的需求,并将所有内容重新上传(使用Azure存储资源管理器),然后重新上传到新容器中。

测试立即失败,我很快发现这是因为文件的LastModified日期变为上传的日期/时间。这很好,但上传的顺序也不同。我的代码使用文件的修改日期来找出哪一个是最新的,现在将根据新日期返回不同的文件。

我发现您无法修改此属性,但您可以更改其他属性以使其更新。所以我知道解决方案:我可以编写一个快速脚本,从生产实例中获取文件序列,然后以相同的顺序触摸测试实例中的每个文件。

但是......我想知道这是否是最好的选择。我还读到了将自定义日期时间存储在单独的属性中的“最佳实践”,但我认为我不能直接从Stream Analytics(编写blob)那样做。我还考虑使用Azure函数来执行此操作(new blob => update属性),但我不是要添加复杂性以及可能因任何原因而失败的内容。

所以我正在寻找解决这个问题的最佳方法。任何人吗?

更新:这个可能值得更多解释。除了使用LastModified日期进行排序之外,我还使用它来过滤blob。 blob本身是包含ASA输出数据的CSV文件,因此遥测记录。每条记录都有一个时间戳,但该信息在文件中。在检索数据时,我不想深入了解每个文件以找出这些记录的时间戳。因此,我使用预过滤器在特定时间范围内过滤掉blob,然后仅将这些文件下载/打开到内部记录中。

只要你没有碰到任何一个blob,它就能完美地工作,但显然它会在任何blob因任何原因被修改后立即停止工作。所以我现在确信我需要一种不同/更好的方法来解决这个问题;但怎么样?

2 个答案:

答案 0 :(得分:0)

在我看来,你有两个不同的东西:你想要存储在blob存储中的数据和关于blob的元数据,例如时间戳。我会为元数据创建一个不同的(天蓝色)数据库,甚至更简单的只是向(块)blob添加元数据:

blockBlob.Metadata.Add("from", dateTime.ToString());
blockBlob.Metadata.Add("to", dateTime.ToString());
blockBlob.Metadata.Add("order", "1");

对于排序我只想添加一个简单的订单属性。

答案 1 :(得分:0)

@Vignesh的评论值得信赖,但为了得到这个明显的答案,我将自己提供。

使用ASA,您可以将输出设置为按日期/时间构建。这意味着在这种情况下,数据将使用目录结构写入blob存储区,例如:

2016 / 06 / 27 / 15 / 23 (= 27-06-2016 15:23) 2016 / 06 / 28 / 11 / 02 (= 28-06-2016 11:02)

ASA输出允许您指定结构的粒度,在我的情况下,我选择按天存储它(因此不包括时间路径)。 ASA运行时现在将确保来自某个时间点的数据存储在位于正确路径中的blob中。

然后我随后将逻辑更改为再使用各个blob文件的日期时间戳,但只读取我感兴趣的时间范围内的文件夹中的文件。这确保我们只获得在该时间范围内生成的数据。如果文件夹中有多个文件,我需要加载它们,因为两者都在同一个时间范围内。只要分钟对你来说足够粒度,即使使用文件夹结构对这样的事情感觉有点奇怪,这也很有效。

对于跟踪日期时间的blob有一个单独的“索引”当然也会起作用,但会增加复杂性,在这种情况下我并不需要。