另请参阅
hadoop-azure
模块提供与 Azure Blob 存储 集成的支持。名为 hadoop-azure.jar
的已编译 jar 文件还声明了对它所需的附加工件的传递依赖性,特别是 适用于 Java 的 Azure 存储 SDK。
若要使其成为 Apache Hadoop 的默认类路径的一部分,只需确保 hadoop-env.sh
中的 HADOOP_OPTIONAL_TOOLS
在列表中包含 'hadoop-azure
。示例
export HADOOP_OPTIONAL_TOOLS="hadoop-azure,hadoop-azure-datalake"
FileSystem
接口来呈现分层文件系统视图。wasb
方案使用 URL 引用文件系统路径。wasbs
方案的 URL 引用文件系统路径,以进行 SSL 加密访问。Azure Blob 存储数据模型呈现 3 个核心概念
使用 Azure Blob 存储需要配置凭据。通常在 core-site.xml 中设置此项。配置属性名称的形式为 fs.azure.account.key.<account name>.blob.core.windows.net
,值是访问密钥。访问密钥是保护对存储帐户的访问的机密。请勿与不受信任的方共享访问密钥(或 core-site.xml 文件)。
例如
<property> <name>fs.azure.account.key.youraccount.blob.core.windows.net</name> <value>YOUR ACCESS KEY</value> </property>
在许多 Hadoop 集群中,core-site.xml 文件是全世界可读的。也可以在凭据提供程序中保护访问密钥。这提供了一种加密的文件格式以及文件权限保护。
为了保护这些凭据不被窥探,建议您使用凭据提供程序框架安全地存储它们并通过配置访问它们。以下描述了它在 WASB 文件系统中对 Azure 凭据的使用。
有关凭据提供程序 API 的更多阅读,请参见:凭据提供程序 API。
% hadoop credential create fs.azure.account.key.youraccount.blob.core.windows.net -value 123 -provider localjceks://file/home/lmccay/wasb.jceks
<property> <name>hadoop.security.credential.provider.path</name> <value>localjceks://file/home/lmccay/wasb.jceks</value> <description>Path to interrogate for protected credentials.</description> </property>
% hadoop distcp [-D hadoop.security.credential.provider.path=localjceks://file/home/lmccay/wasb.jceks] hdfs://hostname:9001/user/lmccay/007020615 wasb://[email protected]/testDir/
注意:您可以选择将提供程序路径属性添加到 distcp 命令行,而不是将特定于作业的配置添加到通用 core-site.xml 中。上面的方括号说明了此功能。
除了使用凭据提供程序框架来保护您的凭据之外,还可以将其配置为加密形式。其他配置属性指定 Hadoop 进程调用的外部程序以解密密钥。加密密钥值作为命令行参数传递给此外部程序
<property> <name>fs.azure.account.keyprovider.youraccount</name> <value>org.apache.hadoop.fs.azure.ShellDecryptionKeyProvider</value> </property> <property> <name>fs.azure.account.key.youraccount.blob.core.windows.net</name> <value>YOUR ENCRYPTED ACCESS KEY</value> </property> <property> <name>fs.azure.shellkeyprovider.script</name> <value>PATH TO DECRYPTION PROGRAM</value> </property>
块 Blob 是默认类型的 Blob,适用于大多数大数据用例。但是,块 Blob 对每个 Blob 有 50,000 个块的严格限制。为了防止达到 WASB 限制,默认情况下,在每次 hflush()
或 hsync()
之后,不会将新块上传到服务。
对于大多数情况,将来自多个 write()
调用的数据组合成 4Mb 块是一个很好的优化。但是,在其他情况下,例如 HBase 日志文件,每次调用 hflush()
或 hsync()
都必须将数据上传到服务。
带有压缩的块 Blob 会在每次 hflush()
/hsync()
之后将数据上传到云服务。为了缓解 50000 个块的限制,如果 Blob 中的块数超过 32000,hflush()
/hsync()
将运行一次压缩进程。
块压缩搜索并用一个大块替换一系列小块。这意味着块压缩会产生相关成本:将小块读回客户端并将其重新写为一个大块。
为了让您创建的文件成为启用了块压缩的块 Blob,客户端必须将配置变量 fs.azure.block.blob.with.compaction.dir
设置为文件夹名称的逗号分隔列表。
例如
<property> <name>fs.azure.block.blob.with.compaction.dir</name> <value>/hbase/WALs,/data/myblobfiles</value> </property>
适用于 Hadoop 的 Azure Blob 存储接口支持两种 Blob,块 Blob 和页面 Blob。块 Blob 是默认类型的 Blob,适用于大多数大数据用例,例如 Hive、Pig、分析性 MapReduce 作业等的输入数据。hadoop-azure 中的页面 Blob 处理功能的引入是为了支持 HBase 日志文件。页面 Blob 可以写入任意次数,而块 Blob 在用完块之前只能追加 50000 次,之后您的写入操作将失败。这对于 HBase 日志不起作用,因此引入了页面 Blob 支持来克服此限制。
页面 Blob 的大小可以达到 1TB,大于块 Blob 的最大大小 200GB。对于大多数用途,您应坚持使用块 Blob,而页面 Blob 仅在 HBase 预写日志的上下文中进行测试。
为了让您创建的文件成为页面 Blob,您必须将配置变量 fs.azure.page.blob.dir
设置为文件夹名称的逗号分隔列表。
例如
<property> <name>fs.azure.page.blob.dir</name> <value>/hbase/WALs,/hbase/oldWALs,/data/mypageblobfiles</value> </property>
您可以将其简单地设置为 / 以使所有文件都成为页面 Blob。
配置选项 fs.azure.page.blob.size
是页面 Blob 的默认初始大小。它必须为 128MB 或更大,并且不超过 1TB,指定为一个整数字节数。
配置选项 fs.azure.page.blob.extension.size
是页面 Blob 扩展大小。如果页面 Blob 开始变满,这将定义扩展页面 Blob 的数量。它必须为 128MB 或更大,指定为一个整数字节数。
WASB 将用户代理标头传递到 Azure 后端。默认值包含 WASB 版本、Java 运行时版本、Azure 客户端库版本和配置选项 fs.azure.user.agent.prefix
的值。自定义的用户代理标头使 Azure 服务能够更好地进行故障排除和分析。
<property> <name>fs.azure.user.agent.prefix</name> <value>Identifier</value> </property>
Azure 存储将文件存储为扁平键/值存储,而没有对文件夹的正式支持。hadoop-azure 文件系统层在 Azure 存储之上模拟文件夹。默认情况下,hadoop-azure 文件系统层中的文件夹重命名不是原子的。这意味着在文件夹重命名期间发生故障可能会导致一些文件夹留在原始目录中,而另一些文件夹则留在新目录中。
HBase 依赖于原子的文件夹重命名。因此,引入了一个名为 fs.azure.atomic.rename.dir
的配置设置,它允许你指定一个逗号分隔的目录列表,以接收特殊处理,以便使文件夹重命名成为原子的。此设置的默认值只是 /hbase
。将应用重做以完成失败的文件夹重命名。一个文件 <folderName>-renamePending.json
可能会暂时出现,并且是重命名操作意图的记录,以便在发生故障时允许重做。
例如
<property> <name>fs.azure.atomic.rename.dir</name> <value>/hbase,/data</value> </property>
在 core-site.xml 中配置凭据后,任何 Hadoop 组件都可以使用以下格式的 URL 引用该 Azure Blob 存储帐户中的文件
wasb[s]://<containername>@<accountname>.blob.core.windows.net/<path>
方案 wasb
和 wasbs
标识由 Azure Blob 存储支持的文件系统上的 URL。wasb
利用未加密的 HTTP 访问与 Azure Blob 存储 API 的所有交互。wasbs
利用 SSL 加密的 HTTPS 访问。
例如,以下 文件系统 Shell 命令演示了对名为 youraccount
的存储帐户和名为 yourcontainer
的容器的访问。
% hadoop fs -mkdir wasb://[email protected]/testDir % hadoop fs -put testFile wasb://[email protected]/testDir/testFile % hadoop fs -cat wasbs://[email protected]/testDir/testFile test file content
还可以将 fs.defaultFS
配置为使用 wasb
或 wasbs
URL。这会导致所有裸路径(例如 /testDir/testFile
)自动解析为该文件系统。
Azure Blob 存储的 Hadoop 接口通过将配置 fs.azure.enable.append.support
设置为 true,为单个编写器提供对附加 API 的可选支持。
例如
<property> <name>fs.azure.enable.append.support</name> <value>true</value> </property>
必须注意,Azure Blob 存储接口中的附加支持与 HDFS 语义不同。附加支持在内部不强制单个编写器,但要求应用程序保证此语义。应用程序有责任确保对特定文件路径进行单线程处理,或依赖于它自己的某个外部锁定机制。否则会导致意外行为。
重命名和删除具有大量文件和子目录的目录上的 blob 操作目前非常慢,因为这些操作一次串行完成一个 blob。这些文件和子文件夹可以并行删除或重命名。可以使用以下配置来启用线程进行并行处理
要为删除操作启用 10 个线程。将配置值设置为 0 或 1 以禁用线程。默认行为是禁用线程。
<property> <name>fs.azure.delete.threads</name> <value>10</value> </property>
要为重命名操作启用 20 个线程。将配置值设置为 0 或 1 以禁用线程。默认行为是禁用线程。
<property> <name>fs.azure.rename.threads</name> <value>20</value> </property>
WASB 可以以安全模式运行,其中与 Azure 存储进行通信所需的存储访问密钥不必与使用 WASB 的进程位于同一地址空间中。在此模式下,与 Azure 存储的所有交互都使用 SAS URI 执行。安全模式中有两种子模式,一种是远程 SAS 密钥模式(其中 SAS 密钥由远程进程生成)和本地模式(其中 SAS 密钥在 WASB 中生成)。默认情况下,SAS 密钥模式应在远程模式下运行,但出于测试目的,可以在与 WASB 相同的进程中启用本地模式以生成 SAS 密钥。
要启用安全模式,需要将以下属性设置为 true。
<property> <name>fs.azure.secure.mode</name> <value>true</value> </property>
要本地启用 SAS 密钥生成,需要将以下属性设置为 true。
<property> <name>fs.azure.local.sas.key.mode</name> <value>true</value> </property>
要使用远程 SAS 密钥生成模式,需要提供逗号分隔的外部 REST 服务以提供所需的 SAS 密钥。以下属性可用于提供用于远程 SAS 密钥生成的端点
<property> <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=<account_name>&container=<container>&sas_expiry=<expiry period>&delegation_token=<delegation token>
{URL}/GET_CONTAINER_SAS?storage_account=<account_name>&container=<container>&relative_path=<relative path>&sas_expiry=<expiry period>&delegation_token=<delegation token>
该服务应以 JSON 格式返回响应
{ "responseCode" : 0 or non-zero <int>, "responseMessage" : relavant message on failure <String>, "sasKey" : Requested SAS Key <String> }
可以使用以下配置在 WASB 中启用授权支持
<property> <name>fs.azure.authorization</name> <value>true</value> </property>
授权的当前实现依赖于可以强制执行授权的外部服务的存在。该服务应在以下配置提供的逗号分隔 URL 上运行。
<property> <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=<operation type>&delegation_token=<delegation token>
该服务应以 JSON 格式返回响应
{ "responseCode" : 0 or non-zero <int>, "responseMessage" : relevant message on failure <String>, "authorizationResult" : true/false <boolean> }
可以使用以下配置在 WASB 中启用委派令牌支持
<property> <name>fs.azure.enable.kerberos.support</name> <value>true</value> </property>
委派令牌实现的当前实现依赖于可以生成和管理委派令牌的外部服务实例的存在。该服务应该在以下配置提供的逗号分隔的 URL 上运行。
<property> <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=<delegation token>
{URL}?op=CANCELDELEGATIONTOKEN&token=<delegation token>
该服务应该以 JSON 格式返回 GETDELEGATIONTOKEN 请求的响应
{ "Token" : { "urlString": URL string of delegation token. } }
启用授权后,只有以下配置中列出的用户才能更改 WASB 中文件/文件夹的所有者用户。配置值采用允许执行 chown 的用户名逗号分隔列表。
<property> <name>fs.azure.chown.allowed.userlist</name> <value>user1,user2</value> </property>
启用授权后,只有所有者和以下配置中列出的用户才能更改 WASB 中文件/文件夹的权限。配置值采用允许执行 chmod 的用户名逗号分隔列表。
<property> <name>fs.azure.daemon.userlist</name> <value>user1,user2</value> </property> <property> <name>fs.azure.chmod.allowed.userlist</name> <value>userA,userB</value> </property>
可以使用以下设置启用 SAS 密钥和授权响应的缓存:缓存设置仅在启用 fs.azure.authorization 时适用。缓存保留在文件系统对象级别。
<property> <name>fs.azure.authorization.caching.enable</name> <value>true</value> </property>
可以使用以下设置自定义缓存可以容纳的最大条目数
<property> <name>fs.azure.authorization.caching.maxentries</name> <value>512</value> </property>
可以使用以下设置控制授权缓存条目的有效性:将值设置为零将禁用授权缓存。如果未指定密钥,则生效的默认过期持续时间为 5 分钟。
<property> <name>fs.azure.authorization.cacheentry.expiry.period</name> <value>5m</value> </property>
可以使用以下设置控制 SASKey 缓存条目的有效性。将值设置为零将禁用 SASKey 缓存。如果未指定密钥,则生效的默认过期持续时间为 sas 密钥请求中指定的持续时间。
<property> <name>fs.azure.saskey.cacheentry.expiry.period</name> <value>90d</value> </property>
使用容器 saskey 访问容器内的所有 blob。启用此设置后,不会使用特定于 blob 的 saskey。与特定于 blob 的 saskey 相比,此设置可提供更好的性能。
<property> <name>fs.azure.saskey.usecontainersaskeyforallaccess</name> <value>true</value> </property>
fs.azure.block.blob.buffered.pread.disable
:默认情况下,位置读取 API 将在输入流上执行 seek 和 read。此读取将填充 BlockBlobInputStream 中的缓冲区缓存。如果此配置为 true,它将跳过缓冲区的使用,并执行无锁调用以从 blob 中读取。此优化非常有助于 HBase 类型的在共享 InputStream 实例上进行的短随机读取。注意:这不是可以在群集级别设置的配置。它可以用作 FutureDataInputStreamBuilder 上的一个选项。请参阅 FileSystem#openFile(Path path)