combineInputFormat如何在Hive中运行?

时间:2017-04-09 05:56:24

标签: apache hive combiners

我有一个包含以下属性的Hive表

  • TextFile格式
  • 未分区的
  • Unbucketed
  • 有50个文件,每个3.5 MB

遵循" DESCRIBE FORMATTED"中的表参数。命令

表格参数:

    COLUMN_STATS_ACCURATE   true
    numFiles                50
    totalSize               170774650

我正在对此表执行count(*)操作,它正在运行

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

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

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

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

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

提前感谢您的所有答案。

2 个答案:

答案 0 :(得分:0)

确定!无回复!!!随着时间的推移我想出来,今天正在访问我的Stack Overflow账户,发现这个不幸的问题没有得到答复。所以遵循细节。

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

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

答案 1 :(得分:0)

只想跟进此事。

  

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

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