如何使用带有主动枢轴的hadoop?

时间:2015-07-16 09:51:20

标签: activepivot

我正在使用Active Pivot的5.1版本,但计划升级到5.2。我想在使用CsvSource时读取数据并接收实时更新。

1 个答案:

答案 0 :(得分:2)

简介

本文解释了如何将数据从Hadoop读取到Active Pivot的一些内容。这是使用Active Pivot 5.1和5.2测试的。 简而言之,您有两种方法来填补空白:

  • 使用已安装的HDFS,这使您的HDFS类似于磁盘

  • 使用Hadoop Java API

使用已安装的HDFS

您可以使用某些Hadoop发行版轻松安装HDFS。 (例如:使用Cloudera CDH 5安装HDFS很容易。)

执行此操作后,您的Active Pivot服务器上的挂载点将链接到您的HDFS,它将像普通磁盘一样运行。 (至少对于阅读,写作有一些限制)

例如,如果你的HDFS上有csv文件,你就可以直接使用Active Pivot Csv Source。

使用Hadoop Java API

另一种方法是使用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 /)

如果您的群集是安全的,那么您需要弄清楚如何以安全的方式远程访问它。

从Hadoop

读取文件的示例
// 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);
}

Hadoop来源

当您能够从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可以并行检索多个文件。

-

如果我对某些方面不够清楚,或者您有任何问题,请随时提出。