Hadoop-Aliyun モジュール: Aliyun Web サービスとの統合

概要

hadoop-aliyun モジュールは、Aliyun オブジェクトストレージサービス (Aliyun OSS) との Aliyun 統合をサポートします。生成された JAR ファイル hadoop-aliyun.jar は、このサポートに必要なすべての外部アーティファクトに対する推移的な依存関係も宣言しており、ダウンストリームアプリケーションがこのサポートを簡単に使用できるようにします。

Apache Hadoop のデフォルトのクラスパスに含めるには、hadoop-env.sh の HADOOP_OPTIONAL_TOOLS のリストに 'hadoop-aliyun' が含まれていることを確認してください。

機能

  • Aliyun OSS に保存されているデータの読み取りと書き込み。
  • 標準の Hadoop FileSystem インターフェースを実装することにより、階層型ファイルシステムビューを提供します。
  • MapReduce ジョブのデータソースまたはシンクとして機能できます。

警告 #1: オブジェクトストアはファイルシステムではありません。

Aliyun OSS は、「オブジェクトストア」の一例です。スケーラビリティと特に高可用性を実現するために、Aliyun OSS は従来の「POSIX」ファイルシステムが約束する制約の一部を緩和しています。

具体的には

  1. アトミック操作: delete()rename() は、ファイルごとの再帰的な操作によって実装されます。これらは、少なくともファイル数に比例した時間がかかり、その間、部分的な更新が表示される場合があります。 delete()rename() はアトミック性を保証できません。操作が中断されると、ファイルシステムは中間状態のままになります。
  2. ファイルの所有者とグループは保持されますが、パーミッションモデルは適用されません。認証は、Aliyun リソースアクセス管理 (Aliyun RAM) を介して Aliyun アカウント全体レベルで行われます。
  3. ディレクトリの最終アクセス時刻は追跡されません。
  4. 追加操作はサポートされていません。

警告 #2: ディレクトリの最終アクセス時刻は追跡されません。

これに依存する Hadoop の機能は、予期しない動作をする可能性があります。たとえば、YARN の AggregatedLogDeletionService は、適切なログファイルを削除しません。

警告 #3: Aliyun クレデンシャルは貴重です

Aliyun クレデンシャルは、サービスの料金を支払うだけでなく、データへの読み取りおよび書き込みアクセスを提供します。アカウントを持つ人は誰でも、データセットを読み取ることができるだけでなく、削除することもできます。

次の方法でこれらのクレデンシャルを誤って共有しないでください。1. シークレットを含む構成ファイルを SCM にチェックインする。2. コンソールに記録する (必ず見られることになるため)。3. oss://accessKeyId:accessKeySecret@directory/file などの URL にクレデンシャルを含むファイルシステム URI を定義する。ログやエラーメッセージに表示されます。4. バグレポートにシークレットを含める。

これらのいずれかを行った場合は、すぐにクレデンシャルを変更してください!

警告 #4: Aliyun E-MapReduce によって提供される Aliyun OSS クライアントは、この実装とは異なります

具体的には、Aliyun E-MapReduce では、oss:// もサポートされていますが、実装が異なります。Aliyun E-MapReduce を使用している場合は、これらの手順に従ってください。また、E-MapReduce での Aliyun OSS 統合に関連するすべての問題は、Aliyun 自身のみが対処できることに注意してください。問題が発生した場合は、Aliyun にお問い合わせください。

OSS

認証プロパティ

<property>
  <name>fs.oss.accessKeyId</name>
  <description>Aliyun access key ID</description>
</property>

<property>
  <name>fs.oss.accessKeySecret</name>
  <description>Aliyun access key secret</description>
</property>

<property>
  <name>fs.oss.credentials.provider</name>
  <description>
    Class name of a credentials provider that implements
    com.aliyun.oss.common.auth.CredentialsProvider. Omit if using access/secret keys
    or another authentication mechanism. The specified class must provide an
    accessible constructor accepting java.net.URI and
    org.apache.hadoop.conf.Configuration, or an accessible default constructor.
  </description>
</property>

その他のプロパティ

<property>
  <name>fs.AbstractFileSystem.oss.impl</name>
  <value>org.apache.hadoop.fs.aliyun.oss.OSS</value>
  <description>The implementation class of the OSS AbstractFileSystem.
    If you want to use OSS as YARN’s resource storage dir via the
    fs.defaultFS configuration property in Hadoop’s core-site.xml,
    you should add this configuration to Hadoop's core-site.xml
  </description>
</property>

<property>
  <name>fs.oss.endpoint</name>
  <description>Aliyun OSS endpoint to connect to. An up-to-date list is
    provided in the Aliyun OSS Documentation.
   </description>
</property>

<property>
   <name>fs.oss.impl</name>
   <value>org.apache.hadoop.fs.aliyun.oss.AliyunOSSFileSystem</value>
</property>

<property>
  <name>fs.oss.proxy.host</name>
  <description>Hostname of the (optinal) proxy server for Aliyun OSS connection</description>
</property>

<property>
  <name>fs.oss.proxy.port</name>
  <description>Proxy server port</description>
</property>

<property>
  <name>fs.oss.proxy.username</name>
  <description>Username for authenticating with proxy server</description>
</property>

<property>
  <name>fs.oss.proxy.password</name>
  <description>Password for authenticating with proxy server.</description>
</property>

<property>
  <name>fs.oss.proxy.domain</name>
  <description>Domain for authenticating with proxy server.</description>
</property>

<property>
  <name>fs.oss.proxy.workstation</name>
  <description>Workstation for authenticating with proxy server.</description>
</property>

