【问题标题】:Spark read.parquet takes too much timeSpark read.parquet 需要太多时间
【发布时间】:2017-12-29 14:25:00
【问题描述】:

嗨,我不明白为什么这段代码需要太多时间。

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 文件)。

【问题讨论】:

    标签: performance apache-spark parquet


    【解决方案1】:

    问题很可能是作为加载 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'
    """)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-07
      • 2017-01-10
      • 1970-01-01
      • 1970-01-01
      • 2019-07-04
      相关资源
      最近更新 更多