第67章 HDFS2
HDFS2 コンポーネント リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
Camel 2.13 で利用可能
hdfs2 コンポーネントを使用すると、Hadoop 2.x を使用して HDFS ファイルシステムとの間でメッセージを読み書きできます。HDFS は、Hadoop の中心となる分散ファイルシステムです。
Maven ユーザーは、このコンポーネントの以下の依存関係を
pom.xml に追加する必要があります。
URI 形式 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
hdfs2://hostname[:port][/path][?options]
hdfs2://hostname[:port][/path][?options]
?option=value&option=value&... の形式で、クエリーオプションを URI に追加できます。パスは以下の方法で処理されます。
- コンシューマーとして、ファイルの場合、ファイルを読み取るだけです。それ以外の場合は、設定されたパターンを満たすパス下のすべてのファイルをスキャンするディレクトリーを表します。このディレクトリー下のすべてのファイルは同じタイプである必要があります。
- プロデューサーとして、少なくとも 1 つの分割ストラテジーが定義されている場合、パスはディレクトリーと見なされ、そのディレクトリー下で、プロデューサーは設定された UuidGenerator を使用して、分割ごとに異なるファイルを作成します。
注記
通常モードで HDFS から消費する場合、ファイルはチャンクに分割され、チャンクごとにメッセージを生成します。
chunkSize オプションを使用して、チャンクのサイズを設定できます。File コンポーネントを使用して HDFS から読み取り、通常のファイルに書き込む場合は、fileMode=Append を設定してチャンクを連結できます。
オプション リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
|
名前
|
デフォルト値
|
説明
|
|---|---|---|
overwrite
|
true
|
ファイルは上書きできる
|
append
|
false
|
既存のファイルに追加します。すべての HDFS ファイルシステムが append オプションをサポートしているわけではないことに注意してください。
|
bufferSize
|
4096
|
HDFS が使用するバッファーサイズ
|
replication
|
3
|
HDFS レプリケーション係数
|
blockSize
|
67108864
|
HDFS ブロックのサイズ
|
fileType
|
NORMAL_FILE
|
SEQUENCE_FILE、MAP_FILE、ARRAY_FILE、または BLOOMMAP_FILE を指定できます。Hadoop を参照してください。
|
fileSystemType
|
HDFS
|
ローカルファイルシステムの LOCAL にすることができます。
|
keyType
|
NULL
|
シーケンスまたはマップファイルの場合のキーのタイプ。以下を参照してください。
|
valueType
|
TEXT
|
シーケンスまたはマップファイルの場合のキーのタイプ。以下を参照してください。
|
splitStrategy
|
|
異なる基準に基づいてファイルを分割する方法に関するストラテジーを記述する文字列。以下を参照してください。
|
openedSuffix
|
opened
|
読み取り/書き込みのためにファイルを開くと、書き込みフェーズでファイルを読み取らないように、この接尾辞でファイルの名前が変更されます。
|
readSuffix
|
read
|
ファイルを読み込んだら、再度読み取るのを回避するために、この接尾辞で名前を変更します。
|
initialDelay
|
0
|
コンシューマーの場合、ディレクトリーのスキャンを開始する前に待機する時間(ミリ秒単位)。
|
delay
|
0
|
ディレクトリースキャンの間隔(ミリ秒単位)。
|
pattern
|
*
|
ディレクトリーのスキャンに使用されるパターン
|
chunkSize
|
4096
|
通常のファイルを読み取る場合、これはチャンクごとにメッセージを生成するチャンクに分割されます。
|
connectOnStartup
|
true
|
Camel 2.9.3/ 2.10.1: プロデューサー/コンシューマーの開始時に HDFS ファイルシステムに接続するかどうか。
false の場合、接続はオンデマンドで作成されます。HDFS は、45 x 20 秒再配信をハードコーディングしているため、接続を確立するために最大 15 分かかる可能性があることに注意してください。このオプションを false に設定すると、アプリケーションは起動でき、最大 15 分間ブロックされません。
|
owner
|
|
コンシューマーがファイルを選択できるようにするには、ファイルの所有者はこの所有者と一致する必要があります。それ以外の場合は、ファイルはスキップされます。
|
keyType および ValueType リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
- NULL これは、キーまたは値が存在しないことを意味します。
- バイトを書き込む BYTE では、java バイトクラスは BYTE にマッピングされます。
- バイトのシーケンスを書き込む BYTES。java ByteBuffer クラスをマッピングします。
- java 整数を書き込む INT
- java 浮動小数点を書き込む FLOAT
- java long を記述する LONG
- Java の二重書き込み用の DOUBLE
- java 文字列を書き込む TEXT
BYTES は他のすべてでも使用されます。たとえば、Camel ではファイルが InputStream として送信されます。この例では、シーケンスファイルまたはマップファイルでバイトのシーケンスとして記述されます。
分割ストラテジー リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
現行バージョンでは、addment モードでファイルを開くことは、信頼性が非常にないため、無効になっています。そのため、新しいファイルしか作成できません。Camel HDFS エンドポイントは、以下の方法でこの問題の解決を試みます。
- split strategy オプションが定義されている場合、hdfs パスがディレクトリーとして使用され、設定された UuidGeneratorを使用してファイルが作成されます。
- 分割条件が満たされるたびに、新しいファイルが作成されます。splitStrategy オプションは、splitStrategy=<ST>:<value>,<ST>:<value>,* 構文で文字列として定義されます。
ここで、<ST> は以下のようになります。
- BYTES は新しいファイルが作成され、書き込まれたバイト数が <value> を超えると古いファイルが閉じられます。
- MESSAGES は新しいファイルが作成され、書き込まれたメッセージの数が <value> を超える場合に古いファイルが閉じられます。
- IDLE 新しいファイルが作成され、最後の <value> ミリ秒で書き込みが行われなかった場合に古いファイルが閉じられます。
注記
現在、このストラテジーでは、IDLE 値を設定するか、HdfsConstants.HDFS_CLOSE ヘッダーを false に設定して BYTES/MESSAGES 設定を使用する必要があります。その他の場合は、各メッセージでファイルが閉じられます。
以下に例を示します。
hdfs2://localhost/tmp/simple-file?splitStrategy=IDLE:1000,BYTES:5
hdfs2://localhost/tmp/simple-file?splitStrategy=IDLE:1000,BYTES:5
つまり、新しいファイルは 1 秒以上アイドル状態であるか、または 5 バイト以上書き込まれている場合に作成されます。
hadoop fs -ls /tmp/simple-file を実行すると、複数のファイルが作成されていることがわかります。
メッセージヘッダー リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
このコンポーネントでは、以下のヘッダーがサポートされます。
プロデューサーのみ リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
|
ヘッダー
|
説明
|
|---|---|
CamelFileName
|
Camel 2.13: 書き込むファイルの名前を指定します(エンドポイントパスに相対的)。名前は
String または Expression オブジェクトにすることができます。分割ストラテジーを使用しない場合のみ関連します。
|
ファイルストリームを閉じるための制御 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
分割ストラテジー なし で HDFS2 プロデューサーを使用する場合、ファイル出力ストリームはデフォルトで書き込み後に閉じられます。ただし、ストリームを開いたままにし、後でストリームを明示的に閉じることもできます。そのため、ヘッダー
HdfsConstants.HDFS_CLOSE (値 = "CamelHdfsClose")を使用して制御することができます。この値をブール値に設定すると、ストリームを閉じるべきかどうかを明示的に制御できます。
これは、スプリットストラテジーを使用する場合には適用されないことに注意してください。これは、ストリームが閉じられるタイミングを制御できるさまざまなストラテジーがあるためです。
OSGi でのこのコンポーネントの使用 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
さまざまな
org.apache.hadoop.fs.FileSystem 実装の検出に際して、Hadoop 2.x が使用するメカニズムに関連する OSGi 環境でこのコンポーネントを実行する場合には、いくつかの quirk があります。Hadoop 2.x は java.util.ServiceLoader を使用します。これは、利用可能なファイルシステムタイプと実装を定義する /META-INF/services/org.apache.hadoop.fs.FileSystem ファイルを探します。これらのリソースは、OSGi 内で実行すると利用できません。
camel-hdfs コンポーネントと同様に、デフォルトの設定ファイルはバンドルクラ出力ダーから見える必要があります。これに対処する一般的な方法は、バンドルルートに core-default.xml のコピー(例: hdfs-default.xml)を保持することです。
手動で定義されたルートでのこのコンポーネントの使用 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
以下の 2 つのオプションがあります。
- ルートを定義するバンドルで
/META-INF/services/org.apache.hadoop.fs.FileSystemリソースをパッケージ化します。このリソースには、必要なHadoop 2.xファイルシステムの実装がすべて含まれているはずです。 org.apache.hadoop.fs.FileSystemクラス内の内部かつ静的キャッシュを設定するボイラープレート初期化コードを提供します。
Blueprint コンテナーでのこのコンポーネントの使用 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
2 つのオプション:
- Blueprint 定義を含むバンドルを使用して
/META-INF/services/org.apache.hadoop.fs.FileSystemリソースをパッケージ化します。 - Blueprint 定義ファイルに以下を追加します。
このようにして、Hadoop 2.x は URI スキームをファイルシステム実装に正しくマッピングします。