1

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

  • 文本文件格式
  • 未分区
  • 未分桶
  • 有 50 个文件,每个文件 3.5 MB

遵循“DESCRIBE FORMATTED”命令中的表参数

表参数:

    COLUMN_STATS_ACCURATE   true
    numFiles                50
    totalSize               170774650

我正在对该表执行计数(*)操作,并且它正在运行

  • AWS 集群上有 4 个映射器和 1 个减速器
  • 我的独立集群上的 1 个映射器和 1 个减速器。[伪集群模式安装]

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

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

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

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

提前感谢您的所有回答。

4

2 回答 2

1

好的!无回复!!!随着时间的推移,我想通了,今天访问了我的 Stack Overflow 帐户,发现这个不幸的问题没有得到解答。所以跟随细节。

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

希望它可以帮助有类似问题的人!

于 2018-02-23T18:13:59.213 回答
0

只是想跟进这件事。

拆分不能包含来自不同池的文件。

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

于 2019-02-15T20:15:33.550 回答