Apache spark 是什么导致配置单元表分区中的不同模式?

Apache spark 是什么导致配置单元表分区中的不同模式?,apache-spark,hadoop,hive,Apache Spark,Hadoop,Hive,我们有spark作业,但也在当前hadoop集群中随机运行配置单元查询 我看到同一个配置单元表具有不同的分区模式,如下所示: i、 e.如果表是按日期划分的,那么 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

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

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

i、 e.如果表是按日期划分的,那么

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\u 0
,而且
part-
文件的文件数量要多得多,但每个文件都非常小

我还发现
part-
文件上的聚合比
00000n\u 0
文件慢得多


文件模式差异的可能原因是什么?从一个到另一个的配置可能会发生什么变化?

当spark streaming在Hive中写入数据时,它会在Hive中创建许多名为
part-
的小文件,并且不断增加。这将在查询配置单元表时产生性能问题。由于分区中没有大的小文件,配置单元花费太多时间给出结果

当spark作业在配置单元中写入数据时,它看起来像-

/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 in
00000 n_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\u 0

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


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

谢谢你及时的回复,这是一个很好的回答。您的示例中的上述查询似乎是直接在配置单元中运行的,运行spark SQL时在spark streaming中添加reducer是否有性能差异?这取决于配置单元后面使用的执行引擎。如果配置单元使用Spark,那么性能将与Spark SQL大致相同。对于MR,Spark SQL将更快。