【问题标题】:Hash of File on Azure Data Lake StoreAzure Data Lake Store 上的文件哈希
【发布时间】:2018-08-14 15:29:35
【问题描述】:

我不熟悉使用 Azure Data Lake Store 和 Azure Analytics。

问题

有没有办法获取存储在 Azure Datalake 存储中的文件的哈希值?这样我就可以分析数据是否发生了变化

我有一堆以类似结构存储的输入文件

  • /输入/

    • Client-01/
    • 产品-A/
      • Input01.csv
  • /输入/

    • Client-02/
    • 产品-A/
      • Input01.csv
      • Input02.csv

我尝试了什么

第 1 部分

我能够在本地获取 Get-FileHash,但找不到任何用于 ADLS 的内容或任何与此类似的远程内容

Get-FileHash 
   "Input/Client-01/*.csv" -Algorithm MD5 | ConvertTo-Json >> statistics.json

生成类似的哈希

[
    {
        "Algorithm":  "MD5",
        "Hash":  "BA961B4B72DC602C2D2CA2B13EFC09DB",
        "Path":  "Input/Client-01/Input01.csv"
    },
    {
        "Algorithm":  "MD5",
        "Hash":  "B0528707D4E689EEEFE1AA1811063014",
        "Path":  "Input/Client-02/Input01.csv"
    },
    {
        "Algorithm":  "MD5",
        "Hash":  "60D71494355E7EE941782F1BE2969F3C",
        "Path":  "Input/Client-02/Input02.csv"
    }
]

第02部分

我能够使用

获得更多详细信息
Get-AzureRmDataLakeStoreChildItem -Account 
   $datalakeStoreName -Path 
   $path | ConvertTo-Json

导致

{
    "LastWriteTime":  "\/Date(1534185132238)\/",
    "LastAccessTime":  "\/Date(1534185132180)\/",
    "Expiration":  null,
    "Name":  "Input01.csv",
    "Path":  "/Input/Client-01/",
    "AccessTime":  1534185132180,
    "BlockSize":  268435456,
    "ChildrenNum":  null,
    "ExpirationTime":  null,
    "Group":  "e045d366-777b-4e7a-a01d-79dbf0e28a61",
    "Length":  127,
    "ModificationTime":  1534185132238,
    "Owner":  "3bb6c9c4-da61-4cc2-b6ef-f4739adafff5",
    "PathSuffix":  "Input01.csv",
    "Permission":  "770",
    "Type":  0,
    "AclBit":  true
}

缺点:

  • 没有散列:(
  • 按计划运行它会涉及到数据工厂上的批处理服务(从技术上讲,这不是一个缺点,但对我来说,因为我还投资于批处理服务......)

第 3 部分:使用 ADLS nuget

ADLS nuget 支持少数端点。我专门查看了DirectoryEntry,但是该模型没有公开其他端点中可用的BlockSize :(

https://github.com/Azure-Samples/data-lake-store-adls-dot-net-get-started/blob/master/AdlsSDKGettingStarted/Program.cs

private static void PrintDirectoryEntry(DirectoryEntry entry)
        {
            Console.WriteLine($"Name: {entry.Name}");
            Console.WriteLine($"FullName: {entry.FullName}");
            Console.WriteLine($"Length: {entry.Length}");
            Console.WriteLine($"Type: {entry.Type}");
            Console.WriteLine($"User: {entry.User}");
            Console.WriteLine($"Group: {entry.Group}");
            Console.WriteLine($"Permission: {entry.Permission}");
            Console.WriteLine($"Modified Time: {entry.LastModifiedTime}");
            Console.WriteLine($"Last Accessed Time: {entry.LastAccessTime}");
            Console.WriteLine();
        }

第 4 部分:使用 webHDFS API(有些工作)

https://docs.microsoft.com/en-us/rest/api/datalakestore/webhdfs-filesystem-apis

我能够使用op=LISTSTATUSdocumentation link 获得FileStatuses,它同时具有blocksizelength。所以这有点帮助

HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 427

{
  "FileStatuses":
  {
    "FileStatus":
    [
      {
        "accessTime"      : 1320171722771,
        "blockSize"       : 33554432,
        "group"           : "supergroup",
        "length"          : 24930,
        "modificationTime": 1320171722771,
        "owner"           : "webuser",
        "pathSuffix"      : "a.patch",
        "permission"      : "644",
        "replication"     : 1,
        "type"            : "FILE"
      },
      {
        "accessTime"      : 0,
        "blockSize"       : 0,
        "group"           : "supergroup",
        "length"          : 0,
        "modificationTime": 1320895981256,
        "owner"           : "username",
        "pathSuffix"      : "bar",
        "permission"      : "711",
        "replication"     : 0,
        "type"            : "DIRECTORY"
      },
      ...
    ]
  }
}

【问题讨论】:

    标签: powershell azure-data-lake azure-data-factory-2


    【解决方案1】:

    您是要确定文件是否已更改,还是要确定文件中已更改的行?如果要识别行更改,请使用 ADLA 作业运行 U-SQL 脚本或函数,该脚本或函数会创建行哈希。

    如果您想确定文件是否已更改,我怀疑您需要运行一个作业来遍历所有文件并为每个文件生成一个哈希值。然后,您可以将此值存储在另一个文件或表中,您可以在其中维护文件列表和历史哈希值。 这不是一个单一的步骤,Azure 数据工厂或 PowerShell Runbook 将是协调此过程的最佳方式。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-04-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多