我有一个包含以下属性的Hive表
遵循" DESCRIBE FORMATTED"中的表参数。命令
表格参数:
COLUMN_STATS_ACCURATE true
numFiles 50
totalSize 170774650
我正在对此表执行count(*)操作,它正在运行
两个Hive会话的最大分割大小为256MB
我想知道组合输入格式是如何工作的?
在一台机器上,由于所有文件/块都在同一台机器上,并且由于组合在一起的文件的总大小小于最大分割大小,因此单个分割因此单个映射器是单个机器上的数据。呼唤。
在另一种情况下,AWS集群产生了4个映射器。我读到CombineInputFormat使用机架/机器位置,但究竟如何?
提前感谢您的所有答案。
答案 0 :(得分:0)
确定!无回复!!!随着时间的推移我想出来,今天正在访问我的Stack Overflow账户,发现这个不幸的问题没有得到答复。所以遵循细节。
从输入路径下的文件构造拆分。拆分不能包含来自不同池的文件。返回的每个拆分可能包含来自不同文件的块。如果指定了maxSplitSize,则组合同一节点上的块以形成单个拆分。剩余的块然后与同一机架中的其他块组合。如果未指定maxSplitSize,则来自同一机架的块将合并为一个分区;没有尝试创建节点本地分裂。如果maxSplitSize等于块大小,则此类与Hadoop中的默认拆分行为类似:每个块都是本地处理的拆分。子类实现InputFormat.createRecordReader(InputSplit,TaskAttemptContext)来为CombineFileSplit构建RecordReader。
希望它可以帮助某个人有类似的问题!
答案 1 :(得分:0)
只想跟进此事。
拆分不能包含来自不同池的文件。
可能还有其他因素,但是每个分区只有一个池。如果同一分区中存在两个小文件,则将它们合并在一起,并且只需要一个Mapper;如果同一文件存在于不同的分区中,则将需要两个Mapper进行处理。