Hadoop ORC 文件 - 它是如何工作的 - 如何获取元数据

Posted

技术标签:

【中文标题】Hadoop ORC 文件 - 它是如何工作的 - 如何获取元数据【英文标题】:Hadoop ORC file - How it works - How to fetch metadata 【发布时间】:2015-07-17 15:28:08 【问题描述】:

我是 ORC 文件的新手。我浏览了很多博客,但没有得到清晰的理解。请帮助并澄清以下问题。

    我可以从 ORC 文件中获取架构吗?我知道在 Avro 中,可以获取模式。

    它实际上是如何提供模式演变的?我知道可以添加几列。但是怎么做。我唯一知道的是,创建 orc 文件是将数据加载到以 orc 格式存储数据的 hive 表中。

    ORC 文件索引如何工作?我所知道的是每个条带索引都会被维护。但是由于文件没有排序,它如何帮助在条纹列表中查找数据。在查找数据时如何帮助跳过条带?

    是否为每一列维护索引。如果是,那么它不会消耗更多内存吗?

    列格式的 ORC 文件如何适合 hive 表,其中每列的值存储在一起。而 hive 表是按记录获取的。两者如何结合在一起?

【问题讨论】:

【参考方案1】:

1.2. 使用 Hive 和/或 HCatalog 在 Hive 元存储中创建、读取、更新 ORC 表结构(HCatalog 只是一个方面门比使 Pig/Sqoop/Spark/whatever 可以直接访问元存储)

2. ALTER TABLE 命令允许添加/删除任何存储类型的列,包括 ORC。但是要注意一个讨厌的错误,它可能会在此之后导致矢量化读取崩溃(至少在 V0.13 和 V0.14 中)

3.4. “索引”一词相当不恰当。基本上它只是在写入时保留在条带页脚中的最小/最大信息,然后在读取时用于跳过显然不符合WHERE 要求的所有条带,在某些情况下大幅减少 I/O (一个技巧在 mysql 上的 InfoBright 等列存储中很流行,而且在 Oracle Exadata 设备中也很流行[被 Oracle 营销称为“智能扫描”])

5. Hive 适用于“行存储”格式(Text、SequenceFile、AVRO)和“列存储”格式(ORC、Parquet)等。优化器只是在初始 Map 阶段使用特定的策略和快捷方式——例如条带消除、矢量化操作符——当然,列存储的序列化/反序列化阶段更加复杂。

【讨论】:

【参考方案2】:

嘿,我无法帮助您解决所有问题,但我会尝试一下

    您可以使用filedump 实用程序读取ORC 文件的元数据,请参阅here

    我对架构演化非常不确定,但据我所知 ORC 不支持演化。

    ORC 索引存储总和最小值和最大值,因此如果您的数据完全是非结构化的,您可能仍然需要读取大量数据。但是自从最新版本的 ORC 以来,您可以启用一个额外的 Bloom-Filter,它在行组消除方面更准确。也许这也有帮助orc-user mailing list

    ORC 为每一列提供一个索引,但它只是一个轻量级索引。您将有关 min/max 和 sum 的信息存储在 filefooter、stripefooter 中的数字列上,默认情况下每 10000 行存储一次。所以它不会占用那么多空间

    如果您将表存储在 Orc Fileformat Hive 中,则 Hive 将使用特定的 ORC Recordreader 从列中提取行。列式存储的优点是不必读取整行

【讨论】:

以上是关于Hadoop ORC 文件 - 它是如何工作的 - 如何获取元数据的主要内容,如果未能解决你的问题,请参考以下文章

大数据:Hive - ORC 文件存储格式

使用hive查看orc文件 orcfiledump命令详解 异常处理(Failed to read ORC file)

从以 orc 格式存储在 hdfs 中的文件创建配置单元表

parquet和orc

org.apache.hadoop.hive.ql.io.orc.OrcStruct无法转换为org.apache.hadoop.io.BinaryComparable

Hadoop3 - MapReduce ORC 列式存储