配置单元输出大于dfs块大小限制

uqzxnwby  于 2021-06-02  发布在  Hadoop
关注(0)|答案(2)|浏览(372)

我有一张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

我可以手动设置减速机的数量,以保持块大小小,但这不应该被自动分割吗?为什么配置单元创建的文件大于允许的块大小?
注意这些是压缩文件,所以我不能把它们放在一起。

xfyts7mz

xfyts7mz1#

有一个可拆分格式的大文件是可以的,因为下游作业可以根据块大小拆分该文件。一般来说,每个减速机会有一个输出文件,要得到更多的减速机,应该在表上定义bucketing。调整#bucket以获得所需大小的文件?对于bucket列,选择一个很可能作为候选人加入的高基数列。

bprjcwpo

bprjcwpo2#

好吧,我看到了我思想上的错误。我的错误是假设hdfs列出的文件是实际的块。事实并非如此。1GB文件在引擎盖下被分为多个块,每个分区有一个文件没有错,Map程序在读取底层块时仍然可以并行化。

相关问题