143.6. このコンポーネントを OSGi で使用する

このコンポーネントを OSGi 環境で実行する場合、Hadoop 2.x がさまざまな org.apache.hadoop.fs.FileSystem 実装を検出するために使用するメカニズムに関連するいくつかの特異な点があります。Hadoop 2.x は、利用可能なファイルシステムのタイプと実装を定義する /META-INF/services/org.apache.hadoop.fs.FileSystem ファイルを探す java.util.ServiceLoader を使用します。OSGi 内で実行している場合、これらのリソースは使用できません。

camel-hdfs コンポーネントと同様に、デフォルトの設定ファイルはバンドルクラスローダーから見える必要があります。これに対処する一般的な方法は、core-default.xml (および hdfs-default.xml など) のコピーをバンドルルートに保持することです。

143.6.1. 手動で定義されたルートでこのコンポーネントを使用する

以下の 2 つのオプションがあります。

  1. /META-INF/services/org.apache.hadoop.fs.FileSystem リソースを、ルートを定義するバンドルとともにパッケージ化します。このリソースには、必要な Hadoop 2.x ファイルシステムの実装がすべてリストされている必要があります。
  2. org.apache.hadoop.fs.FileSystem クラス内に内部の静的キャッシュを設定するボイラープレート初期化コードを提供します。
org.apache.hadoop.conf.Configuration conf = new org.apache.hadoop.conf.Configuration();
conf.setClass("fs.file.impl", org.apache.hadoop.fs.LocalFileSystem.class, FileSystem.class);
conf.setClass("fs.hdfs.impl", org.apache.hadoop.hdfs.DistributedFileSystem.class, FileSystem.class);
...
FileSystem.get("file:///", conf);
FileSystem.get("hdfs://localhost:9000/", conf);
...

143.6.2. ブループリントコンテナーでこのコンポーネントを使用する

2 つのオプション:

  1. /META-INF/services/org.apache.hadoop.fs.FileSystem リソースをブループリント定義を含むバンドルでパッケージ化します。
  2. 以下をブループリント定義ファイルに追加します。
<bean id="hdfsOsgiHelper" class="org.apache.camel.component.hdfs2.HdfsOsgiHelper">
   <argument>
      <map>
         <entry key="file:///" value="org.apache.hadoop.fs.LocalFileSystem"  />
         <entry key="hdfs://localhost:9000/" value="org.apache.hadoop.hdfs.DistributedFileSystem" />
         ...
      </map>
   </argument>
</bean>

<bean id="hdfs2" class="org.apache.camel.component.hdfs2.HdfsComponent" depends-on="hdfsOsgiHelper" />

このようにして、Hadoop 2.x は URI スキームをファイルシステム実装に正しくマッピングします。