spark读取hdfs路径下的数据_spark 读取 hdfs 数据分区规则

本文介绍了Spark如何读取HDFS中的parquet文件和Hive表,并探讨了在不同配置下,尤其是`spark.sql.hive.convertMetastoreParquet`设置为true和false时的分区优化策略。当该参数为true,使用FileSourceScanExec,优化包括根据`spark.sql.files.maxPartitionBytes`和`spark.sql.files.openCostInBytes`计算分区大小。反之,使用HiveTableScanExec则根据文件数量和大小进行分区。分桶情况下的分区数量取决于桶的数量。
摘要由CSDN通过智能技术生成

下文以读取 parquet 文件 / parquet hive table 为例:

hive metastore 和 parquet 转化的方式通过 spark.sql.hive.convertMetastoreParquet 控制,默认为 true。

如果设置为 true ,会使用 org.apache.spark.sql.execution.FileSourceScanExec ,否则会使用 org.apache.spark.sql.hive.execution.HiveTableScanExec。

FileSourceScanExec

前者对分区规则做了一些优化,如果 文件是:

没有分桶的情况

分区大小计算公式:

bytesPerCore = totalBytes / defaultParallelism

maxSplitBytes = Math.min(defaultMaxSplitBytes, Math.max(openCostInBytes, bytesPerCore))

defaultMaxSplitBytes:spark.sql.files.maxPartitionBytes,默认为128M,每个分区读取的最大数据量

openCostInBytes: spark.sql.files.openCostInBytes,默认为4M,小于这个大小的文件将会合并到一个分区,可以理解为每个分区的最小量,避免碎文件造成的大量碎片任务。

defaultParallelism: spark.default.parallelism,yarn默认为应用cores数量或2。

bytesPerCore:数据总大小 / defaultParallelism

eg. 读入一份 2048M 大小的数据

Tip: partitionSize的计算过程简化,实际上会先对读入的每个分区按maxSplitBytes做切割,切割完后如果的小文件如果大小不足maxSplitBytes的,会合并到一个partition,直到大小 > maxSplitBytes。

//如果 spark.default.parallelism 设置为 1000,最终的分区数量是 512,每个分区大小为4M

maxSplitBytes = Math.min(128M, Math.max(4M, 2M))

partitionSize = 2048 / 4 = 512

//如果 spark.default.parallelism 设置为 100, 最终的分区数量是 100,每个分区大小为20.48M

maxSplitBytes = Math.min(128M, Math.max(4M, 20.48M))

partitionSize = 2048 / 20.48 = 100

//如果 spark.default.parallelism 设置为 10, 最终的分区数量是 16,每个分区大小为128M

maxSplitBytes = Math.min(128M, Math.max(4M, 204.8M))

partitionSize = 2048 / 128 = 16

分桶的情况下:

分区数取决于桶的数量。

HiveTableScanExec

通过文件数量,大小进行分区。

eg. 读入一份 2048M 大小的数据,hdfs 块大小设置为 128M ,其中小文件的定义为大小不超过 128M。

该目录有1000个小文件,则会生成1000个partition。

如果只有1个文件,则会生成 16 个分区。

如果有一个大文件1024M,其余 999 个小文件共 1024M,则会生成 1007 个分区。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值