0

我有一个 MapReduce 实现,用于将某些日志文件直接处理为 GZip 压缩 RCFile,以便轻松加载到 Hive(通过外部表投影)。

无论如何,我有成功且正确运行的代码,将数据发送BytesRefArrayWritableRCFileOutputFormat.

目前,我将其作为仅 Map 作业运行,这意味着对于 N 个输入拆分,我得到 N 个输出文件。例如,对于 50 个输入拆分,我将获得 50 个.rc扩展名文件。Hive 可以毫无问题地一起解释这些文件,但我的问题如下:

在单个目录中包含 50 个(或 N 个)最佳选择,还是包含所有数据RCFile的单个目录是最佳选择?RCFile我知道这RCFile是一种列格式,因此 IO 针对查询进行了优化,例如过滤特定列的值。

在我上面提到的带有 50 个输入拆分的示例中,在第一种情况下,MapReduce 将需要打开 50 个文件并寻找相关列的位置。考虑到这 50 个文件将分布在 HDFS 中,它还能够并行化此操作。在第二种情况下(一个中的所有数据RCFile),我想 MapReduce 将按顺序流式传输单个 RCFile 中的列值,而不必将 50 个不同的结果拼接在一起......

有什么好的方法来解释这个吗?它是 HDFS 块大小和 Hive 表的聚合大小的函数吗?

如果我能澄清任何事情,请告诉我 - 在此先感谢

4

1 回答 1

1

它是 HDFS 块大小的函数吗

主要是。调整 reducer 的数量以不创建小于块的分区。我认为这是主要的驱动因素。

除此之外,对于名称节点来说,较少数量的文件更健康。您还可以获得一些管理上的好处,因为在 Hive 表上没有比实际需要多 50 倍的分区(想想像删除过时分区这样的操作)。

我必须重申尝试转向可以说是优越的ORC格式的观点。

于 2013-09-11T12:55:31.980 回答