Hadoop Azure Data Lake 支持

简介

hadoop-azure-datalake 模块提供对 Azure Data Lake Store 集成的支持。此支持通过 JAR 文件 azure-datalake-store.jar 提供。

相关文档

功能

  • 读取和写入存储在 Azure Data Lake Storage 帐户中的数据。
  • 使用 URL 引用文件系统路径,使用 adl 方案进行安全 Webhdfs(即 SSL 加密访问)。
  • 可以在 MapReduce 作业中充当数据源或接收器。
  • 已在 Linux 和 Windows 上进行测试。
  • 已针对规模进行测试。
  • API setOwner()setAclremoveAclEntries()modifyAclEntries() 接受 UPN 或 OID(对象 ID)作为用户和组名称。
  • 支持按帐户配置。

限制

对以下操作的部分或不支持

  • 符号链接上的操作
  • 代理用户
  • 文件截断
  • 文件校验和
  • 文件复制因子
  • Hadoop 集群上活动用户的 Home 目录。
  • 扩展属性 (XAttrs) 操作
  • 快照操作
  • 委派令牌操作
  • listStatus()getFileStatus() 返回的用户和组信息采用与 Azure Active Directory 中关联的 GUID 形式。

用法

概念

Azure Data Lake Storage 访问路径语法为

adl://<Account Name>.azuredatalakestore.net/

有关使用存储的详细信息,请参阅 使用 Azure 门户开始使用 Azure Data Lake Store

OAuth2 支持

使用 Azure Data Lake Storage 需要根据 OAuth2 规范在 HTTPS 标头中提供 OAuth2 持有者令牌。必须从 Azure Active Directory 服务获取有效的 OAuth2 持有者令牌,以供有权访问 Azure Data Lake Storage 帐户的有效用户使用。

Azure Active Directory (Azure AD) 是 Microsoft 的多租户云目录和标识管理服务。请参阅 什么是 ActiveDirectory

以下部分介绍了 core-site.xml 中的 OAuth2 配置。

配置凭据和文件系统

可以使用刷新令牌(与用户关联)或客户端凭据(类似于服务主体)来配置凭据。

使用刷新令牌

将以下属性添加到集群的 core-site.xml

<property>
  <name>fs.adl.oauth2.access.token.provider.type</name>
  <value>RefreshToken</value>
</property>

应用程序必须从与客户端 ID 关联的 Azure Active Directory 服务设置客户端 ID 和 OAuth2 刷新令牌。请参阅 适用于 Java 的 Active Directory 库

不要共享客户端 ID 和刷新令牌,必须对其保密。

<property>
  <name>fs.adl.oauth2.client.id</name>
  <value></value>
</property>

<property>
  <name>fs.adl.oauth2.refresh.token</name>
  <value></value>
</property>

使用客户端密钥

生成服务主体
  1. 转到 门户
  2. 在左侧导航栏中的服务下,查找 Azure Active Directory 并单击它。
  3. 在菜单中使用“应用程序注册”,创建“Web 应用程序”。记住您在此处创建的名称 - 这是您将作为授权用户添加到您的 ADL 帐户的内容。
  4. 完成向导
  5. 创建应用程序后,转到应用程序“设置”下的“密钥”
  6. 选择密钥持续时间并点击保存。保存生成的密钥。
  7. 返回到应用程序注册页面,并点击顶部的“终结点”按钮。记下“令牌终结点”URL
  8. 记下您需要进行身份验证的属性
    • 您在上面创建的 Web 应用程序的“应用程序 ID”
    • 您刚刚在上面生成的密钥
    • 令牌终结点
将服务主体添加到您的 ADL 帐户
  1. 再次转到门户,并打开您的 ADL 帐户
  2. 选择访问控制 (IAM)
  3. 添加您在上面第 6 步中创建的用户名(注意它不会显示在列表中,但如果搜索名称,则会找到它)
  4. 添加“所有者”角色
配置 core-site.xml

将以下属性添加到您的core-site.xml

