在 HDInsight 中上传 Apache Hadoop 作业的数据

Azure HDInsight 提供一个基于 Azure 存储和 Azure Data Lake Storage (Gen2) 的功能完备的 Hadoop 分布式文件系统 (HDFS)。 Azure 存储以及 Data Lake Storage Gen2 设计为 HDFS 扩展,为客户提供无缝体验。 它们通过启用 Hadoop 生态系统中的整套组件以直接操作其管理的数据。 Azure 存储、Data Lake Storage Gen1 和 Data lake Storage Gen2 是独特的文件系统,并且已针对数据的存储和计算进行了优化。 若要了解使用 Azure 存储的益处,请参阅将 Azure 存储与 HDInsight 配合使用

先决条件

在开始下一步之前,请注意以下要求:

将数据上传到 Azure 存储

实用程序

Microsoft 提供以下实用工具用于操作 Azure 存储:

工具 Linux OS X Windows
Azure 门户
Azure CLI
Azure PowerShell
AzCopy
Hadoop 命令

Note

Hadoop 命令仅在 HDInsight 群集上可用。 使用该命令只能将数据从本地文件系统载入 Azure 存储。

Hadoop 命令行

仅当数据已存在于群集头节点中时,才可以使用 Hadoop 命令行将数据存储到 Azure 存储 Blob。

若要使用 Hadoop 命令,必须先通过 SSH 或 PuTTY 连接到头节点。

连接之后,可以使用以下语法将文件上传到存储。

hadoop -copyFromLocal <localFilePath> <storageFilePath>

例如: hadoop fs -copyFromLocal data.txt /example/data/data.txt

由于 HDInsight 的默认文件系统在 Azure 存储中,/example/data.txt 实际是在 Azure 存储中。 也可以将该文件表示为:

wasb:///example/data/data.txt

wasb://<ContainerName>@<StorageAccountName>.blob.core.chinacloudapi.cn/example/data/davinci.txt

若要查看可用于文件的其他 Hadoop 命令的列表,请参阅 https://hadoop.apache.org/docs/current/hadoop-project-dist/hadoop-common/FileSystemShell.html

Warning

在 Apache HBase 群集上,写入数据为 256 KB 时会使用默认块大小。 虽然在使用 HBase Api 或 REST API 时可良好运行,但使用 hadoophdfs dfs 命令编写大于 ~12 GB 的数据会导致错误。 有关详细信息,请参阅本文的在 Blob 上编写时的存储异常部分。

图形客户端

还有一些应用程序可提供用于 Azure 存储的图形界面。 下表是其中一些应用程序的列表:

客户端 Linux OS X Windows
用于 HDInsight 的 Microsoft Visual Studio Tools
Azure 存储资源管理器
Cerulea
CloudXplorer
适用于 Microsoft Azure 的 CloudBerry Explorer
Cyberduck

将 Azure 存储装载为本地驱动器

请参阅将 Azure 存储装载为本地驱动器

使用服务上传

Apache Sqoop

Sqoop 是一种专用于在 Hadoop 和关系数据库之间传输数据的工具。 可以使用此工具将数据从关系数据库管理系统 (RDBMS)(如 SQL Server、MySQL 或 Oracle)中导入到 Hadoop 分布式文件系统 (HDFS),在 Hadoop 中使用 MapReduce 或 Hive 转换数据,然后回过来将数据导出到 RDBMS。

有关详细信息,请参阅将 Sqoop 与 HDInsight 配合使用

开发 SDK

还可以使用 Azure SDK 通过以下编程语言来访问 Azure 存储:

  • .NET
  • Java
  • Node.js
  • PHP
  • Python
  • Ruby

有关安装 Azure SDK 的详细信息,请参阅 Azure 下载

故障排除

写入 blob 时的存储异常

症状:使用 hadoophdfs dfs 命令在 HBase 群集上编写大于或等于 ~12 GB 的文件时,可能会遇到以下错误:

ERROR azure.NativeAzureFileSystem: Encountered Storage Exception for write on Blob : example/test_large_file.bin._COPYING_ Exception details: null Error Code : RequestBodyTooLarge
copyFromLocal: java.io.IOException
        at com.microsoft.azure.storage.core.Utility.initIOException(Utility.java:661)
        at com.microsoft.azure.storage.blob.BlobOutputStream$1.call(BlobOutputStream.java:366)
        at com.microsoft.azure.storage.blob.BlobOutputStream$1.call(BlobOutputStream.java:350)
        at java.util.concurrent.FutureTask.run(FutureTask.java:262)
        at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
        at java.util.concurrent.FutureTask.run(FutureTask.java:262)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
        at java.lang.Thread.run(Thread.java:745)
Caused by: com.microsoft.azure.storage.StorageException: The request body is too large and exceeds the maximum permissible limit.
        at com.microsoft.azure.storage.StorageException.translateException(StorageException.java:89)
        at com.microsoft.azure.storage.core.StorageRequest.materializeException(StorageRequest.java:307)
        at com.microsoft.azure.storage.core.ExecutionEngine.executeWithRetry(ExecutionEngine.java:182)
        at com.microsoft.azure.storage.blob.CloudBlockBlob.uploadBlockInternal(CloudBlockBlob.java:816)
        at com.microsoft.azure.storage.blob.CloudBlockBlob.uploadBlock(CloudBlockBlob.java:788)
        at com.microsoft.azure.storage.blob.BlobOutputStream$1.call(BlobOutputStream.java:354)
        ... 7 more

原因:HBase on HDInsight 群集在写入 Azure 存储时默认阻止 256KB 大小的块。 尽管这对 HBase API 或 REST API 来说可良好运行,但使用 hadoophdfs dfs 命令行实用工具时则会导致错误。

解决方法:使用 fs.azure.write.request.size 指定更大的块大小。 可以使用 -D 参数基于使用情况执行此操作。 以下命令是将此参数用于 hadoop 命令的示例:

hadoop -fs -D fs.azure.write.request.size=4194304 -copyFromLocal test_large_file.bin /example/data

还可使用 Apache Ambari 以全局方式增加 fs.azure.write.request.size 的值。 可以使用以下步骤在 Ambari Web UI 中更改该值:

  1. 在浏览器中,转到群集的 Ambari Web UI。 该地址为 https://CLUSTERNAME.azurehdinsight.cn,其中“CLUSTERNAME”是群集名称。

    出现提示时,输入群集的管理员名称和密码。

  2. 在屏幕左侧选择“HDFS”,然后选择“配置”选项卡。

  3. 在“筛选...”字段中输入 fs.azure.write.request.size。 这会在页面中间显示字段和当前值。

  4. 将值从 262144 (256KB) 更改为新的值。 例如,4194304 (4MB)。

通过 Ambari Web UI 更改值的图像

有关如何使用 Ambari 的详细信息,请参阅使用 Apache Ambari Web UI 管理 HDInsight 群集

后续步骤

现在,已了解如何将数据导入 HDInsight,请阅读以下文章了解如何执行分析: