Hadoop 文档

General

Common

HDFS

MapReduce

MapReduce REST APIs

YARN

YARN REST APIs

YARN Service

Submarine

Hadoop Compatible File Systems

Auth

Tools

Reference

Configuration

也可以看看:

介绍

Hadoop的蔚蓝模块提供与集成支持Azure的Blob存储。名为hadoop-azure.jar的生成的 jar文件还声明了对它所需的其他工件的传递依赖关系,尤其是JavaAzure存储SDK

要使其成为Apache Hadoop的默认类路径的一部分,只需确保hadoop-env.shHADOOP_OPTIONAL_TOOLS在列表中具有“ hadoop-azure ”。例:

export HADOOP_OPTIONAL_TOOLS =“ hadoop-azure,hadoop-azure-datalake”

特征

  • 读取和写入存储在Azure Blob存储帐户中的数据。
  • 通过实现标准的Hadoop FileSystem接口提供分层的文件系统视图。
  • 支持配置多个Azure Blob存储帐户。
  • 同时支持块Blob(适用于大多数用例,例如MapReduce)和页面Blob(适用于连续写入用例,例如HBase预写日志)。
  • 使用wasb方案使用URL引用文件系统路径。
  • 还要使用带有wasbs方案的URL来引用文件系统路径,以进行SSL加密访问。
  • 可以充当MapReduce作业中的数据源或接收器。
  • 在Linux和Windows上都经过测试。
  • 经过大规模测试。

局限性

  • 文件所有者和组被保留,但未强制执行权限模型。授权发生在整个Azure Blob存储帐户的级别。
  • 没有跟踪文件的上次访问时间。

用法

概念

Azure Blob存储数据模型提出了3个核心概念:

  • 存储帐户:所有访问都通过存储帐户完成。
  • 容器:容器是多个斑点的组合。一个存储帐户可能有多个容器。在Hadoop中,整个文件系统层次结构存储在单个容器中。还可以配置多个容器,以有效呈现可以使用不同URL引用的多个文件系统。
  • Blob:任何类型和大小的文件。在Hadoop中,文件存储在Blob中。内部实现还使用Blob来保留文件系统层次结构和其他元数据。

配置凭证

使用Azure Blob存储需要配置凭据。通常,这是在core-site.xml中设置的。配置属性名称的格式为fs.azure.account.key。<帐户名称> .blob.core.windows.net,值是访问密钥。 访问密钥是保护访问您的存储帐户的机密。不要与不受信任的一方共享访问密钥(或core-site.xml文件)。

例如:

<属性>
  <name> fs.azure.account.key.youraccount.blob.core.windows.net </ name>
  <value>您的访问密钥</ value>
</ property>

在许多Hadoop集群中,core-site.xml文件是世界可读的。也可以在凭证提供者中保护访问密钥。这提供了加密的文件格式以及具有文件权限的保护。

使用凭据提供程序保护WASB的Azure凭据

为了保护这些凭据免遭窥视,建议您使用凭据提供程序框架安全地存储它们并通过配置访问它们。下面介绍了WASB FileSystem中它对Azure凭据的使用。

有关凭证提供者API的更多信息,请参阅:凭证提供者API

带有凭据提供程序的Distcp和WASB的端到端步骤
规定
%hadoop凭证创建fs.azure.account.key.youraccount.blob.core.windows.net-值123
    -提供者localjceks://file/home/lmccay/wasb.jceks
配置core-site.xml或命令行系统属性
<属性>
  <name> hadoop.security.credential.provider.path </ name>
  <value> localjceks://file/home/lmccay/wasb.jceks </ value>
  <description>用于询问受保护凭据的路径。</ description>
</ property>
distcp
%hadoop distcp
    [-D hadoop.security.credential.provider.path = localjceks://file/home/lmccay/wasb.jceks]
    hdfs://主机名:9001 / user / lmccay / 007020615 wasb://yourcontainer@youraccount.blob.core.windows.net/testDir/

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

在加密文件中保护WASB的Azure凭据

除了使用凭据提供程序框架来保护您的凭据之外,还可以以加密形式对其进行配置。附加的配置属性指定Hadoop流程将调用的外部程序来解密密钥。加密的密钥值作为命令行参数传递给此外部程序:

<属性>
  <name> fs.azure.account.keyprovider.youraccount </ name>
  <value> org.apache.hadoop.fs.azure.ShellDecryptionKeyProvider </ value>
</ property>

<属性>
  <name> fs.azure.account.key.youraccount.blob.core.windows.net </ name>
  <value>您的加密访问密钥</ value>
</ property>

<属性>
  <name> fs.azure.shellkeyprovider.script </ name>
  <value>解密程序的路径</ value>
</ property>

具有压缩支持和配置的块Blob

块Blob是默认的Blob,适用于大多数大数据用例。但是,块Blob严格限制每个块50,000个块。为了防止达到限制,WASB默认情况下不会在每个hflush()hsync()之后将新块上传到服务。

对于大多数情况,在4Mb的块中组合来自多个write()调用的数据是一个很好的优化。但是,在其他情况下,例如HBase日志文件,每次对hflush()hsync()的调用都必须将数据上传到服务。

带有压缩的块Blob在每个hflush() / hsync()之后将数据上传到云服务。为了减轻50000个块的限制,如果blob中的块数大于32,000,则hflush() / hsync()运行一次压缩过程。

块压缩搜索,并将一个小块序列替换为一个大块。这意味着与块压缩相关的成本:将小块读回客户端并将其重新写成一个大块。

为了使您创建的文件成为启用块压缩的块Blob,客户端必须将配置变量fs.azure.block.blob.with.compaction.dir设置为以逗号分隔的文件夹名称列表。

例如:

<属性>
  <name> fs.azure.block.blob.with.compaction.dir </ name>
  <value> / hbase / WALs // data / myblobfiles </ value>
</ property>

Page Blob支持和配置

Hadoop的Azure Blob存储接口支持两种Blob,即块Blob和页面Blob。块Blob是默认的Blob,适用于大多数大数据用例,例如Hive,Pig的输入数据,分析性Map-Reduce作业等。hadoop-azure中的页面Blob处理是为了支持HBase日志文件而引入的。页Blob可以被写入任意次,而块Blob只能追加到50,000次,然后用完块,否则写入将失败。这对于HBase日志不起作用,因此引入了页面Blob支持来克服此限制。

页面Blob的最大大小为1TB,大于块Blob的最大200GB大小。对于大多数用法,您应该坚持使用块Blob,并且仅在HBase预写日志的上下文中测试页面Blob。

为了使创建的文件成为页面Blob,必须将配置变量fs.azure.page.blob.dir设置为以逗号分隔的文件夹名称列表。

例如:

<属性>
  <名称> fs.azure.page.blob.dir </名称>
  <value> / hbase / WAL,/ hbase / oldWAL,/ data / mypageblobfiles </ value>
</ property>

您可以将其设置为/,使所有文件页面斑点。

配置选项fs.azure.page.blob.size是页面Blob的默认初始大小。它必须为128MB或更大,并且不超过1TB,以整数字节数指定。

配置选项fs.azure.page.blob.extension.size是页面Blob扩展大小。这定义了在页面Blob开始变满时扩展页面Blob的量。它必须为128MB或更大,指定为整数字节。

自定义用户代理

WASB将User-Agent标头传递到Azure后端。默认值包含WASB版本,Java Runtime版本,Azure客户端库版本以及配置选项fs.azure.user.agent.prefix的值。自定义的User-Agent标头可通过Azure服务更好地进行故障排除和分析。

<属性>
    <name> fs.azure.user.agent.prefix </ name>
    <value>标识符</ value>
</ property>

原子文件夹重命名

Azure存储将文件存储为平面键/值存储,而没有对文件夹的正式支持。hadoop-azure文件系统层模拟Azure存储顶部的文件夹。默认情况下,hadoop-azure文件系统层中的文件夹重命名不是原子的。这意味着,例如,在文件夹重命名期间发生故障可能会将一些文件夹保留在原始目录中,而将某些保留在新目录中。

HBase依赖于原子文件夹重命名。因此,引入了名为fs.azure.atomic.rename.dir的配置设置,该设置允许您指定逗号分隔的目录列表以进行特殊处理,从而使文件夹重命名成为原子的。此设置的默认值为/ hbase。重做将应用于完成失败的文件夹重命名。文件<folderName> -renamePending.json可能会临时出现,并且记录了重命名操作的意图,以便在发生故障时允许重做。

例如:

<属性>
  <name> fs.azure.atomic.rename.dir </ name>
  <value> / hbase,/ data </ value>
</ property>

访问wasb URL

在core-site.xml中配置凭据之后,任何Hadoop组件都可以使用以下格式的URL来引用该Azure Blob存储帐户中的文件:

wasb [s]:// <容器名称> @ <帐户名称> .blob.core.windows.net / <路径>

方案wasbwasbs标识由Azure Blob存储支持的文件系统上的URL。 wasb利用未加密的HTTP访问来与Azure Blob存储API进行所有交互。 wasbs利用SSL加密的HTTPS访问。

例如,下面的文件系统外壳命令表明访问存储帐户名为youraccount和容器命名您的容器

%hadoop fs -mkdir wasb://yourcontainer@youraccount.blob.core.windows.net/testDir

%hadoop fs -put testFile wasb://yourcontainer@youraccount.blob.core.windows.net/testDir/testFile

%hadoop fs -cat wasbs://yourcontainer@youraccount.blob.core.windows.net/testDir/testFile
测试文件内容

也可以将fs.defaultFS配置为使用wasbwasbs URL。这将导致所有裸路径(例如/ testDir / testFile)自动解析为该文件系统。

附加API支持和配置

Hadoop的Azure Blob存储接口通过将配置fs.azure.enable.append.support设置为true,为单个编写器提供了对Append API的可选支持。

例如:

<属性>
  <name> fs.azure.enable.append.support </ name>
  <value> true </ value>
</ property>

必须注意,在Azure Blob存储接口DIFFERS FROM HDFS SEMANTICS中追加支持。追加支持不会在内部强制执行单个编写器,而是需要应用程序来保证这种语义。确保对特定文件路径进行单线程处理,或者依靠其自身的某些外部锁定机制,成为应用程序的责任。否则将导致意外行为。

多线程支持

目前,在具有大量文件和子目录的目录上重命名和删除Blob操作的速度非常慢,因为这些操作一次只能执行一个Blob。这些文件和子文件夹可以删除或并行重命名。以下配置可用于使线程能够进行并行处理

为删除操作启用10个​​线程。将配置值设置为0或1以禁用线程。默认行为是禁用线程。

<属性>
  <name> fs.azure.delete.threads </ name>
  <value> 10 </ value>
</ property>

为重命名操作启用20个线程。将配置值设置为0或1以禁用线程。默认行为是禁用线程。

<属性>
  <name> fs.azure.rename.threads </ name>
  <value> 20 </ value>
</ property>

WASB安全模式和配置

WASB可以在安全模式下运行,在该模式下,与Azure存储进行通信所需的存储访问密钥不必与使用WASB的进程位于相同的地址空间中。在此模式下,所有与Azure存储的交互都使用SAS uris执行。安全模式下有两种子模式,一种是远程SAS密钥模式,其中SAS密钥是从远程进程生成的;另一种是本地模式,其中SAS密钥是在WASB内生成的。默认情况下,SAS密钥模式应在Romote模式下运行,但是出于测试目的,可以启用本地模式以与WASB相同的过程生成SAS密钥。

要启用安全模式,需要将following属性设置为true。

<属性>
  <name> fs.azure.secure.mode </ name>
  <value> true </ value>
</ property>

要在本地启用SAS密钥生成,需要将following属性设置为true。

<属性>
  <name> fs.azure.local.sas.key.mode </ name>
  <value> true </ value>
</ property>

要使用远程SAS密钥生成模式,期望用逗号分隔的外部REST服务提供所需的SAS密钥。以下属性可用于提供用于远程SAS密钥生成的端点:

<属性>
  <name> fs.azure.cred.service.urls </ name>
  <value> {URL} </ value>
</ property>

预期该远程服务将支持两个REST调用{URL} / GET_CONTAINER_SAS{URL} / GET_RELATIVE_BLOB_SAS,以生成容器和相对的blob sas密钥。一个例子请求

{URL} / GET_CONTAINER_SAS?storage_account = <账户名称>&container = <container>&sas_expiry = <有效期>&delegation_token = <委托令牌> {URL} / GET_CONTAINER_SAS?storage_account = <account_name>&container = <relative> &sas_expiry = <有效期>&delegation_token = <授权令牌>

该服务应以JSON格式返回响应:

{
  “ responseCode”:0或非零<int>,
  “ responseMessage”:有关失败<String>的相关消息,
  “ sasKey”:请求的SAS密钥<String>
}

WASB中的授权支持

可以使用以下配置在WASB中启用授权支持:

<属性>
  <name> fs.azure.authorization </ name>
  <value> true </ value>
</ property>

当前的授权实现依赖于可以强制执行授权的外部服务。该服务应在以下配置提供的逗号分隔的URL上运行。

<属性>
  <name> fs.azure.authorization.remote.service.urls </ name>
  <value> {URL} </ value>
</ property>

预期远程服务将为以下REST调用提供支持:{URL} / CHECK_AUTHORIZATION一个示例请求:{URL} / CHECK_AUTHORIZATION?wasb_absolute_path = <absolute_path>&operation_type = <操作类型>&delegation_token = <委托令牌>

该服务应以JSON格式返回响应:

{
    “ responseCode”:0或非零<int>,
    “ responseMessage”:有关失败<String>的相关消息,
    “ authorizationResult”:是/否<boolean>
}

WASB中的委托令牌支持

可以使用以下配置在WASB中启用委托令牌支持支持:

<属性>
  <name> fs.azure.enable.kerberos.support </ name>
  <value> true </ value>
</ property>

委托令牌实现的当前实现依赖于可以生成和管理委托令牌的外部服务实例的存在。该服务应在以下配置提供的逗号分隔的URL上运行。

<属性>
  <name> fs.azure.delegation.token.service.urls </ name>
  <value> {URL} </ value>
</ property>

预期远程服务将为以下REST调用提供支持:{URL}?op = GETDELEGATIONTOKEN{URL}?op = RENEWDELEGATIONTOKEN{URL}?op = CANCELDELEGATIONTOKEN一个示例请求:{URL}?op = GETDELEGATIONTOKEN&renewer = < renewer> {URL}?op = RENEWDELEGATIONTOKEN&token = <委托令牌> {URL}?op = CANCELDELEGATIONTOKEN&token = <委托令牌>

预计该服务将以JSON格式返回GETDELEGATIONTOKEN请求的响应:

{
    “令牌”:{
        “ urlString”:委托令牌的URL字符串。
    }
}

在WASB中启用授权时的chown行为

启用授权后,仅允许以下配置中列出的用户更改WASB中文件/文件夹的所有者。该配置值采用逗号分隔的允许执行chown的用户名列表。

<属性>
  <name> fs.azure.chown.allowed.userlist </ name>
  <value> user1,user2 </ value>
</ property>

在WASB中启用授权时的chmod行为

启用授权后,只有所有者和以下配置中列出的用户才能更改WASB中文件/文件夹的权限。该配置值采用逗号分隔的允许执行chmod的用户名列表。

<属性>
  <name> fs.azure.daemon.userlist </ name>
  <value> user1,user2 </ value>
</ property>
<属性>
  <name> fs.azure.chmod.allowed.userlist </ name>
  <value> userA,userB </ value>
</ property>

可以使用以下设置启用SAS密钥和授权响应的缓存:缓存设置仅在启用fs.azure.authorization时适用。高速缓存在文件系统对象级别维护。

    <属性>
      <name> fs.azure.authorization.caching.enable </ name>
      <value> true </ value>
    </ property>

可以使用以下设置来自定义缓存可以容纳的最大条目数:

    <属性>
      <name> fs.azure.authorization.caching.maxentries </ name>
      <value> 512 </ value>
    </ property>

可以使用以下设置来控制授权缓存条目的有效性:将值设置为零将禁用授权缓存。如果未指定密钥,则默认有效期为5m。

   <属性>
     <name> fs.azure.authorization.cacheentry.expiry.period </ name>
     <value> 5m </ value>
   </ property>

可以使用以下设置来控制SASKey高速缓存条目的有效性。将该值设置为零将禁用SASKey缓存。如果未指定密钥,则在sas-key请求中指定的默认有效期限会生效。

   <属性>
     <name> fs.azure.saskey.cacheentry.expiry.period </ name>
     <value> 90d </ value>
   </ property>

使用容器saskey可以访问容器中的所有blob。启用此设置后,将不使用特定于Blob的saskey。与Blob特定的saskey相比,此设置可提供更好的性能。

   <属性>
     <name> fs.azure.saskey.usecontainersaskeyforallaccess </ name>
     <value> true </ value>
   </ property>