读写器接口

Overview

HCatalog 提供了用于并行 Importing 和输出的数据传输 API,而无需使用 MapReduce。该 API 提供了一种使用表和行的基本存储抽象从 Hadoop 集群读取数据或将数据写入 Hadoop 集群的方法。

数据传输 API 具有三个基本类:

  • HCatReader –从 Hadoop 集群读取数据

  • HCatWriter –将数据写入 Hadoop 集群

  • DataTransferFactory –生成读取器和写入器实例

数据传输 API 中的辅助类包括:

  • ReadEntity

  • ReaderContext

  • WriteEntity

  • WriterContext

HCatalog 数据传输 API 旨在促进外部系统与 Hadoop 的集成。

注意 :HCatalog 不是线程安全的。

HCatReader

读取是一个两步过程,其中第一步发生在外部系统的主节点上。第二步在多个从属节点上并行完成。

读取是在“ ReadEntity”上完成的。在开始阅读之前,您需要定义一个要从中读取的 ReadEntity。这可以通过 ReadEntity.Builder 完成。您可以指定数据库名称,表名称,分区和过滤器字符串。例如:

ReadEntity.Builder builder = new ReadEntity.Builder();
ReadEntity entity = builder.withDatabase("mydb").withTable("mytbl").build();

上面的代码段定义了一个 ReadEntity 对象(“ entity”),该对象包含一个名为“ mydb”的数据库中名为“ mytbl”的表,该表可用于读取该表的所有行。请注意,在开始此操作之前,该表必须存在于 HCatalog 中。

定义 ReadEntity 之后,您可以使用 ReadEntity 和集群配置获取 HCatReader 的实例:

HCatReader reader = DataTransferFactory.getHCatReader(entity, config);

下一步是从reader获取 ReaderContext,如下所示:

ReaderContext cntxt = reader.prepareRead();

以上所有步骤都在主节点上进行。然后,主节点序列化此 ReaderContext 对象,并将其发送到所有从属节点。然后,从节点使用此读取器上下文读取数据。

for(InputSplit split : readCntxt.getSplits()){
HCatReader reader = DataTransferFactory.getHCatReader(split,
readerCntxt.getConf());
       Iterator<HCatRecord> itr = reader.read();
       while(itr.hasNext()){
              HCatRecord read = itr.next();
          }
}

HCatWriter

类似于读取,写入也是一个两步过程,其中第一步发生在主节点上。随后,第二步并行发生在从属节点上。

写入是在“ WriteEntity”上完成的,可以按照类似于读取的方式来构造它:

WriteEntity.Builder builder = new WriteEntity.Builder();
WriteEntity entity = builder.withDatabase("mydb").withTable("mytbl").build();

上面的代码创建了一个 WriteEntity 对象(“ entity”),该对象可用于写入数据库“ mydb”中名为“ mytbl”的表中。

创建 WriteEntity 之后,下一步是获取 WriterContext:

HCatWriter writer = DataTransferFactory.getHCatWriter(entity, config);
WriterContext info = writer.prepareWrite();

以上所有步骤都在主节点上进行。然后,主节点会序列化 WriterContext 对象,并使它可用于所有从属对象。

在从属节点上,您需要使用 WriterContext 获取 HCatWriter,如下所示:

HCatWriter writer = DataTransferFactory.getHCatWriter(context);

然后,writer将迭代器作为write方法的参数:

writer.write(hCatRecordItr);

writer然后循环调用此迭代器上的 getNext()并写出附加到该迭代器的所有记录。

完整的示例程序

可以在上面找到上述 Reader 示例的完整 Java 程序:https://github.com/apache/hive/blob/trunk/hcatalog/core/src/test/java/org/apache/hive/hcatalog/data/TestReaderWriter.java

Navigation Links

Previous: Importing 和输出接口
Next: 命令行界面

一般:HCatalog ManualWebHCat ManualHive Wiki 主页Hive 项目 site