在 Azure blob 存储中创建测试数据容器
Creating a test-data container in Azure blob storage
我正在向我当前的项目添加一些测试,该项目使用 Azure blob 存储来存储来自流分析作业的遥测数据。我想测试获取遥测数据的例程,因此我为测试数据创建了一个单独的容器。我下载了一组示例数据,修改了数据以满足我的需要,然后将所有内容重新上传(使用 Azure 存储资源管理器)到新容器中。
测试立即失败,我很快发现这是因为文件的 LastModified 日期更改为上传的 date/time。这很好,但上传的顺序也不同。我的代码使用文件的修改日期来找出哪个是最新的,现在 return 一个基于新日期的不同文件。
我发现您无法修改此 属性,但您可以更改另一个 属性 以使其更新。所以我知道解决方案:我可以编写一个快速脚本,从我的生产实例中获取文件序列,然后以相同的序列接触测试实例中的每个文件。
但是...我想知道这是否是最佳选择。我还读到 'best practice' 将自定义日期时间存储在单独的 属性 中,但我认为我不能直接从流分析(正在编写 blob)中做到这一点。我还考虑过使用 Azure Function 来执行此操作(new blob => update 属性),但我不想增加复杂性和可能因任何原因而失败的东西。
所以我正在寻找解决这个问题的最佳方法。有人吗?
更新: 这个可能需要更多的解释。除了使用 LastModified 日期进行排序外,我还使用它来过滤 blob。 blob 本身是包含 ASA 输出数据的 CSV 文件,因此是遥测记录。每条记录都有一个时间戳,但该信息在文件中。检索数据时,我不想深入每个文件来找出这些记录的时间戳。所以我使用预过滤器过滤掉某个时间跨度内的blob,然后只下载/打开那些文件到里面的记录。
只要您不触摸任何 blob,它就可以完美运行,但很明显,无论出于何种原因,一旦任何 blob 被修改,它就会停止工作。所以我现在确信我需要一种不同的/更好的方法来解决这个问题;但是怎么办?
在我看来,您有两个独立的东西:要存储在 blob 存储中的数据和有关 blob 的元数据,例如时间戳。我会为元数据创建一个不同的(天蓝色)数据库,或者更简单的只是将元数据添加到(块)blob:
blockBlob.Metadata.Add("from", dateTime.ToString());
blockBlob.Metadata.Add("to", dateTime.ToString());
blockBlob.Metadata.Add("order", "1");
为了排序,我只添加一个简单的顺序 属性。
@Vignesh 的评论在这里值得称赞,但为了获得这个明确的答案,我将自己提供。
使用 ASA,您可以将输出设置为 date/time 的结构。这意味着在这种情况下,数据将写入具有如下目录结构的 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 设置一个单独的 'index' 来跟踪它们的日期时间当然也可以,但会增加复杂性,在这种情况下我并不真正需要。
我正在向我当前的项目添加一些测试,该项目使用 Azure blob 存储来存储来自流分析作业的遥测数据。我想测试获取遥测数据的例程,因此我为测试数据创建了一个单独的容器。我下载了一组示例数据,修改了数据以满足我的需要,然后将所有内容重新上传(使用 Azure 存储资源管理器)到新容器中。
测试立即失败,我很快发现这是因为文件的 LastModified 日期更改为上传的 date/time。这很好,但上传的顺序也不同。我的代码使用文件的修改日期来找出哪个是最新的,现在 return 一个基于新日期的不同文件。
我发现您无法修改此 属性,但您可以更改另一个 属性 以使其更新。所以我知道解决方案:我可以编写一个快速脚本,从我的生产实例中获取文件序列,然后以相同的序列接触测试实例中的每个文件。
但是...我想知道这是否是最佳选择。我还读到 'best practice' 将自定义日期时间存储在单独的 属性 中,但我认为我不能直接从流分析(正在编写 blob)中做到这一点。我还考虑过使用 Azure Function 来执行此操作(new blob => update 属性),但我不想增加复杂性和可能因任何原因而失败的东西。
所以我正在寻找解决这个问题的最佳方法。有人吗?
更新: 这个可能需要更多的解释。除了使用 LastModified 日期进行排序外,我还使用它来过滤 blob。 blob 本身是包含 ASA 输出数据的 CSV 文件,因此是遥测记录。每条记录都有一个时间戳,但该信息在文件中。检索数据时,我不想深入每个文件来找出这些记录的时间戳。所以我使用预过滤器过滤掉某个时间跨度内的blob,然后只下载/打开那些文件到里面的记录。
只要您不触摸任何 blob,它就可以完美运行,但很明显,无论出于何种原因,一旦任何 blob 被修改,它就会停止工作。所以我现在确信我需要一种不同的/更好的方法来解决这个问题;但是怎么办?
在我看来,您有两个独立的东西:要存储在 blob 存储中的数据和有关 blob 的元数据,例如时间戳。我会为元数据创建一个不同的(天蓝色)数据库,或者更简单的只是将元数据添加到(块)blob:
blockBlob.Metadata.Add("from", dateTime.ToString());
blockBlob.Metadata.Add("to", dateTime.ToString());
blockBlob.Metadata.Add("order", "1");
为了排序,我只添加一个简单的顺序 属性。
@Vignesh 的评论在这里值得称赞,但为了获得这个明确的答案,我将自己提供。
使用 ASA,您可以将输出设置为 date/time 的结构。这意味着在这种情况下,数据将写入具有如下目录结构的 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 设置一个单独的 'index' 来跟踪它们的日期时间当然也可以,但会增加复杂性,在这种情况下我并不真正需要。