Hive输出大于dfs blocksize limit

时间:2015-04-27 15:12:39

标签: hadoop hive hdfs partitioning

我有一个在hive中创建的表test。它由idate分区,并且通常需要插入分区。这可以将文件保留在只有几行的hdfs上。

hadoop fs -ls /db/test/idate=1989-04-01
Found 3 items
-rwxrwxrwx   3 deployer   supergroup        710 2015-04-26 11:33 /db/test/idate=1989-04-01/000000_0
-rwxrwxrwx   3 deployer   supergroup        710 2015-04-26 11:33 /db/test/idate=1989-04-01/000001_0
-rwxrwxrwx   3 deployer   supergroup        710 2015-04-26 11:33 /db/test/idate=1989-04-01/000002_0

我正在尝试组合一个简单的脚本来组合这些文件,以避免我的分区上有许多小文件:

insert overwrite table test partition (idate)
select * from test
where idate = '1989-04-01'
distribute by idate

这样可行,它会创建包含旧文件中所有行的新文件。问题是当我在较大的分区上运行此脚本时,输出仍然是单个文件:

hadoop fs -ls /db/test/idate=2015-04-25
Found 1 items
-rwxrwxrwx   3 deployer   supergroup 1400739967 2015-04-27 10:53 /db/test/idate=2015-04-25/000001_0

此文件大小超过1 GB,但块大小设置为128 MB:

hive> set dfs.blocksize;
dfs.blocksize=134217728

我可以手动设置减速器的数量以保持块大小,但是不应该自动拆分吗?为什么hive创建的文件大于允许的块大小?

注意这些是压缩的rcfiles,所以我不能把它们放在一起。

2 个答案:

答案 0 :(得分:1)

拥有一个可拆分格式的大文件是可以的,因为下游作业可以根据块大小拆分该文件。通常,每个reducer将获得1个输出文件,为了获得更多的reducer,您应该在表上定义bucketing。调整#桶以获取所需大小的文件?对于您的存储桶列,请选择您可能加入的基数高的列作为候选列。

答案 1 :(得分:0)

好吧,我看到了我的想法中的错误。我的错误在于假设hdfs列出的文件是实际的块。不是这种情况。 1 GB文件被分解为块下的块,每个分区只有一个文件没有错误,当读取底层块时,映射器仍然可以并行化。