我正在使用Active Pivot的5.1版本,但计划升级到5.2。我想在使用CsvSource时读取数据并接收实时更新。
答案 0 :(得分:2)
本文解释了如何将数据从Hadoop读取到Active Pivot的一些内容。这是使用Active Pivot 5.1和5.2测试的。 简而言之,您有两种方法来填补空白:
使用已安装的HDFS,这使您的HDFS类似于磁盘
使用Hadoop Java API
您可以使用某些Hadoop发行版轻松安装HDFS。 (例如:使用Cloudera CDH 5安装HDFS很容易。)
执行此操作后,您的Active Pivot服务器上的挂载点将链接到您的HDFS,它将像普通磁盘一样运行。 (至少对于阅读,写作有一些限制)
例如,如果你的HDFS上有csv文件,你就可以直接使用Active Pivot Csv Source。
另一种方法是使用Hadoop Java API:http://hadoop.apache.org/docs/current/api/
使用的主要课程很少:
org.apache.hadoop.fs.FileSystem
- 用于与Hadoop的常见操作。
org.apache.hadoop.conf.Configuration
- 用于配置FileSystem对象。
org.apache.hadoop.hdfs.client.HdfsAdmin
- 可用于观看事件(例如:添加到HDFS的新文件)
注意: Hadoop 2.6.0及更高版本可以观看活动。 对于以前的Hadoop,您可以构建自己的Hadoop,也可以使用已安装的HDFS和现有的FileWatcher。
您将需要很少的Hadoop依赖项。
请注意,Jaxb上的Hadoop依赖项和Active Pivot依赖项之间可能存在冲突。
在下面的pom.xml中,解决方法是从Hadoop依赖项中排除Jaxb依赖项。
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-hdfs</artifactId>
<version>2.6.0</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-auth</artifactId>
<version>2.6.0</version>
</dependency>
<!-- These 2 dependencies have conflicts with ActivePivotCva on Jaxb -->
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-common</artifactId>
<version>2.6.0</version>
<exclusions>
<exclusion>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-impl</artifactId>
</exclusion>
<exclusion>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-core</artifactId>
<version>1.2.1</version>
<exclusions>
<exclusion>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-impl</artifactId>
</exclusion>
<exclusion>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
</exclusion>
</exclusions>
</dependency>
您需要定义至少2个属性:
Hadoop地址(例如:hdfs:// localhost:9000)
文件的HDFS路径(例如:/ user / quartetfs / data /)
如果您的群集是安全的,那么您需要弄清楚如何以安全的方式远程访问它。
// Configuring
Configuration conf = new Configuration();
conf.set("fs.defaultFS", "hdfs://localhost:9000");
FileSystem hdfs = FileSystem.get(this.conf);
Path filePath = new Path(/user/username/input/file.txt);
// Reading
BufferedReader bfr =new BufferedReader(new InputStreamReader(hdfs.open(filePath)));
String str = null;
while ((str = bfr.readLine()) != null)
{
System.out.println(str);
}
当您能够从HDFS中读取内容时,您现在可以像编写其他来源一样编写Hadoop源。
例如,您可以创建一个实现ISource的HadoopSource。
您可以在SourceConfig中启动它,您可以从环境中检索属性。
如果您想要检索存储在HDFS上的文件,您可以创建另一个观看事件的课程。
一个示例是以下代码,您可以使用自己的方法处理某些事件。 (以下代码中的例子:onCreation(),onAppend())
protected HdfsAdmin admin;
protected String threadName;
public void run()
{
DFSInotifyEventInputStream eventStream;
try
{
eventStream = admin.getInotifyEventStream();
LOGGER.info(" - Thread: " + this.threadName + "Starting catching events.");
while (true)
{
try
{
Event event = eventStream.take();
// Possible eventType: CREATE, APPEND, CLOSE, RENAME, METADATA, UNLINK
switch (event.getEventType())
{
case CREATE:
CreateEvent createEvent = (CreateEvent) event;
onCreation(createEvent.getPath());
break;
case APPEND:
AppendEvent appendEvent = (AppendEvent) event;
onAppend(appendEvent.getPath());
break;
default:
break;
}
} catch (InterruptedException e) {
e.printStackTrace();
} catch (MissingEventsException e) {
e.printStackTrace();
}
}
} catch (IOException e1) {
LOGGER.severe(" - Thread: " + this.threadName + "Failure to start the eventStream");
e1.printStackTrace();
}
}
我为onCreation方法(未显示)所做的是将新创建的文件存储到并发队列中,以便我的HadoopSource可以并行检索多个文件。
-
如果我对某些方面不够清楚,或者您有任何问题,请随时提出。