Spark read.parquet 花费太多时间
Spark read.parquet takes too much time
您好,我不明白为什么这段代码会花费太多时间。
val newDataDF = sqlContext.read.parquet("hdfs://192.168.111.70/u01/dw/prod/stage/br/ventas/201711*/*")
应该没有字节传输到驱动程序,不是吗? read.parquet 是如何工作的?
我从 Spark web UI 上看到的是 read.spark 触发了大约 4000 个任务(该文件夹中有很多 parquet 文件)。
问题很可能是文件索引必须作为加载 DataFrame 的第一步发生。你说 spark.read.parquet
触发了 4000 个任务,所以你可能有很多分区文件夹? Spark 将获取 HDFS 目录列表并递归获取每个文件夹中所有文件的 FileStatus
(大小和拆分)。为了提高效率,Spark 并行索引文件,因此您需要确保有足够的核心来使其尽可能快。您还可以在希望读取的文件夹中更加明确,或者在数据上定义 Parquet DataSource table,以避免每次加载时都发现分区。
spark.sql("""
create table mydata
using parquet
options(
path 'hdfs://192.168.111.70/u01/dw/prod/stage/br/ventas/201711*/*'
)
""")
spark.sql("msck repair table mydata")
从现在开始,当您查询数据时,它将不再需要进行分区发现,但仍然需要为您查询的文件夹中的文件获取 FileStatus
。如果您添加新分区,您可以显式添加分区或再次强制完整 repair table
:
spark.sql("""
alter table mydata add partition(foo='bar')
location 'hdfs://192.168.111.70/u01/dw/prod/stage/br/ventas/201711/foo=bar'
""")
您好,我不明白为什么这段代码会花费太多时间。
val newDataDF = sqlContext.read.parquet("hdfs://192.168.111.70/u01/dw/prod/stage/br/ventas/201711*/*")
应该没有字节传输到驱动程序,不是吗? read.parquet 是如何工作的?
我从 Spark web UI 上看到的是 read.spark 触发了大约 4000 个任务(该文件夹中有很多 parquet 文件)。
问题很可能是文件索引必须作为加载 DataFrame 的第一步发生。你说 spark.read.parquet
触发了 4000 个任务,所以你可能有很多分区文件夹? Spark 将获取 HDFS 目录列表并递归获取每个文件夹中所有文件的 FileStatus
(大小和拆分)。为了提高效率,Spark 并行索引文件,因此您需要确保有足够的核心来使其尽可能快。您还可以在希望读取的文件夹中更加明确,或者在数据上定义 Parquet DataSource table,以避免每次加载时都发现分区。
spark.sql("""
create table mydata
using parquet
options(
path 'hdfs://192.168.111.70/u01/dw/prod/stage/br/ventas/201711*/*'
)
""")
spark.sql("msck repair table mydata")
从现在开始,当您查询数据时,它将不再需要进行分区发现,但仍然需要为您查询的文件夹中的文件获取 FileStatus
。如果您添加新分区,您可以显式添加分区或再次强制完整 repair table
:
spark.sql("""
alter table mydata add partition(foo='bar')
location 'hdfs://192.168.111.70/u01/dw/prod/stage/br/ventas/201711/foo=bar'
""")