从 har 档案中查询数据 - Apache Hive

Querying data from har archives - Apache Hive

我正在使用 Hadoop 并面临大量小文件的可怕问题。我需要能够从现有的配置单元分区中创建 har 存档并同时查询它们。但是,Hive 显然只支持托管 tables 中的归档分区,而不支持外部 tables - 这非常可悲。我正在尝试通过使用 hadoop 的存档工具手动存档分区目录中的文件来找到解决方法。我现在需要配置配置单元,以便能够查询存储在这些存档中的数据,以及存储在其他分区目录中的未存档数据。请注意,我们只使用了外部 table。

访问创建的partition-har中文件的namespace对应partition dir的hdfs路径。 例如,例如hdfs中的一个文件:

hdfs:///user/user1/data/db1/tab1/ds=2016_01_01/f1.txt

存档后可以访问为:

har:///user/user1/data/db1/tab1/ds=2016_01_01.har/f1.txt

hive 是否可以从外部查询 har 档案 table?如果有,请提出一个方法。

此致

实际上,"managed" 和 "external" table 之间的线很细。
我的建议:

  • 创建 "managed" table
  • 为将来的某些日子显式添加分区,但具有 临时 位置——即您的外部进程期望使用的目录
  • 让外部进程直接在 HDFS 级别转储其文件——它们在 Hive 查询中自动公开,"managed" 或不
    (Metastore 不跟踪个人文件和块,它们会在每次查询时被检测到;作为旁注,您可以 运行 如果您愿意,可以在 HDFS 级别进行备份和恢复操作,只要您不弄乱目录结构)
  • 当一个分区是 "cold" 并且您非常确定那里永远不会有另一个文件转储时,您可以 run a Hive command to archive the partition 即在单个 HAR 中移动小文件 + 将分区标记为 "archived" 在 Metastore

好处:在 Hive 中取消归档您的分区很容易(而没有 hadoop unarchive 命令 AFAIK)。

警告:这是一个 "managed" table 所以请记住不要删除任何东西,除非您已经安全地将数据移出 Hive 管理的目录。