Spark read.parquet花费了太多时间

时间:2017-12-27 03:16:49

标签: performance apache-spark parquet

您好,我不明白为什么这段代码需要花费太多时间。

val newDataDF = sqlContext.read.parquet("hdfs://192.168.111.70/u01/dw/prod/stage/br/ventas/201711*/*")

假设没有字节传输到驱动程序,不是吗? read.parquet是如何工作的?

我从Spark网络用户界面中看到的是,read.spark会激活大约4000个任务(该文件夹中有很多镶木地板文件)。

1 个答案:

答案 0 :(得分:2)

问题很可能是作为加载DataFrame的第一步必须发生的文件索引。你说spark.read.parquet会激活4000个任务,所以你可能有很多分区文件夹? Spark将获得HDFS目录列表,并递归获取每个文件夹中所有文件的FileStatus(大小和拆分)。为了提高效率,Spark并行索引文件,因此您需要确保拥有足够的内核以使其尽可能快。您还可以在要读取的文件夹中更明确,或者在数据上定义Parquet DataSource表,以避免每次加载时发现分区。

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'
""")
相关问题