145.7. 在 OSGi 中使用此组件
在与 Hadoop 2.x 机制相关的 OSGi 环境中运行此组件时有一些要求,以发现不同的 org.apache.hadoop.fs.FileSystem
实施。Hadoop 2.x 使用 java.util.ServiceLoader
,它查找定义可用文件系统类型和实施的 /META-INF/services/org.apache.hadoop.fs.FileSystem
文件。在 OSGi 中运行时,这些资源不可用。
与 camel-hdfs
组件一样,需要从捆绑包类加载程序中查看默认配置文件。处理它的一种典型方法是在您的捆绑包 root 中保留 core-default.xml
(以及 hdfs-default.xml
)的副本。
145.7.1. 将此组件与手动定义的路由搭配使用
有两个选项:
-
使用定义路由的捆绑包,软件包
/META-INF/services/org.apache.hadoop.fs.FileSystem
资源。此资源应列出所有所需的 Hadoop 2.x 文件系统实施。 -
提供 boilerplate 初始化代码,它会在
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); ...
145.7.2. 将这个组件与 Blueprint 容器一起使用
两个选项:
-
带有包含蓝图定义的捆绑包的
/META-INF/services/org.apache.hadoop.fs.FileSystem
资源。 - 将以下内容添加到蓝图定义文件中:
<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 方案到文件系统实施。