我有一个hive表(带压缩),其定义如
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;
当我从另一个hive表中执行一个简单的select和insert(没有reducers运行)到这个表时,我看到一个独特的模式,这个表中带有压缩的数据被分成很小的非常小的文件(表1 :有时1gb数据被分割为200-300个文件,因此增加了消耗的块数,尽管它应该只跨越16个块),因为当我查询这个新表时会形成非常高的地图。文件大小不超过245mb(表2 )。是否有设置将此限制为64mb(或64mb的倍数或仅一个文件),因为我的块大小为64 mb,因此不会创建多余的块。
表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
答案 0 :(得分:4)
解决了这个问题。
我测试了在会话中设置以下hive变量:
set hive.merge.mapredfiles=true
set hive.merge.size.per.task=256000000
set hive.merge.smallfiles.avgsize=256000000
所以现在在分区内我得到大小约为256mb的压缩文件。 要永久设置这些变量,请在该用户的主目录中创建具有相同语句的.hiverc文件。
希望这有帮助
答案 1 :(得分: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