combineInputFormat 在 Hive 中如何工作?

How does combineInputFormat works in Hive?

我有一个具有以下属性的 Hive table

遵循 "DESCRIBE FORMATTED" 命令中的 table 参数

Table 参数:

    COLUMN_STATS_ACCURATE   true
    numFiles                50
    totalSize               170774650

我正在对此 table 执行计数 (*) 操作,它是 运行

两个 Hive 会话的最大拆分大小为 256MB

我想知道组合输入格式是如何工作的?

在一台机器上,数据被组合在一起,因为所有 files/blocks 都在同一台机器上,并且由于合并在一起的文件的总大小小于最大拆分大小,因此进行一次拆分,因此需要一个映射器。

在另一种情况下,AWS 集群产生了 4 个映射器。我读到 CombineInputFormat 使用 rack/machine 位置,但具体如何使用?

提前感谢您的所有回答。

好的!无回复!!!随着时间的推移,我弄明白了,今天访问我的 Stack Overflow 帐户时,发现这个倒霉的问题没有得到解答。所以下面是细节。

拆分是根据输入路径下的文件构建的。拆分不能包含来自不同池的文件。返回的每个拆分可能包含来自不同文件的块。如果指定了 maxSplitSize,则同一节点上的块将组合以形成单个拆分。剩下的块然后与同一机架中的其他块组合。如果未指定 maxSplitSize,则来自同一机架的块将合并为一个拆分;没有尝试创建 node-local 拆分。如果 maxSplitSize 等于块大小,那么这个 class 类似于 Hadoop 中的默认拆分行为:每个块都是本地处理的拆分。 Subclasses 实现 InputFormat.createRecordReader(InputSplit, TaskAttemptContext) 为 CombineFileSplit 构造 RecordReader。

希望对有类似问题的人有所帮助!

只是想跟进此事。

A split cannot have files from different pools.

可能还有其他因素,但每个分区只有一个池。如果两个小文件存在于同一个分区,则将它们合并,只需要一个Mapper,如果相同文件存在于不同分区,则需要两个Mapper来处理。