使用 DistCp 在 Azure 存储 Blob 和 Azure Data Lake Storage Gen1 之间复制数据
如果您的 HDInsight 群集可以访问 Azure Data Lake Storage Gen1,则可以使用像 DistCp 这样的 Hadoop 生态系统工具将数据在 HDInsight 群集存储 (WASB) 和 Data Lake Storage Gen1 帐户之间复制。 本文介绍如何使用 DistCp 工具。
先决条件
- Azure 订阅。 请参阅获取 Azure 免费试用版。
- Azure Data Lake Storage Gen1 帐户。 有关如何创建一个的说明,请参阅 Azure Data Lake Storage Gen1 入门。
- Azure HDInsight 群集 有权访问 Data Lake Storage Gen1 帐户。 请参阅 使用 Data Lake Storage Gen1创建 HDInsight 群集。 请确保对该群集启用远程桌面。
从 HDInsight Linux 群集使用 DistCp
HDInsight 群集附带 DistCp 工具,该工具可用于将数据从不同的源复制到 HDInsight 群集。 如果已将 HDInsight 群集配置为使用 Data Lake Storage Gen1 作为附加存储,则可以使用现成的 DistCp 将数据复制到 Data Lake Storage Gen1 帐户和从 Data Lake Storage Gen1 帐户复制数据。 在本部分中,我们将了解如何使用 DistCp 工具。
在桌面上,使用 SSH 连接到群集。 请参阅第 节,了解如何连接到基于 Linux 的 HDInsight 群集。 从 SSH 提示符运行命令。
验证是否可以访问 Azure 存储 Blob(WASB)。 运行下面的命令:
hdfs dfs –ls wasb://<container_name>@<storage_account_name>.blob.core.windows.net/
输出提供存储 Blob 中的内容列表。
同样,请验证是否可以从群集访问 Data Lake Storage Gen1 帐户。 运行下面的命令:
hdfs dfs -ls adl://<data_lake_storage_gen1_account>.azuredatalakestore.net:443/
输出提供 Data Lake Storage Gen1 帐户中的文件和文件夹列表。
使用 DistCp 将数据从 WASB 复制到 Data Lake Storage Gen1 帐户。
hadoop distcp wasb://<container_name>@<storage_account_name>.blob.core.windows.net/example/data/gutenberg adl://<data_lake_storage_gen1_account>.azuredatalakestore.net:443/myfolder
该命令将 WASB 中的 /example/data/gutenberg/ 文件夹的内容复制到 Data Lake Storage Gen1 帐户中的 /myfolder。
同样,使用 DistCp 将数据从 Data Lake Storage Gen1 帐户复制到 WASB。
hadoop distcp adl://<data_lake_storage_gen1_account>.azuredatalakestore.net:443/myfolder wasb://<container_name>@<storage_account_name>.blob.core.windows.net/example/data/gutenberg
该命令将 Data Lake Storage Gen1 帐户中 /myfolder 的内容复制到 WASB 中的 /example/data/gutenberg/ 文件夹中。
使用 DistCp 时的性能注意事项
由于 DistCp 工具的最低粒度是单个文件,因此设置最大同时复制数是针对 Data Lake Storage Gen1 优化它的最重要参数。 可以通过在命令行上设置映射器('m')参数的数量来控制同时复制的数目。 此参数指定用于复制数据的映射器的最大数目。 默认值为 20。
示例:
hadoop distcp wasb://<container_name>@<storage_account_name>.blob.core.windows.net/example/data/gutenberg adl://<data_lake_storage_gen1_account>.azuredatalakestore.net:443/myfolder -m 100
如何确定要使用的映射器数量
请参考下面的指导。
步骤 1:确定总 YARN 内存 - 第一步是确定运行 DistCp 作业的群集可用的 YARN 内存。 可在与群集关联的 Ambari 门户中获取此信息。 导航到 YARN 并查看 配置 选项卡以查看 YARN 内存。 若要获取总 YARN 内存,请将每个节点的 YARN 内存与群集中拥有的节点数相乘。
步骤 2:计算映射器数 - m 的值等于总 YARN 内存除以 YARN 容器大小的商。 YARN 容器大小信息也可以在 Ambari 门户中查看。 导航到 YARN 并查看 配置 选项卡。YARN 容器大小在此窗口中显示。 求得映射器数量(m)的公式为:
m = (number of nodes * YARN memory for each node) / YARN container size
示例:
假设群集中有四个 D14v2 节点,并且想要从 10 个不同的文件夹中传输 10 TB 的数据。 每个文件夹都包含不同数量的数据,并且每个文件夹中的文件大小也不同。
总 YARN 内存 - 在 Ambari 门户中,确定 D14 节点的 YARN 内存为 96 GB。 因此,具有 4 个节点的群集的总 YARN 内存是:
YARN memory = 4 * 96GB = 384GB
映射器数 - 在 Ambari 门户中,确定 D14 群集节点的 YARN 容器大小为 3072。 因此,映射器的数量为:
m = (4 nodes * 96GB) / 3072MB = 128 mappers
如果其他应用程序正在使用内存,您可以选择仅使用群集的部分 YARN 内存来执行 DistCp。
复制大型数据集
如果要移动的数据集的大小很大(例如,> 1 TB),或者如果你有许多不同的文件夹,请考虑使用多个 DistCp 作业。 可能没有性能提升,但它分散了作业,因此,如果任何作业失败,则只需重启该特定作业而不是整个作业。
局限性
DistCp 会尝试创建大小类似的映射器以优化性能。 增加映射器数不一定会提高性能。
DistCp 被限制为每个文件只有一个映射器。 因此,映射器数量不应超过文件数量。 由于 DistCp 只能向文件分配一个映射器,因此会限制可用于复制大型文件的并发量。
如果你有少量的大型文件,请将它们拆分为 256 MB 的文件区块,以提供更多潜在的并发性。
如果要从 Azure Blob 存储帐户复制,复制作业可能会在 Blob 存储端受到限制。 这会影响复制作业的性能。 若要详细了解 Azure Blob 存储的限制,请参阅 Azure 订阅和服务限制的 Azure 存储限制。