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 表的文件数量也和原始表相同,只做了简单的复制操作。
表现形式
这里有个表现形式,我还没有弄明白:
- 使用 Hive on Spark 时,每次插入数据都会生成一个 copy 文件。copy 文件的数量和原始表的文件数量无关,和block 的大小无关。
之后再进一步分析原因,,,