Hive 输出大于 dfs 块大小限制

Hive output larger than dfs blocksize limit

我有一个 table test 是在 hive 中创建的。它被 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

我可以手动设置 reducer 的数量来保持较小的块大小,但这不应该自动拆分吗?为什么 Hive 创建的文件大于允许的块大小?


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

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

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