第66章 HDFS
HDFS コンポーネント リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
Camel 2.8 から利用可能
hdfs コンポーネントを使用すると、HDFS ファイルシステムとの間でメッセージを読み書きできます。HDFS は、Hadoop の中心となる分散ファイルシステムです。
Maven ユーザーは、このコンポーネントの
pom.xml に以下の依存関係を追加する必要があります。
URI 形式 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
hdfs://hostname[:port][/path][?options]
hdfs://hostname[:port][/path][?options]
URI にクエリーオプションは
?option=value&option=value&.. の形式で追加できます。パスは以下のように処理されます。
- コンシューマーとして、ファイルの場合、ファイルを読み取るだけです。それ以外の場合は、設定されたパターンを満たすパス下のすべてのファイルをスキャンするディレクトリーを表します。このディレクトリー下のすべてのファイルは同じタイプである必要があります。
- プロデューサーとして、少なくとも 1 つの分割ストラテジーが定義されている場合、パスはディレクトリーと見なされ、そのディレクトリーの下に、プロデューサーは設定された
UuidGeneratorを使用して分割された名前ごとに異なるファイルを作成します。
注記
通常モードで HDFS から消費する場合、ファイルはチャンクに分割され、チャンクごとにメッセージを生成します。
chunkSize オプションを使用して、チャンクのサイズを設定できます。File コンポーネントを使用して HDFS から読み取り、通常のファイルに書き込む場合は、fileMode=Append を設定してチャンクを連結できます。
オプション リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
| 名前 | デフォルト値 | 説明 |
|---|---|---|
overwrite
|
true
|
ファイルは上書きできる |
append
|
false
|
既存のファイルに追加します。すべての HDFS ファイルシステムが append オプションをサポートしているわけではないことに注意してください。 |
bufferSize
|
4096
|
HDFS が使用するバッファーサイズ |
レプリケーション
|
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
|
開放済み
|
読み取り/書き込み用にファイルが開かれると、書き込みフェーズでファイルを読み取らないように、この接尾辞でファイルの名前が変更されます。
|
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
|
Camel 2.13/2.12.4: コンシューマーがファイルを取得するには、ファイルの所有者はこの所有者と一致する必要があります。それ以外の場合は、ファイルはスキップされます。
|
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 設定を使用する必要があります。そうしないと、ファイルは各メッセージで閉じられます。
以下に例を示します。
hdfs://localhost/tmp/simple-file?splitStrategy=IDLE:1000,BYTES:5
hdfs://localhost/tmp/simple-file?splitStrategy=IDLE:1000,BYTES:5
つまり、新しいファイルは 1 秒以上アイドル状態であるか、または 5 バイト以上書き込まれている場合に作成されます。そのため、
hadoop fs ls /tmp/simplefile を実行すると、複数のファイルが作成されていることがわかります。
メッセージヘッダー リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
このコンポーネントでは、以下のヘッダーがサポートされます。
プロデューサーのみ
|
ヘッダー
|
説明
|
|---|---|
CamelFileName
|
Camel 2.13: 書き込むファイルの名前を指定します(エンドポイントパスに相対的)。名前は
String または Expression オブジェクトにすることができます。分割ストラテジーを使用しない場合のみ関連します。
|
ファイルストリームを閉じるための制御 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
Camel 2.10.4 以降で利用可能
分割ストラテジー なし で HDFS プロデューサーを使用する場合、ファイル出力ストリームはデフォルトで書き込み後に閉じられます。ただし、ストリームを開いたままにし、後でストリームを明示的に閉じることもできます。そのため、ヘッダー
HdfsConstants.HDFS_CLOSE (value = "CamelHdfsClose")を使用してこれを制御することができます。この値をブール値に設定すると、ストリームを閉じるべきかどうかを明示的に制御できます。
これは、スプリットストラテジーを使用する場合には適用されないことに注意してください。これは、ストリームが閉じられるタイミングを制御できるさまざまなストラテジーがあるためです。
OSGi でのこのコンポーネントの使用 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
このコンポーネントは OSGi 環境で完全に機能しますが、ユーザーからのいくつかのアクションが必要になります。Hadoop は、リソースをロードするためにスレッドコンテキストクラ出力ダーを使用します。通常、スレッドコンテキストクラ出力ダーは、ルートを含むバンドルのバンドルクラ出力ダーになります。そのため、デフォルトの設定ファイルはバンドルクラ出力ダーから見える必要があります。これに対処する一般的な方法は、バンドルルートに core-default.xml のコピーを保持することです。このファイルは hadoop-common.jar にあります。