查询har存档中的数据 - Apache Hive

时间:2016-06-03 10:23:17

标签: hadoop hive partitioning hadoop-archive

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

用于访问创建的partition-har中的文件的命名空间对应于分区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存档?如果是,请提出建议。

最好的问候

1 个答案:

答案 0 :(得分:1)

在实践中,"管理"之间的界限。和"外部"桌很薄。
我的建议是:

  • 创建一个"托管"表
  • 将来某些天明确添加分区,但使用 ad hoc 位置 - 即外部进程希望使用的目录
  • 让外部进程直接在HDFS级别转储其文件 - 它们在Hive查询中自动公开,"托管"或不是(Metastore不跟踪单个文件和块,它们在每个查询中被检测到;作为旁注,如果您愿意,您可以在HDFS级别运行备份和恢复操作,只要你不要搞乱目录结构)
  • 当分区是"冷"并且你很确定那里永远不会有另一个文件被转储,你可以run a Hive command to archive the partition即在单个HAR +中移动小文件将分区标记为"存档"在Metastore中

额外奖励:在Hive中轻松取消归档您的分区(而没有hadoop unarchive命令AFAIK)。

警告:它是一个"托管"表,所以切记不要DROP任何东西,除非你已经安全地将数据移出Hive管理的目录。