クラス org.apache.hadoop.fs.FSDataOutputStreamBuilder

FSDataOutputStreamとそのサブクラスのビルダーパターン。これは、FileSystem上の新しいファイルを作成するか、既存のファイルを開いて書き込みを行うために使用されます。

不変条件

FSDataOutputStreamBuilderインターフェースは、build()が呼び出されるまで、パラメーターを検証したり、FileSystemの状態を変更したりしません。

実装に依存しないパラメーター。

FSDataOutputStreamBuilder create()

FileSystemにファイルを作成するFSDataOutputStreamBuilderを指定します。CreateFlag#CREATEと同等です。

FSDataOutputStreamBuilder append()

FileSystem上の既存のファイルに追加するFSDataOutputStreamBuilderを指定します。CreateFlag#APPENDと同等です。

FSDataOutputStreamBuilder overwrite(boolean overwrite)

既存のファイルを上書きするかどうかをFSDataOutputStreamBuilderで指定します。overwrite==trueを指定すると、既存のファイルが切り捨てられます。CreateFlag#OVERWITEと同等です。

FSDataOutputStreamBuilder permission(FsPermission permission)

ファイルのパーミッションを設定します。

FSDataOutputStreamBuilder bufferSize(int bufSize)

使用するバッファーのサイズを設定します。

FSDataOutputStreamBuilder replication(short replica)

レプリケーションファクターを設定します。

FSDataOutputStreamBuilder blockSize(long size)

ブロックサイズをバイト単位で設定します。

FSDataOutputStreamBuilder recursive()

親ディレクトリが存在しない場合は作成します。

FSDataOutputStreamBuilder progress(Progresable prog)

進行状況を報告する機能設定します。

FSDataOutputStreamBuilder checksumOpt(ChecksumOpt chksumOpt)

チェックサムオプションを設定します。

オプションまたは必須のパラメーターを設定します

FSDataOutputStreamBuilder opt(String key, ...)
FSDataOutputStreamBuilder must(String key, ...)

ビルダーにオプションまたは必須のパラメーターを設定します。opt()またはmust()を使用すると、クライアントはFileSystemの具体的な型を検査せずに、FS固有のパラメーターを指定できます。

// Don't
if (fs instanceof FooFileSystem) {
    FooFileSystem fs = (FooFileSystem) fs;
    out = dfs.createFile(path)
        .optionA()
        .optionB("value")
        .cache()
        .build()
} else if (fs instanceof BarFileSystem) {
    ...
}

// Do
out = fs.createFile(path)
    .permission(perm)
    .bufferSize(bufSize)
    .opt("foofs:option.a", true)
    .opt("foofs:option.b", "value")
    .opt("barfs:cache", true)
    .must("foofs:cache", true)
    .must("barfs:cache-size", 256 * 1024 * 1024)
    .build();

実装上の注意

具体的なFileSystemおよび/またはFSDataOutputStreamBuilderの実装は、実装に依存しないパラメーター (つまり、「同期可能」) または実装固有のパラメーター (つまり、「foofs:cache」) がサポートされていることを検証する必要があります。FileSystemは、オプションのパラメーター (opt(key, …)を使用) をベストエフォートで満たします。必須のパラメーター (must(key, …)を使用) がFileSystemで満たせない場合は、build()IllegalArgumentExceptionがスローされる必要があります。

ビルダーメソッド (つまり、bufferSize()) およびopt()/must()によって設定されたパラメーター間の競合を解決する動作は次のとおりです。

最後に指定されたオプションが、値とそのオプション/必須の状態を定義します。

HDFS固有のパラメーター。

HdfsDataOutputStreamBuilder extends FSDataOutputStreamBuilderは、ファイルの作成/追加の動作をさらにカスタマイズするためのHDFS固有の追加パラメーターを提供します。

FSDataOutpuStreamBuilder favoredNodes(InetSocketAddress[] nodes)

新しいブロックに推奨されるDataNodeを設定します。

FSDataOutputStreamBuilder syncBlock()

クローズされたブロックをディスクデバイスに強制的に書き込みます。CreateFlag#SYNC_BLOCKを参照してください。

FSDataOutputStreamBuilder lazyPersist()

