Hadoop Azure 数据湖支持

简介

hadoop-azure-datalake模块提供了与Azure Data Lake Store集成的支持。该支持通过JAR文件azure-datalake-store.jar实现。

相关文档

功能特性

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

限制

以下操作部分或完全不支持:

  • 符号链接操作
  • 代理用户
  • 文件截断
  • 文件校验和
  • 文件副本因子
  • Hadoop集群上活跃用户的主目录。
  • 扩展属性(XAttrs)操作
  • 快照操作
  • 委托令牌操作
  • 用户和组信息以Azure Active Directory中关联的GUID形式返回,如listStatus()getFileStatus()所示。

使用说明

概念

Azure Data Lake Storage访问路径语法为:

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

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

OAuth2 支持

使用Azure Data Lake Storage需要按照OAuth2规范,在HTTPS头部包含一个OAuth2持有者令牌。有效的OAuth2持有者令牌必须从Azure Active Directory服务获取,且仅限拥有访问Azure Data Lake Storage账户权限的有效用户。

Azure Active Directory (Azure AD) 是微软的多租户云基础目录和身份管理服务。请参阅什么是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刷新令牌。请参阅Active Directory Library For Java

请勿共享客户端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. 返回应用注册页面,点击顶部的“终结点”按钮 a. 记录下“令牌终结点”URL
  8. Note down the properties you will need to auth:
    • 您在上面创建的Web应用的“Application ID”
    • 你刚刚在上面生成的密钥
    • 令牌端点
将服务主体添加到您的ADL账户
  1. 再次访问门户网站,并打开您的ADL账户
  2. 选择 Access control (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内的Identity扩展管理的"服务身份"。这样做的优势是凭据由扩展管理,无需放入core-site.xml中。

要使用MSI,需修改虚拟机部署模板以启用身份扩展。请注意在模板中指定的端口号:这是由虚拟机内身份扩展暴露给本地主机的令牌服务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. 应用创建完成后,请记录下该应用的“Application ID”
  6. Grant permissions to the app:
    1. 点击应用的“权限”,然后添加“Azure Data Lake”和“Windows Azure Service Management 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的信息,请参阅Credential Provider 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进行所有交互。

例如,以下FileSystem 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://.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运行一系列测试。要运行这些测试,请创建src/test/resources/auth-keys.xml文件,其中包含上述章节提到的Adl账户信息以及以下属性。

<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>