我有一个 MapReduce 实现,用于将某些日志文件直接处理为 GZip 压缩 RCFile,以便轻松加载到 Hive(通过外部表投影)。
无论如何,我有成功且正确运行的代码,将数据发送BytesRefArrayWritable
到RCFileOutputFormat
.
目前,我将其作为仅 Map 作业运行,这意味着对于 N 个输入拆分,我得到 N 个输出文件。例如,对于 50 个输入拆分,我将获得 50 个.rc
扩展名文件。Hive 可以毫无问题地一起解释这些文件,但我的问题如下:
在单个目录中包含 50 个(或 N 个)是最佳选择,还是包含所有数据RCFile
的单个目录是最佳选择?RCFile
我知道这RCFile
是一种列格式,因此 IO 针对查询进行了优化,例如过滤特定列的值。
在我上面提到的带有 50 个输入拆分的示例中,在第一种情况下,MapReduce 将需要打开 50 个文件并寻找相关列的位置。考虑到这 50 个文件将分布在 HDFS 中,它还能够并行化此操作。在第二种情况下(一个中的所有数据RCFile
),我想 MapReduce 将按顺序流式传输单个 RCFile 中的列值,而不必将 50 个不同的结果拼接在一起......
有什么好的方法来解释这个吗?它是 HDFS 块大小和 Hive 表的聚合大小的函数吗?
如果我能澄清任何事情,请告诉我 - 在此先感谢