<property>
  <name>fs.adl.oauth2.access.token.provider.type</name>
  <value>ClientCredential</value>
</property>

<property>
  <name>fs.adl.oauth2.refresh.url</name>
  <value>TOKEN ENDPOINT FROM STEP 7 ABOVE</value>
</property>

<property>
  <name>fs.adl.oauth2.client.id</name>
  <value>CLIENT ID FROM STEP 7 ABOVE</value>
</property>

<property>
  <name>fs.adl.oauth2.credential</name>
  <value>PASSWORD FROM STEP 7 ABOVE</value>
</property>

使用 MSI(托管服务标识)

Azure VM 可以使用 VM 中的标识扩展管理的“服务标识”进行预配。这样做的优点是凭据由扩展管理,并且不必放入 core-site.xml。

要使用 MSI,请修改 VM 部署模板以使用标识扩展。注意您在模板中指定的端口号:这是标识扩展在 VM 中向本地主机公开的令牌服务 REST 终结点的端口号。建议的默认端口号为 50342 - 如果使用建议的端口号,则可以在配置中省略下面的 msi.port 设置。

配置 core-site.xml

将以下属性添加到您的core-site.xml

<property>
  <name>fs.adl.oauth2.access.token.provider.type</name>
  <value>Msi</value>
</property>

<property>
  <name>fs.adl.oauth2.msi.port</name>
  <value>PORT NUMBER FROM ABOVE (if different from the default of 50342)</value>
</property>

使用设备代码身份验证进行交互式登录

注意:此身份验证方法适用于运行交互式工具,但对提交到群集的任务不起作用。

为了使用基于用户的登录,Azure ActiveDirectory 提供了使用设备代码的登录流。

要使用设备代码流,用户必须首先在 Azure 门户中创建一个本机应用程序注册,并将应用程序的客户端 ID 作为配置提供。以下是步骤

  1. 转到 门户
  2. 在左侧导航中的服务下,查找 Azure Active Directory 并点击它。
  3. 在菜单中使用“应用程序注册”,创建“本机应用程序”。
  4. 完成向导
  5. 创建应用程序后,记下应用程序的“应用程序 ID”
  6. 授予应用程序权限
    1. 点击应用程序的“权限”,然后添加“Azure Data Lake”和“Windows Azure 服务管理 API”权限
    2. 点击“授予权限”以将权限添加到应用程序

将以下属性添加到您的core-site.xml

<property>
  <name>fs.adl.oauth2.devicecode.clientappid</name>
  <value>APP ID FROM STEP 5 ABOVE</value>
</property>

通常不建议将 DeviceCode 添加为默认令牌提供程序类型。但它可以在使用本地命令时使用

 hadoop fs -Dfs.adl.oauth2.access.token.provider.type=DeviceCode -ls ...

运行此命令将打印一个 URL 和设备代码,可用于从任何浏览器(甚至在不同的计算机上,在 ssh 会话之外)登录。一旦登录完成,该命令将继续执行。

使用凭据提供程序保护凭据

在许多 Hadoop 集群中,core-site.xml 文件是世界可读的。为了保护这些凭据,建议您使用凭据提供程序框架安全地存储和访问它们。

所有 ADLS 凭据属性都可以通过凭据提供程序进行保护。有关凭据提供程序 API 的其他阅读内容,请参阅 凭据提供程序 API

预配
hadoop credential create fs.adl.oauth2.client.id -value 123
    -provider localjceks://file/home/foo/adls.jceks
hadoop credential create fs.adl.oauth2.refresh.token -value 123
    -provider localjceks://file/home/foo/adls.jceks
配置 core-site.xml 或命令行属性
<property>
  <name>fs.adl.oauth2.access.token.provider.type</name>
  <value>RefreshToken</value>
</property>
<property>
  <name>hadoop.security.credential.provider.path</name>
  <value>localjceks://file/home/foo/adls.jceks</value>
  <description>Path to interrogate for protected credentials.</description>
