Hive on Spark && Spark-sql 中插入数据时的文件数量

8 篇文章 0 订阅

Hive on Spark 表明 schema 使用的是 hive catalog,engine 使用的是spark;
Spark-sql 则是schema 和 engine 都是用的是Spark。
那么,使用上述两种方式向表里多次插入数据据时,底层的文件数量是怎么样的呢?是否严格按照 hdfs block 的大小来划分的?

结论

使用 Hive on Spark 每次插入都会生成一个copy文件,和block大小无关,和原始表的文件数量无关;
使用 Saprk-sql 时,则按照原始表的文件数量进行 copy,不会自动合并文件。

准备

这里作下测试,具体的原因,可能需要看下相关的源码了,之后有空了再继续研究。
准备两张测试表:
hro_electronsignsynctaskmessage_raw:底层有 7 个文件

[hadoop@172 data_sync]$ hadoop fs -du -h /usr/hive/warehouse/test.db/hro_electronsignsynctaskmessage_raw
1.9 M   /usr/hive/warehouse/test.db/hro_electronsignsynctaskmessage_raw/part-m-00000
9.7 M   /usr/hive/warehouse/test.db/hro_electronsignsynctaskmessage_raw/part-m-00000_copy_1
19.4 M  /usr/hive/warehouse/test.db/hro_electronsignsynctaskmessage_raw/part-m-00000_copy_2
29.3 M  /usr/hive/warehouse/test.db/hro_electronsignsynctaskmessage_raw/part-m-00000_copy_3
39.1 M  /usr/hive/warehouse/test.db/hro_electronsignsynctaskmessage_raw/part-m-00000_copy_4
49.0 M  /usr/hive/warehouse/test.db/hro_electronsignsynctaskmessage_raw/part-m-00000_copy_5
40.9 M  /usr/hive/warehouse/test.db/hro_electronsignsynctaskmessage_raw/part-m-00000_copy_6

hro_electronsignsynctaskmessage_raw_2:空表

测试过程
使用 Hive on Spark

向 表 hro_electronsignsynctaskmessage_raw_2 插入数据时,
insert into test.hro_ElectronSignSyncTaskMessage_raw_2
select * from test.hro_electronsignsynctaskmessage_raw;

# 第一次插入
[hadoop@172 data_sync]$ hadoop fs -ls /usr/hive/warehouse/test.db/hro_electronsignsynctaskmessage_raw_2
Found 1 items
-rwxr-xr-x   3 hadoop supergroup   43999809 2021-08-02 10:21 /usr/hive/warehouse/test.db/hro_electronsignsynctaskmessage_raw_2/000000_0

# 第二次插入,出现 copy 文件
[hadoop@172 data_sync]$ hadoop fs -du -h /usr/hive/warehouse/test.db/hro_electronsignsynctaskmessage_raw_2
0        /usr/hive/warehouse/test.db/hro_electronsignsynctaskmessage_raw_2/.hive-staging_hive_2021-08-02_10-23-50_060_4210804527323610548-1
0        /usr/hive/warehouse/test.db/hro_electronsignsynctaskmessage_raw_2/.hive-staging_hive_2021-08-02_10-27-17_818_3635867155203002406-1
42.0 M   /usr/hive/warehouse/test.db/hro_electronsignsynctaskmessage_raw_2/000000_0
189.3 M  /usr/hive/warehouse/test.db/hro_electronsignsynctaskmessage_raw_2/000000_0_copy_1

可以看到,每次插入都会在 表 hro_ElectronSignSyncTaskMessage_raw_2 目录下,生成一个 copy 文件,而且,新文件的大小和 hdfs block 以及原表的文件数量没有关系?这也是我比较疑惑的地方。

使用 Spark-SQL

在之前的基础上,向 表 hro_electronsignsynctaskmessage_raw_2 插入数据时,
insert into test.hro_ElectronSignSyncTaskMessage_raw_2
select * from test.hro_electronsignsynctaskmessage_raw;


[root@172 data_sync]# hadoop fs -du -h /usr/hive/warehouse/test.db/hro_electronsignsynctaskmessage_raw_2
0        /usr/hive/warehouse/test.db/hro_electronsignsynctaskmessage_raw_2/.hive-staging_hive_2021-08-02_10-23-50_060_4210804527323610548-1
0        /usr/hive/warehouse/test.db/hro_electronsignsynctaskmessage_raw_2/.hive-staging_hive_2021-08-02_10-27-17_818_3635867155203002406-1
42.0 M   /usr/hive/warehouse/test.db/hro_electronsignsynctaskmessage_raw_2/000000_0
189.3 M  /usr/hive/warehouse/test.db/hro_electronsignsynctaskmessage_raw_2/000000_0_copy_1
189.3 M  /usr/hive/warehouse/test.db/hro_electronsignsynctaskmessage_raw_2/000000_0_copy_2
1.9 M    /usr/hive/warehouse/test.db/hro_electronsignsynctaskmessage_raw_2/part-00000-96cc1ede-b391-40a1-b63d-8d1eb6d0d8f2-c000
9.7 M    /usr/hive/warehouse/test.db/hro_electronsignsynctaskmessage_raw_2/part-00001-96cc1ede-b391-40a1-b63d-8d1eb6d0d8f2-c000
19.4 M   /usr/hive/warehouse/test.db/hro_electronsignsynctaskmessage_raw_2/part-00002-96cc1ede-b391-40a1-b63d-8d1eb6d0d8f2-c000
29.3 M   /usr/hive/warehouse/test.db/hro_electronsignsynctaskmessage_raw_2/part-00003-96cc1ede-b391-40a1-b63d-8d1eb6d0d8f2-c000
39.1 M   /usr/hive/warehouse/test.db/hro_electronsignsynctaskmessage_raw_2/part-00004-96cc1ede-b391-40a1-b63d-8d1eb6d0d8f2-c000
49.0 M   /usr/hive/warehouse/test.db/hro_electronsignsynctaskmessage_raw_2/part-00005-96cc1ede-b391-40a1-b63d-8d1eb6d0d8f2-c000
40.9 M   /usr/hive/warehouse/test.db/hro_electronsignsynctaskmessage_raw_2/part-00006-96cc1ede-b391-40a1-b63d-8d1eb6d0d8f2-c000

可以看到,Spark-sql 还是依据原表的文件数量来生成相应的task的,插入到 hro_ElectronSignSyncTaskMessage_raw_2 表的文件数量也和原始表相同,只做了简单的复制操作。

表现形式

这里有个表现形式,我还没有弄明白:

  1. 使用 Hive on Spark 时,每次插入数据都会生成一个 copy 文件。copy 文件的数量和原始表的文件数量无关,和block 的大小无关。

之后再进一步分析原因,,,

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值