显示在 Spark+Parquet 程序中读取的字节数

Posted

技术标签:

【中文标题】显示在 Spark+Parquet 程序中读取的字节数【英文标题】:Display bytes read in a Spark+Parquet program 【发布时间】:2019-03-14 02:54:47 【问题描述】:

我正在尝试通过利用分区和下推等功能来优化一些 Spark 查询和 Parquet 模式。我的理解是这些技术允许跳过大部分 Parquet 文件。

有没有办法显示 Spark 读取的字节数与 Parquet 文件的总大小?另外,读取操作的数量? (我使用的是 S3,因此由于 S3 API 调用的开销,我想尽量减少读取操作的数量。)

【问题讨论】:

【参考方案1】:

如果您使用的是 apache spark(而不是 EMR 的私有变体),S3A 连接器会收集 lot of stats,包括:关闭连接时丢弃的字节数、#of HEAD 请求、限制操作等

但是:它并没有真正收集在 spark 中,并且因为每个 s3 存储桶的文件系统类的单个实例(因此统计信息)用于每个工作人员,即使您确定了如何收集它们,它们也往往会高估努力的程度。那里有改进的机会,但这需要大量的工作。您目前得到的只是每个线程读取的字节数、写入的字节数统计信息,如果上传数据的 HTTP 请求是在后台线程中完成的,则实际上可能会低估写入的字节数。

您可以启用org.apache.hadoop.fs.s3a.S3AStorageStatistics 在调试时登录,然后每个 Spark 工作人员的日志实际上会在这些操作发生时跟踪这些操作,但它非常嘈杂。在尝试调试事物或对 Parquet 阅读器本身等进行低级性能优化时主要有用。

恐怕不知道 EMR — 不是我的代码。

【讨论】:

我正在使用 s3a,这听起来正是我想要的,但我正在使用 pyspark,无法弄清楚如何设置 log4j 日志记录属性。我将在一个单独的 SO 问题中发布。 哦,还有:在最新(2.8+?)版本的 Hadoop 上,如果您可以在进程中获取 S3AFileSystem 类的实例并在其上调用 toString(),则会得到转储所有当前值

以上是关于显示在 Spark+Parquet 程序中读取的字节数的主要内容,如果未能解决你的问题,请参考以下文章

尝试在 Spark 中读取 Parquet 时出错

Hive 不读取 Spark 生成的分区 parquet 文件

什么时候在 Spark 中执行 .repartition(Int AnyValue),在读取 Parquet 之后(或)在 Parquet 上运行计算之后?

在独立/主从 spark-shell 中读取 Parquet 时的不同行为

为啥 Apache Spark 会读取嵌套结构中不必要的 Parquet 列?

spark剖析:spark读取parquet文件会有多少个task