2

我有一个配置单元表(带压缩),其定义如下

create table temp1 (col1 string, col2 int)
partitioned by (col3 string, col4 string) 
row format delimited 
fields terminated by ',' 
escaped by '\\' 
lines terminated by '\n'
stored as sequencefile;

当我从另一个配置单元表执行简单的选择和插入(没有运行减速器)到这个表时,我看到了一个独特的模式,这个表中的压缩数据被分割成非常小的文件(表 1:有时 1gb数据被拆分为 200-300 个文件,因此增加了消耗的块数,尽管它应该只跨越 16 个块),因为当我查询这个新表时形成的地图数量非常多。文件大小不超过 245mb(表 2)。是否有设置将其限制为 64mb(或 64mb 的倍数或仅单个文件),因为我的块大小为 64mb,因此不会创建多余的块。

表格1

姓名 | 类型 | 尺寸 | 块大小

000000_0 | 文件 | 30.22MB | 64 MB

000001_0 | 文件 | 26.19MB | 64 MB

000002_0 | 文件 | 25.19MB | 64 MB

000003_0 | 文件 | 24.74MB | 64 MB

000004_0 | 文件 | 24.54MB | 64 MB

…………

000031_0 | 文件 | 0.9MB | 64 MB

表 2

姓名 | 类型 | 尺寸 | 块大小

000000_0 | 文件 | 245.02MB | 64 MB

000001_0 | 文件 | 245.01MB | 64 MB

000002_0 | 文件 | 244.53MB | 64 MB

000003_0 | 文件 | 244.4MB | 64 MB

000004_0 | 文件 | 198.21MB | 64 MB

4

2 回答 2

4

由于 Bryan 的突出显示了控制查询输出格式的配置单元变量,已经解决了这个问题。我在会话中测试了以下配置单元变量的设置: set hive.merge.mapredfiles=true set hive.merge.size.per.task=256000000 set hive.merge.smallfiles.avgsize=256000000

所以现在在一个分区内,我得到了大小约为 256mb 的压缩文件。要永久设置这些变量,请在该用户的主目录中创建一个具有相同语句的 .hiverc 文件。

希望这可以帮助

于 2012-12-05T11:17:52.043 回答
2

导致这种情况的创建表查询的关键部分是partitioned by. 这会将数据拆分为所用列的每个组合的文件和目录。这允许对它们的集合进行快速查询,但在查询整个表时会创建大量映射器。

我建议你要么重新考虑你的使用partitioned by或处理它的后果。

这种大量块的使用是否对您造成了极大的伤害?只要您没有创建数百万个低于块大小的文件/目录,您的 NameNode 处理它们就不应该有很多问题。

至于文件大小看看这个: https ://cwiki.apache.org/confluence/display/Hive/AdminManual+Configuration

特别注意hive.merge.mapfiles, hive.merge.mapredfiles, hive.merge.smallfiles.avgsize,hive.merge.size.per.task

于 2012-11-08T21:24:23.697 回答