添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

Hadoop 分布式文件系统 (HDFS) 是一个基于 Java 的分布式文件系统,它提供可靠且可缩放的数据存储,可跨大型商品服务器群集。 本文概述了 HDFS 以及将其迁移到 Azure 的指南。

Apache ®、 Apache Spark® Apache Hadoop® Apache Hive 和火焰徽标是 Apache Software Foundation 在美国和/或其他国家/地区的商标或注册商标。 使用这些标记并不暗示获得 Apache Software Foundation 的认可。

HDFS 体系结构和组件

HDFS 具有主要/辅助设计。 在下图中,NameNode 是主节点,DataNode 是辅助节点。

  • NameNode 管理对文件和文件系统命名空间(即目录的层次结构)的访问。
  • 文件和目录是 NameNode 上的节点。 它们具有权限、修改和访问时间以及命名空间和磁盘空间的大小配额等属性。
  • 一个文件包含多个块。 默认块大小为 128 兆字节。 可以通过修改 hdfs-site.xml 文件为群集设置非默认块大小。
  • 文件的每个块在多个 DataNode 上独立复制。 复制因子的默认值为 3,但每个群集都可以有自己的非默认值。 复制因子可以随时更改。 更改会导致群集重新均衡。
  • NameNode 维护命名空间树和文件块到 DataNode(文件数据的物理位置)的映射。
  • HDFS 客户端读取文件时:
    1. 它会联系 NameNode,获取文件数据块的位置。
    2. 它从最近的 DataNode 读取块内容。
    3. HDFS 将整个命名空间保存在 RAM 中。
    4. DataNode 是对文件系统执行读取和写入操作的辅助节点,并执行创建、复制和删除等块操作。
    5. DataNode 包含保存所存储文件的校验和的元数据文件。 对于由 DataNode 托管的每个块副本,都有一个相应的元数据文件,其中包含有关副本的元数据,包括其校验和信息。 元数据文件具有与块文件相同的基名,扩展名为 .meta。
    6. DataNode 包含保存块数据的数据文件。
    7. 当 DataNode 读取文件时,它会从 NameNode 提取块位置和副本位置,并尝试从最近的位置读取。
    8. 每个 HDFS 群集都可以有数千个 DataNode 和数万个 HDFS 客户端。 每个 DataNode 可以同时执行多个应用程序任务。
    9. 当块写入 DataNode 时,端到端校验和计算将作为 HDFS 写入管道的一部分执行。
    10. HDFS 客户端是应用程序用于访问文件的客户端。
    11. 它是导出 HDFS 文件系统接口的代码库。
    12. 它支持读取、写入和删除文件的操作,以及创建和删除目录的操作。
    13. 当应用程序读取文件时,它会执行以下步骤:
      • 它从 NameNode 获取包含文件块的 DataNode 列表和位置。 该列表包括副本。
      • 它使用列表从 DataNodes 获取请求的块。
      • HDFS 提供公开文件块位置的 API。 这样,MapReduce 框架等应用程序就可以安排一个任务在数据所在的位置运行,以优化读性能。
      • Azure Blob File System (ABFS) 驱动程序提供了一个接口,使 Azure Data Lake Storage 能够充当 HDFS 文件系统。 下表比较了 ABFS 驱动程序和 Data Lake Storage 与 HDFS 的核心功能。

        ABFS 驱动程序和 Data Lake Storage 与 Hadoop 兼容的访问 可以像使用 HDFS 一样管理和访问数据。 ABFS 驱动程序可以在所有 Apache Hadoop 环境中使用(包括 Azure HDInsight 和 Azure Databricks)。 MapR 群集可以通过 hdfs:// 或 webhdfs:// 协议访问外部 HDFS 群集 POSIX 权限 Data Lake Gen2 的安全模型支持访问控制列表 (ACL) 和 POSIX 权限,以及特定于 Data Lake Storage Gen2 的一些额外粒度。 可以使用管理工具或 Apache Hive 和 Apache Spark 等框架来配置设置。 需要文件系统功能的作业(如严格原子目录重命名、精细的 HDFS 权限或 HDFS 符号链接)只能在 HDFS 上工作。 Data Lake Storage 提供低成本的存储容量和事务。 Azure Blob 存储生命周期可以随数据的生命周期进展调整计费率,从而降低成本。 优化的驱动程序 ABFS 驱动程序已针对大数据分析进行了优化。 相应的 REST API 通过分布式文件系统 (DFS) 终结点 dfs.core.windows.net 提供。 块相当于单个 Append API 调用(Append API 创建一个新块),并且每次调用限制为 100 MB。 但是,写入模式支持对每个文件调用 Append 多次(甚至并行),最多调用 50,000 次,然后调用 Flush(相当于 PutBlockList)。 这是实现 4.75 TB 最大文件大小的方法。 HDFS 将数据存储在数据块中。 通过设置 Hadoop 目录中 hdfs-site.xml 文件中的值来设置块大小。 默认大小为 128 MB。 默认 ACL 文件没有默认 ACL,默认情况下也没有启用。 文件没有默认 ACL。 二进制文件 可以将二进制文件移动到非分层命名空间中的 Azure Blob 存储。 Blob 存储中的对象可以通过 Azure 存储 REST API、Azure PowerShell、Azure CLI 或 Azure 存储客户端库访问。 客户端库适用于各种语言,包括 .NET、Java、Node.js、Python、Go、PHP 和 Ruby Hadoop 提供读取和写入二进制文件的功能。 SequenceFile 是包含二进制键值对的平面文件。 SequenceFile 提供编写器、读取器和排序器类,用于写入、读取和排序。 将图像或视频文件转换为 SequenceFile,并将其存储在 HDFS 中。 然后使用 HDFS SequenceFileReader/Writer 方法或 put 命令: bin/hadoop fs -put /src_image_file /dst_image_file Data Lake Storage 使用 POSIX 样式的模型,如果 ACL 控制对对象的访问,则其行为与 Hadoop 相同。 有关详细信息,请参阅 Data Lake Storage Gen2 中的访问控制列表 (ACL) 。 项的权限存储在项本身,而不是在项存在后继承。 只有在创建子项之前对父项设置了默认权限,才会继承权限。 Azure 存储帐户中的数据在主要区域中复制三次。 建议使用区域冗余存储进行复制。 它跨主要区域中的 3 个 Azure 可用性区域同步复制。 默认情况下,文件的复制因子为 3。 对于关键文件或经常访问的文件,较高的复制因子可提高容错能力并增加读取带宽。 在 Data Lake Store 的上下文中,不太可能需要粘滞位。 总之,如果目录上已启用粘滞位,子项只能由拥有子项的用户删除或重命名。 粘滞位不会显示在 Azure 门户中。 可以在目录上设置粘滞位,以防止除超级用户、目录所有者或文件所有者以外的任何人删除或移动目录中的文件。 为文件设置粘滞位不起作用。

        本地 HDFS 的常见挑战

        本地 HDFS 实现带来的许多挑战可能是考虑迁移到云的优势的理由:

      • HDFS 版本升级频繁
      • 数据量增加
      • 具有许多小型文件,增加了 NameNode 的压力,它控制群集中所有文件的元数据。 更多文件通常意味着当客户端读取文件时 NameNode 上有更多的读取流量,当客户端写入时调用更多。
      • 如果组织中的多个团队需要不同的数据集,则无法按用例或组织拆分 HDFS 群集。 结果是重复数据增加,这增加了成本并降低了效率。
      • 当 HDFS 群集纵向扩展或横向扩展时,NameNode 可能会成为性能瓶颈。
      • 在 Hadoop 2.0 之前,对 HDFS 群集的所有客户端请求都首先通过 NameNode,因为所有元数据都存储在单个 NameNode 中。 此设计使 NameNode 成为可能的瓶颈和单一故障点。 如果 NameNode 失败,群集不可用。
      • 迁移注意事项

        下面是计划将 HDFS 迁移到 Data Lake Storage 时需要考虑的一些重要事项:

      • 请考虑将小型文件中的数据聚合到 Data Lake Storage 上的单个文件中。
      • 列出 HDFS 中的所有目录结构,并在 Data Lake Storage 中复制类似的区域。 可以使用 hdfs -ls 命令获取 HDFS 的目录结构。
      • 列出 HDFS 群集中定义的所有角色,以便在目标环境中复制它们。
      • 请注意存储在 HDFS 中的文件的数据生命周期策略。
      • 请记住,HDFS 的某些系统功能在 Data Lake Storage 上不可用,包括:
        • 目录的严格原子重命名
        • 细化的 HDFS 权限
        • HDFS 符号链接
        • Azure 存储拥有异地冗余复制,但使用它并不总是明智的。 它确实提供数据冗余和地理恢复,但是向更远的位置进行故障转移会严重降低性能并产生额外的成本。 考虑为数据提供更高的可用性是否值得。
        • 如果文件的名称具有相同的前缀,HDFS 会将它们视为单个分区。 因此,如果使用 Azure 数据工厂,则所有数据移动单位 (DMU) 都将写入单个分区。
        • 如果使用数据工厂进行数据传输,请扫描除快照外的所有目录,并使用 hdfs du 命令查看目录大小。 如果有多个子目录和大量数据,请在数据工厂中启动多个复制活动。 例如,对每个子目录使用一个复制,而不是通过使用单个复制活动传输整个目录。
        • 数据平台通常用于长期保留可能已从记录系统中删除的信息。 应计划为已存档数据创建磁带备份或快照。 请考虑将信息复制到恢复站点。 通常,存档数据是出于合规性或历史数据目的。 在存档数据之前,应该有一个明确的理由来保留它。 此外,还应确定何时删除存档数据,并建立删除数据时应遵循的过程。
        • Data Lake Storage 存档访问层的低成本使其成为存档数据的一个有吸引力的选项。 有关详细信息,请参阅 存档访问层
        • 当 HDFS 客户端使用 ABFS 驱动程序访问 Blob 存储时,可能会出现客户端使用的方法不受支持,AzureNativeFileSystem 引发 UnsupportedOperationException 的情况。 例如,目前不支持 append(Path f, int bufferSize, Progressable progress) 。 若要检查与 ABFS 驱动程序相关的问题,请参阅 Hadoop 功能和修补程序
        • 有一个后移植版本的 ABFS 驱动程序可用于较旧的 Hadoop 群集。 有关详细信息,请参阅 ABFS 驱动程序的后移植
        • 在 Azure 虚拟网络环境中,DistCp 工具不支持与 Azure 存储虚拟网络终结点进行 Azure ExpressRoute 专用对等互连。 有关详细信息,请参阅 使用 Azure 数据工厂将数据从本地 Hadoop 群集迁移到 Azure 存储
        • 将 HDFS 迁移到 Data Lake Storage 的典型方法使用以下步骤:

          HDFS 评估

          本地评估脚本提供了有助于确定哪些工作负载可以迁移到 Azure 的信息,以及数据是一次全部迁移还是一次迁移一部分。 Unravel 等第三方工具可以提供指标并支持本地 HDFS 的自动评估。 规划时要考虑的一些重要因素包括:

        • 数据的所有权
        • 处理复杂性
        • 提取、转换和加载 (ETL) 复杂性
        • 个人身份信息 (PII) 和其他敏感数据
        • 根据此类因素,可以制定一个计划,将数据移动到 Azure,以最大程度地减少停机时间和业务中断。 也许敏感数据可以保留在本地。 在移动增量负载之前,可以移动和测试历史数据。

          以下决策流有助于确定要运行的条件和命令,以获取正确的信息。

          用于从 HDFS 获取评估指标的 HDFS 命令包括:

        • 列出位置中的所有目录:

          hdfs dfs -ls books

        • 以递归方式列出位置中的所有文件:

          hdfs dfs -ls -R books

        • 获取 HDFS 目录和文件的大小:

          hadoop fs -du -s -h command

          hadoop fs -du -s -h 命令显示 HDFS 文件和目录的大小。 由于 Hadoop 文件系统复制每个文件,因此文件的实际物理大小是文件副本数乘以一个副本的大小。

        • 确定是否启用 ACL。 为此,请获取 Hdfs-site.xml 中 dfs.namenode.acls.enabled 的值。 了解该值有助于在 Azure 存储帐户上计划访问控制。 有关此文件的内容的信息,请参阅 默认文件设置

          合作伙伴工具(如 Unravel)提供用于计划数据迁移的评估报告。 这些工具必须在本地环境中运行,或连接到 Hadoop 群集以生成报告。

        • 以下 Unravel 报告提供有关每个目录下的小文件的统计信息:

        • 以下报告提供有关每个目录下的文件的统计信息:

          必须按照迁移计划中所述将数据传输到 Azure。 传输需要以下活动:

        • 标识所有引入点。

          如果由于安全要求,无法直接将数据登陆到云,则本地可以充当中间登陆区域。 可以在数据工厂中生成管道,以便从本地系统拉取数据,或使用 AZCopy 脚本将数据推送到 Azure 存储帐户。

          常见引入源包括:

        • SFTP 服务器
        • 数据库引入
        • 数据库转储
        • 更改数据捕获
        • 计划所需的存储帐户数。

          若要计划所需的存储帐户数,请了解当前 HDFS 上的总负载。 可以使用 TotalLoad 指标,它是当前跨所有 DataNode 的并发文件访问数。 根据本地 TotalLoad 值和 Azure 上的预期增长,设置区域中存储帐户的限制。 如果可以增加限制,单个存储帐户可能就足够了。 但是,对于数据湖,最好为每个区域保留单独的存储帐户,以便为将来的数据量增长做好准备。 保留单独的存储帐户的其他原因包括:

        • 复原能力要求
        • 数据复制要求
        • 公开数据供公众使用
        • 在存储帐户上启用分层命名空间时,无法将其更改回平面命名空间。 备份和 VM 映像文件等工作负载不会从分层命名空间中获得任何好处。

          有关通过专用链接保护虚拟网络与存储帐户之间的流量的信息,请参阅 保护存储帐户

          有关 Azure 存储帐户默认限制的信息,请参阅 标准存储帐户的可伸缩性和性能目标 。 流入量限制适用于发送到存储帐户的数据。 流出量限制适用于从存储帐户接收的数据

        • 确定可用性要求。

          可以在 hdfs-site.xml 中指定 Hadoop 平台的复制因子,或逐个文件指定。 可以根据数据的性质在 Data Lake Storage 上配置复制。 如果应用程序要求在数据丢失的情况下重构数据,则区域冗余存储 (ZRS) 是一种选择。 在 Data Lake Storage ZRS 中,跨主要区域中的 3 个可用性区域同步复制数据。 对于需要高可用性且可在多个区域中运行的应用程序,请将数据复制到次要区域。 这是异地冗余复制。

        • 检查是否损坏或缺失块。

          检查块扫描程序报告是否损坏或缺失块。 如果有,请等待文件还原后再传输。

        • 检查是否已启用 NFS。

          通过检查 core-site.xml 文件,检查本地 Hadoop 平台上是否启用了 NFS。 它具有 nfsserver.groups 和 nfsserver.hosts 属性。

          NFS 3.0 功能在 Data Lake Storage 中处于预览状态。 尚不支持一些功能。 有关详细信息,请参阅 Azure Blob 存储的网络文件系统 (NFS) 3.0 协议支持

        • 检查 Hadoop 文件格式。

          使用以下决策流程图获取有关如何处理文件格式的指导。

        • 选择 Azure 数据传输解决方案。

          数据传输可以通过网络进行在线传输,也可以通过物理设备进行离线传输。 使用哪种方法取决于数据量、网络带宽和数据传输频率。 历史数据只需传输一次。 增量负载需要重复的持续传输。

          下面的列表中讨论了数据传输方法。 有关选择数据传输类型的详细信息,请参阅 选择 Azure 数据传输解决方案

        • Azcopy

          AzCopy 是一个命令行实用工具,可用于将文件从 HDFS 复制到存储帐户。 这是高带宽传输(超过 1 GBPS)的一个选项。

          下面是移动 HDFS 目录的示例命令:

          *azcopy copy "C:\local\path" "https://account.blob.core.windows.net/mycontainer1/?sv=2018-03-28&ss=bjqt&srt=sco&sp=rwddgcup&se=2019-05-01T05:01:17Z&st=2019-04-30T21:01:17Z&spr=https&sig=MGCXiyEzbtttkr3ewJIh2AR8KrghSy1DGM9ovN734bQF4%3D" --recursive=true*
          
        • DistCp

          DistCp 是 Hadoop 中的一个命令行实用工具,可在 Hadoop 群集中执行分布式复制操作。 DistCp 在 Hadoop 群集中创建多个映射任务,将数据从源复制到接收器。 当有足够的网络带宽时,此推送方法很好,并且不需要为数据迁移预配额外的计算资源。 但是,如果源 HDFS 群集已耗尽容量,并且无法添加其他计算,请考虑将数据工厂与 DistCp 复制活动配合使用来拉取文件,而不是推送文件。

          *hadoop distcp -D fs.azure.account.key.<account name>.blob.core.windows.net=<Key> wasb://<container>@<account>.blob.core.windows.net<path to wasb file> hdfs://<hdfs path>*
          
        • 用于大型数据传输的 Azure Data Box

          Azure Data Box 是一款从 Microsoft 订购的物理设备。 它提供大规模数据传输,当网络带宽有限且数据量很大时(例如,当容量介于几 TB 到几 PB 之间),它是脱机数据传输选项。

          将 Data Box 连接到 LAN 以将数据传输到 LAN。 然后将数据发送回 Microsoft 数据中心,在那里,Microsoft 工程师将数据传输到配置的存储帐户。

          有多个 Data Box 选项,它们因可以处理的数据量而异。 有关 Data Box 方法的详细信息,请参阅 Azure Data Box 文档 - 脱机传输

          数据工厂是一种数据集成服务,可帮助创建数据驱动的工作流,用于协调和自动化数据移动和数据转换。 当有足够的网络带宽可用并且需要协调和监视数据迁移时,可以使用它。 当增量数据作为第一跃点到达本地系统,并且由于安全限制而无法直接传输到 Azure 存储帐户时,可以使用数据工厂进行常规的增量数据加载。

          有关各种传输方法的详细信息,请参阅具有中高网络带宽的大型数据集的数据传输

          有关使用数据工厂从 HDFS 复制数据的信息,请参阅使用 Azure 数据工厂或 Synapse Analytics 从 HDFS 服务器复制数据

        • 合作伙伴解决方案,例如 WANdisco LiveData 迁移

          适用于 Azure 的 WANdisco LiveData Platform 是 Microsoft 用于从 Hadoop 迁移到 Azure 的首选解决方案之一。 可以使用 Azure 门户和 Azure CLI 访问其功能。 有关详细信息,请参阅使用适用于 Azure 的 WANdisco LiveData Platform 迁移 Hadoop 数据湖

        • Sunil Sattiraju | 高级云解决方案架构师
        • Amanjeet Singh | 首席项目经理
        • Nagaraj Seeplapudur Venkatesan | 高级云解决方案架构师 - 工程
        • 若要查看非公开的 LinkedIn 个人资料,请登录到 LinkedIn。

          Azure 产品简介

        • Azure Data Lake Storage Gen2 简介
        • Azure HDInsight 中的 Apache Spark 是什么
        • 什么是 Azure HDInsight 中的 Apache Hadoop?
        • Azure HDInsight 中的 Apache HBase 简介
        • 什么是 Azure HDInsight 中的 Apache Kafka
        • Azure 产品参考

        • Azure Active Directory 文档
        • Azure Cosmos DB 文档
        • Azure 数据工厂文档
        • Azure Databricks 文档
        • Azure 事件中心文档
        • Azure Functions 文档
        • Azure HDInsight 文档
        • Microsoft Purview 数据治理文档
        • Azure 流分析文档
        • Azure Synapse Analytics
        • 适用于 Azure HDInsight 的企业安全性套餐
        • 为 Apache Hadoop on HDInsight 开发 Java MapReduce 程序
        • 在 HDInsight 中将 Apache Sqoop 与 Hadoop 配合使用
        • Apache Spark 流式处理概述
        • 结构化流教程
        • 使用 Apache Kafka 应用程序中的 Azure 事件中心
        • Hadoop 迁移到 Azure
        • Apache HBase 迁移到 Azure
        • Apache Kafka 迁移到 Azure
        • Apache Sqoop 迁移到 Azure
  •