也可以看看:
在Hadoop的蔚蓝模块提供与集成支持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”
Azure Blob存储数据模型提出了3个核心概念:
使用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 FileSystem中它对Azure凭据的使用。
有关凭证提供者API的更多信息,请参阅:凭证提供者API。
%hadoop凭证创建fs.azure.account.key.youraccount.blob.core.windows.net-值123 -提供者localjceks://file/home/lmccay/wasb.jceks
除了使用凭据提供程序框架来保护您的凭据之外,还可以以加密形式对其进行配置。附加的配置属性指定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严格限制每个块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>
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>
在core-site.xml中配置凭据之后,任何Hadoop组件都可以使用以下格式的URL来引用该Azure Blob存储帐户中的文件:
wasb [s]:// <容器名称> @ <帐户名称> .blob.core.windows.net / <路径>
方案wasb和wasbs标识由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配置为使用wasb或wasbs URL。这将导致所有裸路径(例如/ testDir / testFile)自动解析为该文件系统。
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可以在安全模式下运行,在该模式下,与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中启用授权支持:
<属性> <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中启用委托令牌支持支持:
<属性> <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的用户名列表。
<属性> <name> fs.azure.chown.allowed.userlist </ name> <value> user1,user2 </ value> </ property>
启用授权后,只有所有者和以下配置中列出的用户才能更改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>