2

在我通过 CLI 执行配置单元查询后,如下所示:

$ hive -e QUERY > output.txt
  1. Hive 客户端将编译 QUERY 并将其发送到 Hadoop 集群。
  2. Hadoop 执行一些作业并将结果输出到 HDFS 的文件(假设只有 1 个减速器)。
  3. 然后 Hive 客户端将检索此单个文件,将其提取并输出到本地 STDOUT。

流程如下图所示:

==============
Hadoop Cluster
==============
  |         |
  |         |
  |     2. output RESULT as a single .gz file at HDFS because of 1 reducer
  |         |
  |         |
1. QUERY    |
  |         |
  |     3. Hive retrieves the RESULT as stream or a whole file ?
  |        If as a whole file, what happens when file size > memory size ?
  |         |
  |         |
  ===========
  Hive Client
  ===========
      |
      |
  4. Client outputs RESULT to stdout which is redirected to a file
      |
      |
 ===========
 Output File
 ===========

我的问题是:如果 HDFS 上的单个结果文件非常大,甚至比我的本地物理内存大小还大,Hive 客户端如何处理它?

Hive 客户端是否检索文件

  1. 作为流?
  2. 把它放到一些临时交换文件中?
  3. 或者是其他东西 ?
4

1 回答 1

2

您以流的形式获取结果,因此如果您没有重定向输出,则您的过程中不会包含临时文件。你可以想象它在做hadoop fs -cat /THE/RESULT/FILE/OF/YOUR/HIVE/REQUEST

如果结果是大数据,您可以将它们重新放在 hdfs 位置:

$ hive -e QUERY | hadoop fs -put - /HDFS/LOCATION

但是在这里你应该注意网络,因为它可能已经饱和

另一种选择是将数据立即存储到另一个 Hive 表中,这样 Hive 将为您完成所有工作,并且不会将任何结果流式传输/复制到您的本地计算机

于 2016-03-31T12:25:46.477 回答