在我通过CLI执行配置单元查询后,如下所示:
$ hive -e QUERY > output.txt
- Hive客户端将编译QUERY并将其发送到Hadoop集群
- Hadoop执行一些作业并将结果输出到文件(仅假设1个减速器)
- 然后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客户端是否检索文件
- 作为一条溪流
- 把它放在临时交换文件里
- 还是别的什么
您将以流的形式获得结果,因此如果您没有重定向输出,则过程中不会包含临时文件。你可以把它想象成做hadoop fs -cat /THE/RESULT/FILE/OF/YOUR/HIVE/REQUEST
如果结果是大数据,您可以将它们重新放在hdfs位置:
$ hive -e QUERY | hadoop fs -put - /HDFS/LOCATION
但在这里你应该注意网络,因为它可能是饱和
另一种选择是将数据立即存储到另一个配置单元表中,这样配置单元将为您完成所有工作,并且不会将重复数据流式传输/复制到您的本地机器