</property>
运行 DistCp
hadoop distcp
    [-D fs.adl.oauth2.access.token.provider.type=RefreshToken
     -D hadoop.security.credential.provider.path=localjceks://file/home/user/adls.jceks]
    hdfs://<NameNode Hostname>:9001/user/foo/srcDir
    adl://<Account Name>.azuredatalakestore.net/tgtDir/

注意:您可以选择将提供程序路径属性添加到 distcp 命令行,而不是将特定于作业的配置添加到通用 core-site.xml。上面的方括号说明了此功能。`

访问 adl URL

core-site.xml 中配置凭据后,任何 Hadoop 组件都可以使用以下格式的 URL 引用该 Azure Data Lake Storage 帐户中的文件

adl://<Account Name>.azuredatalakestore.net/<path>

方案 adl 标识由 Azure Data Lake Storage 支持的 Hadoop 兼容文件系统上的 URL。adl 利用加密的 HTTPS 访问与 Azure Data Lake Storage API 的所有交互。

例如,以下 文件系统 Shell 命令演示了如何访问名为 youraccount 的存储帐户。

hadoop fs -mkdir adl://yourcontainer.azuredatalakestore.net/testDir

hadoop fs -put testFile adl://yourcontainer.azuredatalakestore.net/testDir/testFile

hadoop fs -cat adl://yourcontainer.azuredatalakestore.net/testDir/testFile
test file content

用户/组表示

hadoop-azure-datalake 模块提供对在 getFileStatus()listStatus()getAclStatus() 调用期间如何表示用户/组信息进行配置的支持。

将以下属性添加到 core-site.xml

<property>
  <name>adl.feature.ownerandgroup.enableupn</name>
  <value>true</value>
  <description>
    When true : User and Group in FileStatus/AclStatus response is
    represented as user friendly name as per Azure AD profile.

    When false (default) : User and Group in FileStatus/AclStatus
    response is represented by the unique identifier from Azure AD
    profile (Object ID as GUID).

    For performance optimization, Recommended default value.
  </description>
</property>

不同 ADL 帐户的配置

可以通过不同的 ADL 客户端配置访问不同的 ADL 帐户。这也允许使用不同的登录详细信息。

  1. 所有 fs.adl 选项均可在每个帐户的基础上进行设置。
  2. 通过将选项上的 fs.adl. 前缀替换为 fs.adl.account.ACCOUNTNAME. 来设置特定于帐户的选项,其中 ACCOUNTNAME 是帐户的名称。
  3. 连接到帐户时,所有显式设置的选项都将覆盖基本 fs.adl. 值。

例如,配置可以具有使用公共帐户 adl://<some-public-account>.azuredatalakestore.net/ 的基本配置,以及使用某些专用帐户 adl://myprivateaccount.azuredatalakestore.net/ 的特定于帐户的配置

<property>
  <name>fs.adl.oauth2.client.id</name>
  <value>CLIENTID</value>
</property>

<property>
  <name>fs.adl.oauth2.credential</name>
  <value>CREDENTIAL</value>
</property>

<property>
  <name>fs.adl.account.myprivateaccount.oauth2.client.id</name>
  <value>CLIENTID1</value>
</property>

<property>
  <name>fs.adl.account.myprivateaccount.oauth2.credential</name>
  <value>CREDENTIAL1</value>
</property>

测试 azure-datalake-store 模块

hadoop-azure 模块包括一整套单元测试。通过运行 mvn test,大多数测试都可以在不进行其他配置的情况下运行。这包括针对模拟存储的测试,模拟存储是 Azure Data Lake Storage 的内存仿真。

可以选择针对 Azure Data Lake Storage 运行测试。要运行这些测试,请使用上述部分中提到的 Adl 帐户信息和以下属性创建 src/test/resources/auth-keys.xml

<property>
    <name>fs.adl.test.contract.enable</name>
    <value>true</value>
</property>

<property>
    <name>test.fs.adl.name</name>
    <value>adl://yourcontainer.azuredatalakestore.net</value>
</property>