<property>
  <name>fs.oss.attempts.maximum</name>
  <value>20</value>
  <description>How many times we should retry commands on transient errors.</description>
</property>

<property>
  <name>fs.oss.connection.establish.timeout</name>
  <value>50000</value>
  <description>Connection setup timeout in milliseconds.</description>
</property>

<property>
  <name>fs.oss.connection.timeout</name>
  <value>200000</value>
  <description>Socket connection timeout in milliseconds.</description>
</property>

<property>
  <name>fs.oss.paging.maximum</name>
  <value>1000</value>
  <description>How many keys to request from Aliyun OSS when doing directory listings at a time.
  </description>
</property>

<property>
  <name>fs.oss.multipart.upload.size</name>
  <value>10485760</value>
  <description>Size of each of multipart pieces in bytes.</description>
</property>

<property>
  <name>fs.oss.upload.active.blocks</name>
  <value>4</value>
  <description>Active(Concurrent) upload blocks when uploading a file.</description>
</property>

<property>
  <name>fs.oss.multipart.download.threads</name>
  <value>10</value>
  <description>The maximum number of threads allowed in the pool for multipart download and upload.</description>
</property>

<property>
  <name>fs.oss.multipart.download.ahead.part.max.number</name>
  <value>4</value>
  <description>The maximum number of read ahead parts when reading a file.</description>
</property>

<property>
  <name>fs.oss.max.total.tasks</name>
  <value>128</value>
  <description>The maximum queue number for multipart download and upload.</description>
</property>

<property>
  <name>fs.oss.max.copy.threads</name>
  <value>25</value>
  <description>The maximum number of threads allowed in the pool for copy operations.</description>
</property>

<property>
  <name>fs.oss.max.copy.tasks.per.dir</name>
  <value>5</value>
  <description>The maximum number of concurrent tasks allowed when copying a directory.</description>
</property>

<property>
  <name>fs.oss.multipart.upload.threshold</name>
  <value>20971520</value>
  <description>Minimum size in bytes before we start a multipart uploads or copy.
    Notice: This property is deprecated and will be removed in further version.
  </description>
</property>

<property>
  <name>fs.oss.multipart.download.size</name>
  <value>102400/value>
  <description>Size in bytes in each request from ALiyun OSS.</description>
</property>

<property>
  <name>fs.oss.list.version</name>
  <value>2</value>
  <description>Select which version of the OSS SDK's List Objects API to use.
    Currently support 2(default) and 1(older API).
  </description>
</property>

<property>
  <name>fs.oss.buffer.dir</name>
  <description>Comma separated list of directories to buffer OSS data before uploading to Aliyun OSS</description>
</property>

<property>
  <name>fs.oss.acl.default</name>
  <value></vaule>
  <description>Set a canned ACL for bucket. Value may be private, public-read, public-read-write.
  </description>
</property>

<property>
  <name>fs.oss.server-side-encryption-algorithm</name>
  <value></vaule>
  <description>Specify a server-side encryption algorithm for oss: file system.
     Unset by default, and the only other currently allowable value is AES256.
  </description>
</property>

<property>
  <name>fs.oss.connection.maximum</name>
  <value>32</value>
  <description>Number of simultaneous connections to oss.</description>
</property>

<property>
  <name>fs.oss.connection.secure.enabled</name>
  <value>true</value>
  <description>Connect to oss over ssl or not, true by default.</description>
</property>

hadoop-aliyun モジュールのテスト

oss:// ファイルシステムクライアントをテストするには、テストランナーに認証の詳細を渡す 2 つのファイルが必要です。

  1. auth-keys.xml
  2. core-site.xml

これら 2 つの構成ファイルは、hadoop-tools/hadoop-aliyun/src/test/resources に配置する必要があります。

core-site.xml

このファイルは既に存在し、auth-keys.xml で作成された構成を読み込みます。

ほとんどの場合、テスト中に特定のデフォルト以外のプロパティを設定する必要がある場合を除き、変更は必要ありません。

auth-keys.xml

このファイルは、Aliyun OSS モジュールのテストをトリガーします。このファイルがないと、*このモジュールのテストは実行されません*

Aliyun OSS に接続するために必要なアクセスキー ID/シークレットとプロキシ情報が含まれており、OSS バケット URL も提供する必要があります。

  1. test.fs.oss.name : Aliyun OSS テストのバケットの URL

バケットの内容はテストプロセス中にクリーンアップされるため、テスト以外の目的でバケットを使用しないでください。

Hadoop 契約テストを実行する

/test/resources の下にファイル contract-test-options.xml を作成します。特定のファイル fs.contract.test.fs.oss テストパスが定義されていない場合、これらのテストはスキップされます。これらのテストを実行するにはクレデンシャルも必要です。auth-keys.xml からコピーするか、直接 XInclude 組み込みによってコピーできます。contract-test-options.xml の例を次に示します。

<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>

<include xmlns="http://www.w3.org/2001/XInclude"
href="auth-keys.xml"/>

  <property>
    <name>fs.contract.test.fs.oss</name>
    <value>oss://spark-tests</value>
  </property>

  <property>
    <name>fs.oss.impl</name>
    <value>org.apache.hadoop.fs.aliyun.oss.AliyunOSSFileSystem</value>
  </property>

  <property>
    <name>fs.oss.endpoint</name>
    <value>oss-cn-hangzhou.aliyuncs.com</value>
  </property>

  <property>
    <name>fs.oss.buffer.dir</name>
    <value>/tmp/oss</value>
  </property>

  <property>
    <name>fs.oss.multipart.download.size</name>
    <value>102400</value>
  </property>
</configuration>