首页 > 解决方案 > 是什么导致了配置单元表分区中的不同模式?

问题描述

我们有 spark 作业,但也在当前 hadoop 集群中随机运行 hive 查询

我已经看到同一个配置单元表有不同的分区模式,如下所示:

即如果表是按日期分区的,那么

hdfs dfs -ls /data/hive/warehouse/db_name/table_name/part_date=2019-12-01/

给出了结果

/data/hive/warehouse/db_name/table_name/part_date=2019-12-01/part-00001
....
/data/hive/warehouse/db_name/table_name/part_date=2019-12-01/part-06669
/data/hive/warehouse/db_name/table_name/part_date=2019-12-01/part-06670

但是,如果从不同的分区日期查找数据

hdfs dfs -ls /data/hive/warehouse/db_name/table_name/part_date=2020-01-01/

列出具有不同名称模式的文件

/data/hive/warehouse/db_name/table_name/part_date=2020-01-01/000007_0
/data/hive/warehouse/db_name/table_name/part_date=2020-01-01/000008_0
....
/data/hive/warehouse/db_name/table_name/part_date=2020-01-01/000010_0

我可以分辨出的区别不仅在于一个分区中的数据文件带有 part-前缀,而另一个分区就像是00000n_0,而且文件的文件数量更多,part-但每个文件都很小。

我还发现文件聚合比文件part-慢很多00000n_0

文件模式差异的可能原因是什么?配置从一个更改为另一个可能是什么?

标签: apache-sparkhadoophive

解决方案


当 spark 流在 Hive 中写入数据时,它会创建许多名为part-Hive 的小文件,并且这些文件还在不断增加。这将在 Hive 表上查询时产生性能问题。由于分区中没有大量小文件,Hive 需要太多时间才能给出结果。

当火花作业在 Hive 中写入数据时,它看起来像 -

/data/hive/warehouse/db_name/table_name/part_date=2019-12-01/part-00001
....
/data/hive/warehouse/db_name/table_name/part_date=2019-12-01/part-06669
/data/hive/warehouse/db_name/table_name/part_date=2019-12-01/part-06670

但是这里不同的文件模式是由于分区文件上的压缩逻辑将小文件压缩成大文件。这里 n in00000n_0是减速器的数量。

示例压缩脚本,它将小文件压缩为分区内的大文件,例如示例数据库下的表 -

set hive.exec.dynamic.partition=true;
set hive.exec.dynamic.partition.mode=nonstrict;
set hive.exec.reducers.bytes.per.reducer=268435456; --256MB reducer size.

CREATE TABLE example_tmp
     STORED AS parquet
        LOCATION '/user/hive/warehouse/sample.db/example_tmp'
AS
  SELECT * FROM example

INSERT OVERWRITE table sample.example PARTITION (part_date) select * from sample.example_tmp;

DROP TABLE IF EXISTS sample.example_tmp PURGE;

上面的脚本会将小文件压缩成分区内的一些大文件。文件名将是 00000n_0

文件模式差异的可能原因是什么,从一个更改到另一个的配置可能是什么?

可能有人使用 Hive 在分区上运行压缩逻辑。或者可能使用 Hive 重新加载分区数据。这不是问题,数据保持不变。


推荐阅读