hadoop-azure
モジュールは、「abfs」コネクターを介してAzure Data Lake Storage Gen2ストレージレイヤーのサポートを提供します
Apache Hadoopのデフォルトクラスパスの一部にするには、HADOOP_OPTIONAL_TOOLS
環境変数のリストにhadoop-azure
が含まれていることを確認してください (クラスタ内のすべてのマシンで)
export HADOOP_OPTIONAL_TOOLS=hadoop-azure
これは.profile
/.bashrc
でローカルに設定できますが、クラスタ内で実行中のジョブには伝播されないことに注意してください。
wasb:
コネクターを使用して書き込まれたデータを読み取ることができます。FileSystem
インターフェースを実装することにより、階層型ファイルシステムビューを提供します。ABFSの詳細については、次のドキュメントを参照してください
Azure Storageデータモデルは、3つのコア概念を提供します
ABFSコネクターは、クラシックコンテナーまたは階層型名前空間で作成されたコンテナーに接続します。
ADLS Gen 2の重要な側面は、階層型名前空間のサポートです。これらは事実上ディレクトリであり、高性能な名前変更と削除操作を提供します。これにより、MapReduce、Spark、Hive、およびDistCpを含む、クエリエンジンがデータを書き込む際のパフォーマンスが大幅に向上します。
この機能は、コンテナーが「名前空間」サポート付きで作成された場合にのみ使用可能です。
新しいストレージアカウントを作成するときに、ポータルUIで「階層型名前空間」オプションをオンにするか、コマンドラインで作成する場合は、オプション--hierarchical-namespace true
を使用することで、名前空間のサポートを有効にします
既存のストレージアカウントで階層型名前空間を有効にすることはできません
階層型名前空間を持つストレージアカウントのコンテナーは、(現在) wasb:
コネクターを介して読み取り可能ではありません。
たとえば、一部のaz storage
コマンドラインコマンドも失敗します
$ az storage container list --account-name abfswales1 Blob API is not yet supported for hierarchical namespace accounts. ErrorCode: BlobApiNotYetSupportedForHierarchicalNamespaceAccounts
abfsコネクターを使用したAzure Datalake Gen2の開始に関する最適なドキュメントは、Azure HDInsightクラスターでAzure Data Lake Storage Gen2を使用するです
これには、Windows、MacOS (Homebrew経由)、およびLinux (aptまたはyum)にインストールできるAzureコマンドラインツールからの作成手順が含まれています。
az storageサブコマンドはすべてのストレージコマンドを処理し、az storage account create
が作成を実行します。
ADLS gen2 APIのサポートが最終決定されるまで、ADLSコマンドに拡張機能を追加する必要があります。
az extension add --name storage-preview
使用法コマンドに--hierarchical-namespace
が含まれていることを確認して、すべて正常であることを確認します
$ az storage account usage: az storage account create [-h] [--verbose] [--debug] [--output {json,jsonc,table,tsv,yaml,none}] [--query JMESPATH] --resource-group RESOURCE_GROUP_NAME --name ACCOUNT_NAME [--sku {Standard_LRS,Standard_GRS,Standard_RAGRS,Standard_ZRS,Premium_LRS,Premium_ZRS}] [--location LOCATION] [--kind {Storage,StorageV2,BlobStorage,FileStorage,BlockBlobStorage}] [--tags [TAGS [TAGS ...]]] [--custom-domain CUSTOM_DOMAIN] [--encryption-services {blob,file,table,queue} [{blob,file,table,queue} ...]] [--access-tier {Hot,Cool}] [--https-only [{true,false}]] [--file-aad [{true,false}]] [--hierarchical-namespace [{true,false}]] [--bypass {None,Logging,Metrics,AzureServices} [{None,Logging,Metrics,AzureServices} ...]] [--default-action {Allow,Deny}] [--assign-identity] [--subscription _SUBSCRIPTION]
az account list-locations
から場所をリストできます。これにより、--location
引数で参照する名前がリストされます
$ az account list-locations -o table DisplayName Latitude Longitude Name ------------------- ---------- ----------- ------------------ East Asia 22.267 114.188 eastasia Southeast Asia 1.283 103.833 southeastasia Central US 41.5908 -93.6208 centralus East US 37.3719 -79.8164 eastus East US 2 36.6681 -78.3889 eastus2 West US 37.783 -122.417 westus North Central US 41.8819 -87.6278 northcentralus South Central US 29.4167 -98.5 southcentralus North Europe 53.3478 -6.2597 northeurope West Europe 52.3667 4.9 westeurope Japan West 34.6939 135.5022 japanwest Japan East 35.68 139.77 japaneast Brazil South -23.55 -46.633 brazilsouth Australia East -33.86 151.2094 australiaeast Australia Southeast -37.8136 144.9631 australiasoutheast South India 12.9822 80.1636 southindia Central India 18.5822 73.9197 centralindia West India 19.088 72.868 westindia Canada Central 43.653 -79.383 canadacentral Canada East 46.817 -71.217 canadaeast UK South 50.941 -0.799 uksouth UK West 53.427 -3.084 ukwest West Central US 40.890 -110.234 westcentralus West US 2 47.233 -119.852 westus2 Korea Central 37.5665 126.9780 koreacentral Korea South 35.1796 129.0756 koreasouth France Central 46.3772 2.3730 francecentral France South 43.8345 2.1972 francesouth Australia Central -35.3075 149.1244 australiacentral Australia Central 2 -35.3075 149.1244 australiacentral2
場所が選択されたら、アカウントを作成します
az storage account create --verbose \ --name abfswales1 \ --resource-group devteam2 \ --kind StorageV2 \ --hierarchical-namespace true \ --location ukwest \ --sku Standard_LRS \ --https-only true \ --encryption-services blob \ --access-tier Hot \ --tags owner=engineering \ --assign-identity \ --output jsonc
コマンドの出力はJSONファイルであり、そのprimaryEndpoints
コマンドにはストアエンドポイントの名前が含まれています
{ "primaryEndpoints": { "blob": "https://abfswales1.blob.core.windows.net/", "dfs": "https://abfswales1.dfs.core.windows.net/", "file": "https://abfswales1.file.core.windows.net/", "queue": "https://abfswales1.queue.core.windows.net/", "table": "https://abfswales1.table.core.windows.net/", "web": "https://abfswales1.z35.web.core.windows.net/" } }
abfswales1.dfs.core.windows.net
アカウントは、ストレージアカウントが参照される名前です。
次に、ストアへの接続文字列を要求します。これには、アカウントキーが含まれます
az storage account show-connection-string --name abfswales1 { "connectionString": "DefaultEndpointsProtocol=https;EndpointSuffix=core.windows.net;AccountName=abfswales1;AccountKey=ZGlkIHlvdSByZWFsbHkgdGhpbmsgSSB3YXMgZ29pbmcgdG8gcHV0IGEga2V5IGluIGhlcmU/IA==" }
次に、アクセスキーをcore-site.xml
、JCEKsファイルに追加するか、クラスター管理ツールを使用して、オプションfs.azure.account.key.STORAGE-ACCOUNT
をこの値に設定する必要があります。
<property> <name>fs.azure.account.key.abfswales1.dfs.core.windows.net</name> <value>ZGlkIHlvdSByZWFsbHkgdGhpbmsgSSB3YXMgZ29pbmcgdG8gcHV0IGEga2V5IGluIGhlcmU/IA==</value> </property>
ポータルからの作成については、クイックスタート: Azure Data Lake Storage Gen2ストレージアカウントの作成で説明されています
主な手順
これでストレージアカウントが作成されました。次に、デフォルトの「共有キー」認証を使用するための認証キーを取得します。
Azureストレージアカウントには複数のコンテナを含めることができ、各コンテナの名前は、それを参照するために使用されるURIのuserinfoフィールドとして使用されます。
たとえば、作成したばかりのストレージアカウント内のコンテナ「container1」のURLはabfs://container1@abfswales1.dfs.core.windows.net/
になります。
オプションfs.azure.createRemoteFileSystemDuringInitialization
をtrue
に設定することにより、ABFSコネクタを使用して新しいコンテナを作成できます。ただし、AuthTypeがSASの場合はサポートされていません。
コンテナが存在しない場合、hadoop fs -ls
でリストを試みると失敗します。
$ hadoop fs -ls abfs://container1@abfswales1.dfs.core.windows.net/ ls: `abfs://container1@abfswales1.dfs.core.windows.net/': No such file or directory
リモートFSの作成を有効にすると、2回目の試行は成功し、コンテナが作成されます。
$ hadoop fs -D fs.azure.createRemoteFileSystemDuringInitialization=true \ -ls abfs://container1@abfswales1.dfs.core.windows.net/
これは、特にaz storage
コマンドが階層型名前空間を完全にサポートする前は、コマンドラインでアカウントを作成するのに役立ちます。
Azure Storage Explorerを使用できます。
すべての構成は、一般的に(またはすべてのアカウントにアクセスする際のデフォルトとして)指定するか、特定のアカウントに紐づけることができます。たとえば、プロパティfs.azure.account.oauth2.client.id
を使用して、どのアカウントにアクセスするかに関係なく使用するOAuth IDを設定したり、fs.azure.account.oauth2.client.id.<account_name>.dfs.core.windows.net
を使用して特定のストレージアカウントでのみ使用するIDを構成したりできます。
これについては、認証セクションで説明します。
ABFSの認証は、最終的にはAzure Active Directoryによって許可されます。
そこで説明されている概念は、このドキュメントの範囲を超えています。開発者は、さまざまな認証メカニズムを活用するために、それらの概念を読解し理解している必要があります。
ここで簡単に説明するのは、さまざまなデプロイ状況で認証を行うためにABFSクライアントを構成する方法です。
ABFSクライアントはさまざまな方法でデプロイでき、その認証ニーズはそれらによって駆動されます。
変更できるのは、呼び出し元を認証するために使用されるシークレット/資格情報です。
認証メカニズムはfs.azure.account.auth.type
(またはアカウント固有のバリアント)で設定されます。可能な値は、SharedKey、OAuth、Custom、SASです。さまざまなOAuthオプションについては、設定fs.azure.account .oauth.provider.type
を使用します。以下に、サポートされている実装であるClientCredsTokenProvider、UserPasswordTokenProvider、MsiTokenProvider、RefreshTokenBasedTokenProviderを示します。指定されたプロバイダータイプがサポートされていないもののいずれでもない場合は、IllegalArgumentExceptionがスローされます。
すべてのシークレットはJCEKSファイルに保存できます。これらは暗号化され、パスワードで保護されています。可能な限り、それらまたは互換性のあるHadoop Key Management Storeを使用してください。
AADトークンフェッチの再試行に使用される指数バックオフ再試行ポリシーは、次の構成で調整できます。 * fs.azure.oauth.token.fetch.retry.max.retries
:再試行の最大回数を設定します。デフォルト値は5です。 * fs.azure.oauth.token.fetch.retry.min.backoff.interval
:最小バックオフ間隔。デルタバックオフから計算された再試行間隔に追加されます。デフォルトでは0に設定されています。間隔をミリ秒単位で設定します。 * fs.azure.oauth.token.fetch.retry.max.backoff.interval
:最大バックオフ間隔。デフォルト値は60000(60秒)です。間隔をミリ秒単位で設定します。 * fs.azure.oauth.token.fetch.retry.delta.backoff
:再試行間のバックオフ間隔。後続の再試行試行には、この期間の倍数が使用されます。デフォルト値は2です。
これは、アカウント+パスワードの最もシンプルな認証メカニズムです。
アカウント名はURLから推測され、パスワードである「キー」はXML/JCECKs構成ファイルから取得されます。
<property> <name>fs.azure.account.auth.type.abfswales1.dfs.core.windows.net</name> <value>SharedKey</value> <description> </description> </property> <property> <name>fs.azure.account.key.abfswales1.dfs.core.windows.net</name> <value>ZGlkIHlvdSByZWFsbHkgdGhpbmsgSSB3YXMgZ29pbmcgdG8gcHV0IGEga2V5IGluIGhlcmU/IA==</value> <description> The secret password. Never share these. </description> </property>
注:アカウントキーのソースは、カスタムキープロバイダーを通じて変更できます。シェルスクリプトを実行して取得するためのプロバイダーが存在します。
カスタムキープロバイダークラスは、構成fs.azure.account.keyprovider
で指定できます。キープロバイダークラスが指定されている場合は、同じものがアカウントキーを取得するために使用されます。それ以外の場合は、構成fs.azure.account.key
に指定されたキーを使用するSimpleキープロバイダーが使用されます。
シェルスクリプトを使用して取得するには、構成fs.azure.shellkeyprovider.script
にスクリプトのパスを指定します。ShellDecryptionKeyProviderクラスは、キーを取得するために指定されたスクリプトを使用します。
(クライアントID、クライアントシークレット、エンドポイント)のOAuth 2.0資格情報が構成/JCEKSファイルで提供されます。
このプロセスの詳細は、hadoop-azure-datalakeで説明されています。キー名はここでわずかに異なります。
<property> <name>fs.azure.account.auth.type</name> <value>OAuth</value> <description> Use OAuth authentication </description> </property> <property> <name>fs.azure.account.oauth.provider.type</name> <value>org.apache.hadoop.fs.azurebfs.oauth2.ClientCredsTokenProvider</value> <description> Use client credentials </description> </property> <property> <name>fs.azure.account.oauth2.client.endpoint</name> <value></value> <description> URL of OAuth endpoint </description> </property> <property> <name>fs.azure.account.oauth2.client.id</name> <value></value> <description> Client ID </description> </property> <property> <name>fs.azure.account.oauth2.client.secret</name> <value></value> <description> Secret </description> </property>
OAuth 2.0エンドポイント、ユーザー名、パスワードが構成/JCEKSファイルで提供されます。
<property> <name>fs.azure.account.auth.type</name> <value>OAuth</value> <description> Use OAuth authentication </description> </property> <property> <name>fs.azure.account.oauth.provider.type</name> <value>org.apache.hadoop.fs.azurebfs.oauth2.UserPasswordTokenProvider</value> <description> Use user and password </description> </property> <property> <name>fs.azure.account.oauth2.client.endpoint</name> <value></value> <description> URL of OAuth 2.0 endpoint </description> </property> <property> <name>fs.azure.account.oauth2.user.name</name> <value></value> <description> username </description> </property> <property> <name>fs.azure.account.oauth2.user.password</name> <value></value> <description> password for account </description> </property>
既存のOauth 2.0トークンを使用して、このトークンを更新するために、Active Directoryエンドポイントhttps://login.microsoftonline.com/Common/oauth2/token
にリクエストを送信します。
<property> <name>fs.azure.account.auth.type</name> <value>OAuth</value> <description> Use OAuth 2.0 authentication </description> </property> <property> <name>fs.azure.account.oauth.provider.type</name> <value>org.apache.hadoop.fs.azurebfs.oauth2.RefreshTokenBasedTokenProvider</value> <description> Use the Refresh Token Provider </description> </property> <property> <name>fs.azure.account.oauth2.refresh.token</name> <value></value> <description> Refresh token </description> </property> <property> <name>fs.azure.account.oauth2.refresh.endpoint</name> <value></value> <description> Refresh token endpoint </description> </property> <property> <name>fs.azure.account.oauth2.client.id</name> <value></value> <description> Optional Client ID </description> </property>
Azure Managed Identities、以前の「Managed Service Identities」。
OAuth 2.0トークンは、実行中のVMからのみアクセス可能な特別なエンドポイント(http://169.254.169.254/metadata/identity/oauth2/token
)によって発行されます。発行された資格情報を使用して認証できます。
Azure Portal/CLIを使用してサービスIDを作成します。
<property> <name>fs.azure.account.auth.type</name> <value>OAuth</value> <description> Use OAuth authentication </description> </property> <property> <name>fs.azure.account.oauth.provider.type</name> <value>org.apache.hadoop.fs.azurebfs.oauth2.MsiTokenProvider</value> <description> Use MSI for issuing OAuth tokens </description> </property> <property> <name>fs.azure.account.oauth2.msi.tenant</name> <value></value> <description> Optional MSI Tenant ID </description> </property> <property> <name>fs.azure.account.oauth2.msi.endpoint</name> <value></value> <description> MSI endpoint </description> </property> <property> <name>fs.azure.account.oauth2.client.id</name> <value></value> <description> Optional Client ID </description> </property>
カスタムOAuth 2.0トークンプロバイダーは、getAccessToken()
メソッドが呼び出されたときに、ABFSコネクタにOAuth 2.0トークンを提供します。
<property> <name>fs.azure.account.auth.type</name> <value>Custom</value> <description> Custom Authentication </description> </property> <property> <name>fs.azure.account.oauth.provider.type</name> <value></value> <description> classname of Custom Authentication Provider </description> </property>
宣言されたクラスは、org.apache.hadoop.fs.azurebfs.extensions.CustomTokenProviderAdaptee
およびオプションでorg.apache.hadoop.fs.azurebfs.extensions.BoundDTExtension
を実装する必要があります。
宣言されたクラスは、アクセストークンをフェッチ中に再試行ロジックを実装する責任も負います。
委任トークンプロバイダーは、ABFSコネクタに委任トークンを提供し、CustomDelegationTokenManagerインターフェースを実装することでトークンの更新とキャンセルを支援します。
<property> <name>fs.azure.enable.delegation.token</name> <value>true</value> <description>Make this true to use delegation token provider</description> </property> <property> <name>fs.azure.delegation.token.provider.type</name> <value>{fully-qualified-class-name-for-implementation-of-CustomDelegationTokenManager-interface}</value> </property>
委任トークンが有効になっており、構成fs.azure.delegation.token .provider.type
が提供されていない場合は、IlleagalArgumentExceptionがスローされます。
Shared Access Signature(SAS)トークンプロバイダーは、SASTokenProviderインターフェイスを実装することにより、ABFSコネクタにSASトークンを提供します。
<property> <name>fs.azure.account.auth.type</name> <value>SAS</value> </property> <property> <name>fs.azure.sas.token.provider.type</name> <value>{fully-qualified-class-name-for-implementation-of-SASTokenProvider-interface}</value> </property>
宣言されたクラスは、org.apache.hadoop.fs.azurebfs.extensions.SASTokenProvider
を実装する必要があります。
コネクタは、JVMプロキシ設定を使用してプロキシ設定を制御します。
設定のオプションについては、Oracle Javaドキュメントを参照してください。
コネクタはデフォルトでHTTPSを使用するため、https.proxyHost
およびhttps.proxyPort
オプションを構成する必要があります。
distcpを含むMapReduceジョブでは、プロキシオプションをmapreduce.map.java.opts
とmapreduce.reduce.java.opts
の両方に設定する必要があります。
# this variable is only here to avoid typing the same values twice. # It's name is not important. export DISTCP_PROXY_OPTS="-Dhttps.proxyHost=web-proxy.example.com -Dhttps.proxyPort=80" hadoop distcp \ -D mapreduce.map.java.opts="$DISTCP_PROXY_OPTS" \ -D mapreduce.reduce.java.opts="$DISTCP_PROXY_OPTS" \ -update -skipcrccheck -numListstatusThreads 40 \ hdfs://namenode:8020/users/alice abfs://backups@account.dfs.core.windows.net/users/alice
これらの設定がない場合、コマンドラインからADLSへのアクセスが機能する場合でも、distcp
アクセスがネットワークエラーで失敗する可能性があります。
他のオブジェクトストアと同様に、ログインシークレットは貴重な情報です。組織は、それらを安全に共有するためのプロセスを持つ必要があります。
fs.azure.enable.flush
がtrue(デフォルト= true)に設定されている場合、Syncable
インターフェイスのhsync()
およびhflush()
操作がサポートされます。Wasbコネクタでは、これにより、どちらの呼び出しも50,000回に制限されましたHADOOP-15478。abfsに同様の制限がある場合、sync/flushを過度に使用すると問題が発生する可能性があります。すべてのAzureストレージサービスと同様に、Azure Datalake Gen 2ストアは、データとメタデータの完全な作成、読み取り、更新、および削除の一貫性を備えた、ストアの完全な一貫したビューを提供します。
階層型名前空間を持つコンテナの場合、スケーラビリティの数値は、Big-O記法では次のようになります。
操作 | スケーラビリティ |
---|---|
ファイルの名前変更 | O(1) |
ファイルの削除 | O(1) |
ディレクトリの名前変更 | O(1) |
ディレクトリの削除 | O(1) |
名前空間のないストアの場合、スケーラビリティは次のようになります。
操作 | スケーラビリティ |
---|---|
ファイルの名前変更 | O(1) |
ファイルの削除 | O(1) |
ディレクトリの名前変更 | O(ファイル) |
ディレクトリの削除 | O(ファイル) |
つまり、ファイルが多いほど、ディレクトリ操作が遅くなります。
ABFSコネクタは、サードパーティが認証および承認サービスをABFSクライアントに統合するための、いくつかの制限されたプライベート/不安定な拡張ポイントをサポートしています。
CustomDelegationTokenManager
:Hadoop委任トークンを発行する機能を追加します。SASTokenProvider
:Azure Storage共有アクセス署名(SAS)トークンのカスタムプロビジョニングを許可します。CustomTokenProviderAdaptee
:Azure OAuthトークンのカスタムプロビジョニングを許可します。KeyProvider
.これらの拡張ポイントの使用方法については、org.apache.hadoop.fs.azurebfs.extensions
のソースと関連するすべてのテストを参照してください。
警告 これらの拡張ポイントは不安定です。
構成オプションとそのデフォルト値の完全なリストについては、org.apache.hadoop.fs.azurebfs.constants.ConfigurationKeys
、org.apache.hadoop.fs.azurebfs.constants.FileSystemConfigurations
、およびorg.apache.hadoop.fs.azurebfs.AbfsConfiguration
のjavadocを参照してください。
fs.azure.client.correlationid
設定は、クライアントが提供するこの識別子を使用してクライアント要求を関連付けるオプションを提供します。この ID は、Azure Storage Analytics ログの request-id-header
フィールドに表示されます。参照: Storage Analytics ログ形式
この設定は、最大 72 文字で、英数字および/またはハイフンのみを含む文字列を受け入れます。入力が無効な場合は、デフォルトで空の文字列になります。
fs.azure.tracingcontext.format
設定は、request-id-header
に含まれる ID の形式を選択するオプションを提供します。この設定は、以下の enum オプションに対応する String 値を受け入れます。SINGLE_ID_FORMAT
: clientRequestId ALL_ID_FORMAT
: すべての ID (デフォルト) TWO_ID_FORMAT
: clientCorrelationId:clientRequestId
fs.azure.enable.flush
設定は、ABFS フラッシュ API (HFlush() および HSync()) を no-op にするオプションを提供します。デフォルトでは、この設定は true に設定されます。
どちらの API も、データが永続化されることを保証します。
fs.azure.disable.outputstream.flush
設定は、AbfsOutputStream で OutputStream Flush() API を no-op にするオプションを提供します。デフォルトでは、この設定は true に設定されます。
Hflush() が永続的なデータ転送を提供する唯一のドキュメント化された API であるため、Flush() がバッファリングされたデータを永続化しようとすると、パフォーマンスの問題が発生します。
fs.azure.account.expect.header.enabled
: この構成パラメータは、各追加リクエストで Expect: 100-continue ヘッダーを送信するかどうかを指定するために使用されます。デフォルトでは true に設定されています。このフラグは、クライアントが出力ストリームからデータのブロックをアップロードする前に、Azure ストレージに確認するように構成します。これにより、クライアントは実際にブロックをアップロードする前に、正常にスロットリングをバックオフできます。実験では、これにより高負荷下でのスループットが大幅に向上します。詳細については、次のリンクを参照してください: - https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Expect
fs.azure.account.operation.idle.timeout
: この値は、アナライザー (読み取りまたは書き込み) のタイマーが、新しいリクエストが再び行われるまで一時停止されるまでの時間を指定します。デフォルト値は 60 秒です。
fs.azure.account.hns.enabled
設定は、ストレージアカウントが HNS が有効になっているかどうかを指定するオプションを提供します。設定が提供されていない場合は、サーバー呼び出しが行われ、確認されます。
fs.azure.enable.check.access
を true に設定すると、AzureBlobFileSystem.access() を有効にする必要があります。
サーバーのタイムアウトやネットワーク障害によるリクエストの失敗は、リトライされます。PUT/POST 操作はべき等であり、名前変更と削除操作を除き、特別な処理は必要ありません。
名前変更のべき等性チェックは、リトライ時にソースパスが存在しない場合、宛先の LastModifiedTime が最近であることを確認することで行われます。
削除は、リトライ時にターゲットが存在しない場合、デフォルトでべき等であると見なされます。
次の設定が true に設定されている場合、FileStatus および AclStatus の一部であるグループ名は、ユーザー名と同じに設定されます fs.azure.skipUserGroupMetadataDuringInitialization
。
次の設定は、読み取りおよび書き込み操作に関連しています。
fs.azure.io.retry.max.retries
: IO 操作のリトライ回数を設定します。現在、これはサーバー呼び出しのリトライロジックでのみ使用されます。AbfsClient
クラス内で ExponentialRetryPolicy の一部として使用されます。値は 0 以上である必要があります。
fs.azure.io.retry.min.backoff.interval
: IO 操作のリトライの最小バックオフ間隔を設定します。現在、これはサーバー呼び出しのリトライロジックでのみ使用されます。AbfsClient
クラス内で ExponentialRetryPolicy の一部として使用されます。この値は、IO 操作をリトライする前に待機する最小間隔 (ミリ秒単位) を示します。デフォルト値は 3000 (3 秒) です。
fs.azure.io.retry.max.backoff.interval
: IO 操作のリトライの最大バックオフ間隔を設定します。現在、これはサーバー呼び出しのリトライロジックでのみ使用されます。AbfsClient
クラス内で ExponentialRetryPolicy の一部として使用されます。この値は、IO 操作をリトライする前に待機する最大間隔 (ミリ秒単位) を示します。デフォルト値は 30000 (30 秒) です。
fs.azure.io.retry.backoff.interval
: IO 操作のリトライのデフォルトのバックオフ間隔を設定します。現在、これはサーバー呼び出しのリトライロジックでのみ使用されます。AbfsClient
クラス内で ExponentialRetryPolicy の一部として使用されます。この値は、指定された値の 80% から 120% の間のランダムなデルタを計算するために使用されます。このランダムなデルタは、現在の IO リトライ番号の指数 (つまり、デフォルトは 2^(retryNum - 1)
が乗算されます) で乗算され、次に、[fs.azure.io.retry.min.backoff.interval
, fs.azure.io.retry.max.backoff.interval
] の範囲内に制限され、次の IO リトライを試行する前に待機する時間を決定します。デフォルト値は 3000 (3 秒) です。
fs.azure.write.request.size
: 書き込みバッファサイズを設定します。値をバイト単位で指定します。値は 16384 から 104857600 の両端を含む範囲 (16 KB から 100 MB) である必要があります。デフォルト値は 8388608 (8 MB) です。
fs.azure.read.request.size
: 読み取りバッファサイズを設定します。値をバイト単位で指定します。値は 16384 から 104857600 の両端を含む範囲 (16 KB から 100 MB) である必要があります。デフォルト値は 4194304 (4 MB) です。
fs.azure.read.alwaysReadBufferSize
: fs.azure.read.request.size
で構成された読み取りリクエストサイズは、読み取りがシーケンシャルパターンで行われる場合にのみ有効になります。読み取りパターンがランダムであると検出された場合、読み取りサイズは、呼び出しプロセスによって提供されるバッファ長と同じになります。この設定を true に設定すると、ランダム読み取りもシーケンシャル読み取りと同じリクエストサイズで強制的に読み取られます。これは、ADLS Gen1 と同じ読み取りパターンにするための手段です。ADLS Gen1 は読み取りパターンを区別せず、常に構成された読み取りリクエストサイズで読み取ります。この設定のデフォルト値は false になり、ランダムな読み取りパターンが検出されたときに、提供されたバッファ長の読み取りが行われます。
fs.azure.readaheadqueue.depth
: AbfsInputStream での先読みキューの深さを設定します。設定された値が負の場合、先読みキューの深さは Runtime.getRuntime().availableProcessors() として設定されます。デフォルトでは、値は 2 です。先読みを無効にするには、この値を 0 に設定します。ワークロードがランダム読み取り (非シーケンシャル) のみを行っている場合や、スロットリングが発生している場合は、この値を 0 に設定してみてください。
fs.azure.read.readahead.blocksize
: 先読みの読み取りバッファサイズを設定します。値をバイト単位で指定します。値は 16384 から 104857600 の両端を含む範囲 (16 KB から 100 MB) である必要があります。デフォルト値は 4194304 (4 MB) です。
fs.azure.buffered.pread.disable
: デフォルトでは、位置読み取り API は入力ストリームに対してシークおよび読み取りを行います。この読み取りは AbfsInputStream のバッファキャッシュを埋め、カーソル位置を更新します。この最適化が true の場合、バッファの使用をスキップし、BLOB から読み取るためのロックフリー REST 呼び出しを行います。この最適化は、共有 AbfsInputStream インスタンスに対する HBase のような短いランダム読み取りに非常に役立ちます。注意: これはクラスターレベルで設定できる設定ではありません。FutureDataInputStreamBuilder のオプションとして使用できます。FileSystem#openFile(Path path) を参照してください。
メモリが限られた状況で実行するには、以下を構成します。特に、同じプロセスからの書き込みが多すぎる場合。
fs.azure.write.max.concurrent.requests
: AbfsOutputStream インスタンスからサーバーへの同時書き込みリクエストの最大数を設定します。事実上、これは AbfsOutputStream インスタンス内のスレッドプールサイズになります。値を 1 から 8 の両端を含む範囲に設定します。
fs.azure.write.max.requests.to.queue
: キューに入れられる最大書き込みリクエスト数を設定します。各キューに入れられたリクエストがバッファを保持することを考慮して、AbfsOutputStream インスタンスのメモリ消費量をこの設定で調整できます。s.azure.write.max.concurrent.requests に設定された値の 3 倍または 4 倍の値を設定します。
fs.azure.analysis.period
: メトリクスを分析した後、スリープ時間が再計算されるまでの時間。デフォルト値は 10 秒です。
fs.azure.always.use.https
: フラグが true に設定されている場合、HTTP の代わりに HTTPS を使用することを強制します。フラグに関係なく、AbfsClient
は、セキュアスキーム (ABFSS) が使用されている場合、または OAuth が認証に使用されている場合は、HTTPS を使用します。デフォルトでは、これは true に設定されます。
fs.azure.ssl.channel.mode
: 指定された SSL チャネルモードで DelegatingSSLSocketFactory を初期化します。値は、enum DelegatingSSLSocketFactory.SSLChannelMode である必要があります。デフォルト値は DelegatingSSLSocketFactory.SSLChannelMode.Default です。
設定 fs.azure.io.read.tolerate.concurrent.append
が true に設定されている場合、読み取り呼び出しのためにサーバーに送信される If-Match ヘッダーは * に設定され、それ以外の場合は ETag で設定されます。これは基本的に、楽観的同時実行で読み取りを処理するためのメカニズムです。詳細については、次のリンクを参照してください。1. https://docs.microsoft.com/en-us/rest/api/storageservices/datalakestoragegen2/path/read 2. https://azure.microsoft.com/de-de/blog/managing-concurrency-in-microsoft-azure-storage-2/
listStatus API は、ページ単位でサーバーから FileStatus 情報を取得します。設定 fs.azure.list.max.results
は、ページサイズ (呼び出しあたりの最大結果数) を設定する maxResults URI パラメータを設定するために使用されます。値は > 0 である必要があります。デフォルトでは、これは 5000 になります。サーバーには、このパラメータの最大値として 5000 があります。したがって、設定が 5000 を超えている場合でも、応答には 5000 エントリのみが含まれます。詳細については、次のリンクを参照してください。 https://docs.microsoft.com/en-us/rest/api/storageservices/datalakestoragegen2/path/list
ABFS ドライバーには、エラーを最小限に抑えることで最大スループットを実現するために、読み取りおよび書き込み操作をスロットリングする機能があります。エラーは、アカウントのイングレスまたはエグレス制限を超過した場合、およびサーバー側がリクエストをスロットリングした場合に発生します。サーバー側のスロットリングによりリトライポリシーが使用されますが、リトライポリシーは長時間スリープするため、イングレスまたはエグレスのスループットの合計が最適値より 35% も低くなる可能性があります。リトライポリシーは、リクエストが失敗した後に適用されるという点で事後的でもあります。一方、ここで実装されているクライアント側のスロットリングは、リクエストが行われる前に発生し、エラーを最小限に抑えるのに十分な時間だけスリープするため、最適なイングレスおよび/またはエグレススループットが可能になります。デフォルトでは、スロットリングメカニズムはドライバーで有効になっています。設定 fs.azure.enable.autothrottling
を false に設定することで、無効にすることができます。
fs.azure.atomic.rename.key
: アトミックな名前変更をサポートするディレクトリを、この設定でカンマ区切りで指定できます。名前変更のソースが構成されたディレクトリのいずれかに属している場合、ドライバーは次の警告ログを出力します。「アトミックな名前変更機能は ABFS スキームではサポートされていません。ただし、Azure ストレージアカウントで名前空間が有効になっている場合、名前変更、作成、および削除操作はアトミックです。」 ディレクトリは、カンマ区切り値として指定できます。デフォルトでは、値は "/hbase" です。
fs.azure.infinite-lease.directories
: この設定では、無限リースをサポートするディレクトリをカンマ区切りで指定できます。デフォルトでは、複数のクライアントが同時に同じファイルに書き込むことができます。この設定で指定されたディレクトリ内のファイルに書き込む場合、クライアントはファイルのリースを取得し、他のクライアントがファイルに書き込むのを防ぎます。出力ストリームが閉じられると、リースは解放されます。ファイルのクライアントの書き込みアクセスを取り消すには、AzureBlobFilesystem の breakLease メソッドを呼び出すことができます。クライアントがファイルを閉じてリースを解放する前に停止した場合、別のクライアントがファイルに書き込めるようにするには、breakLease を呼び出す必要があります。
fs.azure.lease.threads
: これは、無限リースディレクトリのリース操作に使用されるスレッドプールのサイズです。デフォルト値は 0 なので、無限リースディレクトリをサポートするには、少なくとも 1 に設定する必要があります。
fs.azure.abfs.latency.track
を true
に設定すると、モジュールは ABFS HTTP トラフィックのパフォーマンスメトリクスの追跡を開始します。この数値をマシンまたはクラスターで取得するには、log4j
設定で AbfsPerfTracker
クラスのデバッグログを有効にする必要もあります。典型的なパフォーマンスログの行は次のようになります。
h=KARMA t=2019-10-25T20:21:14.518Z a=abfstest01.dfs.core.windows.net c=abfs-testcontainer-84828169-6488-4a62-a875-1e674275a29f cr=delete ce=deletePath r=Succeeded l=32 ls=32 lc=1 s=200 e= ci=95121dae-70a8-4187-b067-614091034558 ri=97effdcf-201f-0097-2d71-8bae00000000 ct=0 st=0 rt=0 bs=0 br=0 m=DELETE u=https%3A%2F%2Fabfstest01.dfs.core.windows.net%2Ftestcontainer%2Ftest%3Ftimeout%3D90%26recursive%3Dtrue
各フィールドの定義は次のとおりです。
h
: ホスト名 t
: このリクエストがログに記録された時間 a
: Azure ストレージアカウント名 c
: コンテナ名 cr
: 呼び出し元メソッドの名前 ce
: 呼び出し先メソッドの名前 r
: 結果 (成功/失敗) l
: レイテンシー (呼び出し先で費やされた時間) ls
: レイテンシー合計 (呼び出し元で費やされた集計時間。複数の呼び出し先がある場合にログに記録されます。最後の呼び出し先でログに記録されます) lc
: レイテンシーカウント (呼び出し先の数。複数の呼び出し先がある場合にログに記録されます。最後の呼び出し先でログに記録されます) s
: HTTP ステータスコード e
: エラーコード ci
: クライアントリクエスト ID ri
: サーバーリクエスト ID ct
: 接続時間 (ミリ秒単位) st
: 送信時間 (ミリ秒単位) rt
: 受信時間 (ミリ秒単位) bs
: 送信されたバイト数 br
: 受信されたバイト数 m
: HTTP メソッド (GET, PUT など) u
: エンコードされた HTTP URL
これらのパフォーマンス数値は、後続のリクエストの x-ms-abfs-client-latency
HTTP ヘッダーにも ADLS Gen 2 API エンドポイントに送り返されます。Azure はこれらの設定を使用して、エンドツーエンドのレイテンシーを追跡します。
コネクタに関連する問題は、通常、次の順序で発生します。
org.apache.hadoop.fs.azurebfs.services
を DEBUG
でログに記録すると、失敗しているリクエストの詳細が表示されます。
接続をデバッグするのに役立つツールは、cloudstore storediag ユーティリティです。
これは、クラスパス、設定を検証し、ファイルシステムを操作しようとします。
bin/hadoop jar cloudstore-0.1-SNAPSHOT.jar storediag abfs://container@account.dfs.core.windows.net/
storediag
コマンドが abfs ストアを操作できない場合、他のものが動作する可能性は低いでしょう。storediag
ストアが正常に動作する場合でも、クラスターの残りの部分のクラスパスまたは構成も動作するとは限りません。特に分散アプリケーションではそうですが、少なくとも開始点になります。ClassNotFoundException: org.apache.hadoop.fs.azurebfs.AzureBlobFileSystem
hadoop-azure
JAR がクラスパスにありません。
java.lang.RuntimeException: java.lang.ClassNotFoundException: Class org.apache.hadoop.fs.azurebfs.AzureBlobFileSystem not found at org.apache.hadoop.conf.Configuration.getClass(Configuration.java:2625) at org.apache.hadoop.fs.FileSystem.getFileSystemClass(FileSystem.java:3290) at org.apache.hadoop.fs.FileSystem.createFileSystem(FileSystem.java:3322) at org.apache.hadoop.fs.FileSystem.access$200(FileSystem.java:136) at org.apache.hadoop.fs.FileSystem$Cache.getInternal(FileSystem.java:3373) at org.apache.hadoop.fs.FileSystem$Cache.get(FileSystem.java:3341) at org.apache.hadoop.fs.FileSystem.get(FileSystem.java:491) at org.apache.hadoop.fs.Path.getFileSystem(Path.java:361) Caused by: java.lang.ClassNotFoundException: Class org.apache.hadoop.fs.azurebfs.AzureBlobFileSystem not found at org.apache.hadoop.conf.Configuration.getClassByName(Configuration.java:2529) at org.apache.hadoop.conf.Configuration.getClass(Configuration.java:2623) ... 16 more
ヒント: これがコマンドラインで発生している場合は、hadoop スクリプトのデバッグログをオンにできます。
export HADOOP_SHELL_SCRIPT_DEBUG=true
これがクラスター内で実行されているアプリケーションで発生している場合、クラスターは (何らかの方法で) デプロイされたアプリケーションのクラスパスに hadoop-azure
モジュールとその依存関係が置かれるように構成する必要があることを意味します。
ClassNotFoundException: com.microsoft.azure.storage.StorageErrorCode
azure-storage
JAR がクラスパスにありません。
Server failed to authenticate the request
デフォルトの共有キー認証メカニズムを使用しているときに、リクエストが認証されませんでした。
Operation failed: "Server failed to authenticate the request. Make sure the value of Authorization header is formed correctly including the signature.", 403, HEAD, https://account.dfs.core.windows.net/container2?resource=filesystem&timeout=90 at org.apache.hadoop.fs.azurebfs.services.AbfsRestOperation.execute(AbfsRestOperation.java:135) at org.apache.hadoop.fs.azurebfs.services.AbfsClient.getFilesystemProperties(AbfsClient.java:209) at org.apache.hadoop.fs.azurebfs.AzureBlobFileSystemStore.getFilesystemProperties(AzureBlobFileSystemStore.java:259) at org.apache.hadoop.fs.azurebfs.AzureBlobFileSystem.fileSystemExists(AzureBlobFileSystem.java:859) at org.apache.hadoop.fs.azurebfs.AzureBlobFileSystem.initialize(AzureBlobFileSystem.java:110)
原因は次のとおりです。
Configuration property _something_.dfs.core.windows.net not found
特定のアカウントのアクセスキーを宣言する fs.azure.account.key.
エントリがクラスター構成にないか、間違った URL を使用しています。
$ hadoop fs -ls abfs://container@abfswales2.dfs.core.windows.net/ ls: Configuration property abfswales2.dfs.core.windows.net not found.
No such file or directory when trying to list a container
指定された名前のコンテナはありません。入力ミスであるか、コンテナを作成する必要があります。
$ hadoop fs -ls abfs://container@abfswales1.dfs.core.windows.net/ ls: `abfs://container@abfswales1.dfs.core.windows.net/': No such file or directory
text/html
、text/plain
、application/xml
です。OAuth 認証ページは HTTP エラーコードで失敗しませんでしたが、JSON も返しませんでした。
$ bin/hadoop fs -ls abfs://container@abfswales1.dfs.core.windows.net/ ... ls: HTTP Error 200; url='https://login.microsoftonline.com/02a07549-0a5f-4c91-9d76-53d172a638a2/oauth2/authorize' AADToken: HTTP connection to https://login.microsoftonline.com/02a07549-0a5f-4c91-9d76-53d172a638a2/oauth2/authorize failed for getting token from AzureAD. Unexpected response. Check configuration, URLs and proxy settings. proxies=none; requestId='dd9d526c-8b3d-4b3f-a193-0cf021938600'; contentType='text/html; charset=utf-8';
考えられる原因は、構成とネットワークです。
java.io.IOException: The ownership on the staging directory /tmp/hadoop-yarn/staging/user1/.staging is not as expected. It is owned by <principal_id>. The directory must be owned by the submitter user1 or user1
Azure Managed Identities を使用する場合、ADLS Gen2 のファイル/ディレクトリはデフォルトでサービスプリンシパルのオブジェクト ID、つまりプリンシパル ID によって所有されます。また、ローカル OS ユーザー 'user1' としてジョブを送信すると、上記例外が発生します。
修正するには、core-site.xml
に以下のプロパティを追加して、ローカル OS ユーザーに所有権を模倣します。
<property> <name>fs.azure.identity.transformer.service.principal.id</name> <value>service principal object id</value> <description> An Azure Active Directory object ID (oid) used as the replacement for names contained in the list specified by “fs.azure.identity.transformer.service.principal.substitution.list”. Notice that instead of setting oid, you can also set $superuser here. </description> </property> <property> <name>fs.azure.identity.transformer.service.principal.substitution.list</name> <value>user1</value> <description> A comma separated list of names to be replaced with the service principal ID specified by “fs.azure.identity.transformer.service.principal.id”. This substitution occurs when setOwner, setAcl, modifyAclEntries, or removeAclEntries are invoked with identities contained in the substitution list. Notice that when in non-secure cluster, asterisk symbol * can be used to match all user/group. </description> </property>
上記のプロパティを構成すると、hdfs dfs -ls abfs://container1@abfswales1.dfs.core.windows.net/
では、ADLS Gen2 のファイル/ディレクトリが 'user1' によって所有されるようになります。
Testing Azure の関連セクションを参照してください。