可能な場合は、一時ストレージにブロックを作成します。

FSDataOutputStreamBuilder newBlock()

最後の部分ブロックの最後ではなく、新しいブロックにデータを追加します。

FSDataOutputStreamBuilder noLocalWrite()

ブロックレプリカがローカルDataNodeに書き込まれないように指示します。

FSDataOutputStreamBuilder ecPolicyName()

親ディレクトリのレプリケーションポリシーまたはイレイジャーコーディングポリシーに関係なく、ファイルがイレイジャーコーディングポリシー「policyName」のストライプファイルになるように強制します。

FSDataOutputStreamBuilder replicate()

親ディレクトリのレプリケーションポリシーまたはイレイジャーコーディングポリシーに関係なく、ファイルが複製ファイルになるように強制します。

ビルダーインターフェース

FSDataOutputStream build()

基になるFileSystemに新しいファイルを作成するか、既存のファイルを追加し、書き込み用のFSDataOutputStreamを返します。

前提条件

次のパラメーターの組み合わせはサポートされていません。

if APPEND|OVERWRITE: raise HadoopIllegalArgumentException
if CREATE|APPEND|OVERWRITE: raise HadoopIllegalArgumentExdeption

FileSystemは、他の理由でリクエストを拒否し、IOExceptionをスローする可能性があります。FileSystem#create(path, ...)およびFileSystem#append()を参照してください。

事後条件

FS' where :
   FS'.Files'[p] == []
   ancestors(p) is-subset-of FS'.Directories'

result = FSDataOutputStream

結果は、ファイルシステムにデータを書き込むために使用されるFSDataOutputStreamです。

S3A固有のオプション

S3Aコネクターがサポートするカスタムオプションを次に示します。

名前 タイプ 意味
fs.s3a.create.performance ブール値 最大のパフォーマンスでファイルを作成します
fs.s3a.create.header 文字列 ユーザーが提供するヘッダーのプレフィックス

fs.s3a.create.performance

ファイルシステムの整合性のための安全チェックよりも、ファイルの作成パフォーマンスを優先します。

これは次のとおりです。1. ファイルがディレクトリの上に作成されていることを確認するLIST呼び出しをスキップします。リスク: ファイルがディレクトリの上に作成されます。1. 上書きフラグを無視します。1. 親ディレクトリマーカーを削除するためのDELETE呼び出しを発行しません。

hasPathCapability(path, "fs.s3a.create.performance")チェックを使用して、この機能をS3Aファイルシステムインスタンスに対してプローブすることができます。

このオプションを使用して既存のディレクトリにファイルを作成すると、S3Aファイルシステムクライアントの動作が矛盾する可能性があります。

ディレクトリ用に最適化された操作 (例: リスト呼び出し) は、ファイルではなくディレクトリツリーを表示する可能性が高くなります。ファイル用に最適化された操作 (getFileStatus()isFile()) は、ファイルを表示する可能性が高くなります。矛盾の正確な形式と、どの操作/パラメーターがこれをトリガーするかは定義されておらず、マイナーリリース間でも変更される可能性があります。

このオプションを使用することは、後輪駆動車で「横滑り防止装置」ボタンを5秒間長押しするのと同等です。つまり、安全チェックが無効になります。ドライバーが操作を理解していれば、より速く走行できます。理解していなかった場合、ボタンを長押ししたという事実は、スピードを安全よりも優先するという意識的な決定を下したこと、そして結果は自己責任であるという証拠として検視で用いられるでしょう。

したがって、条件が満たされていると確信できる場合にのみ使用してください。

fs.s3a.create.header ユーザー指定ヘッダーのサポート

fs.s3a.create.header.のプレフィックスを持つオプションは、「ユーザー定義メタデータ」としてS3オブジェクトのメタデータに追加されます。このメタデータはすべてのアプリケーションから参照できます。また、FileSystem/FileContextのlistXAttrs()およびgetXAttrs() API呼び出しで、プレフィックスheader.を指定して取得することもできます。

オブジェクトの名前が変更されると、メタデータは作成されたコピーに伝播されます。

S3Aファイルシステムのインスタンスがこの機能を持っているかどうかは、hasPathCapability(path, "fs.s3a.create.header")チェックを通じて確認できます。