Apache spark Spark是否支持S3中实木地板文件的真列扫描?
拼花地板数据存储格式的最大好处之一是。如果我有一个包含数百列的“宽”数据集,但我的查询只涉及其中的一小部分,那么可能只读取存储这几列的数据,而跳过其余的 这个特性的工作原理大概是读取拼花地板文件头部的一点元数据,该文件指示文件系统中每列的位置。然后,读取器可以在磁盘上搜索,以便只读取必要的列Apache spark Spark是否支持S3中实木地板文件的真列扫描?,apache-spark,amazon-s3,apache-spark-sql,parquet,Apache Spark,Amazon S3,Apache Spark Sql,Parquet,拼花地板数据存储格式的最大好处之一是。如果我有一个包含数百列的“宽”数据集,但我的查询只涉及其中的一小部分,那么可能只读取存储这几列的数据,而跳过其余的 这个特性的工作原理大概是读取拼花地板文件头部的一点元数据,该文件指示文件系统中每列的位置。然后,读取器可以在磁盘上搜索,以便只读取必要的列 有人知道spark的默认拼花读取器是否正确地在S3上实现了这种选择性搜索吗?我认为,理论上的支持和正确利用这种支持的实现之间有很大的区别。spark的拼花地板阅读器就像其他任何输入格式一样 没有任何inpu
有人知道spark的默认拼花读取器是否正确地在S3上实现了这种选择性搜索吗?我认为,理论上的支持和正确利用这种支持的实现之间有很大的区别。spark的拼花地板阅读器就像其他任何输入格式一样
否,不完全支持谓词下推。当然,这取决于:
- 特定用例
- 星火版
- S3连接器类型和版本
17/06/13 05:46:50调试连线:http-outgoing-1>>“GET/test/part-00000-b8a8a1b7-0581-401f-b520-27fa9600f35e.snappy.parquet http/1.1[\r][\n]”
....
17/06/13 05:46:50调试连线:http-outing-1免责声明:我没有一个明确的答案,也不想充当权威来源,但我花了一些时间研究Spark 2.2+中的拼花地板支持,我希望我的答案可以帮助我们大家更接近正确的答案
S3上的Parquet是否避免从S3中提取未使用列的数据,而只检索所需的文件块,还是提取整个文件
我使用Spark2.3.0-SNAPSHOT,这是我今天从
parquet
数据源格式由哪种格式处理
如果我是正确的,则读取部分由方法处理(该方法覆盖文件格式)
buildReaderWithPartitionValues
仅在为所谓的输入RDD请求FileSourceScanExec
物理运算符时使用,这些RDD实际上是一个RDD,在执行whisttagecodegenexec
时生成内部行
话虽如此,我认为回顾一下buildReaderWithPartitionValues
所做的事情可能会让我们更接近最终答案
当你看着我们时,你可以确信我们走在正确的轨道上
//启用过滤器下推后,尝试下推过滤器
该代码路径取决于该属性的spark.sql.parquet.filterPushdown
spark属性
spark.sql.parquet.filterPushdown设置为true时启用拼花过滤器下压优化
这就引出了parquet hadoop的iff过滤器的定义
if (pushed.isDefined) {
ParquetInputFormat.setFilterPredicate(hadoopAttemptContext.getConfiguration, pushed.get)
}
当代码返回到拼花mr(而不是使用所谓的矢量化拼花解码读取器)时,使用过滤器时,代码变得更有趣。这是我不太理解的部分(除了代码中我能看到的部分)
请注意,矢量化拼花解码读取器由默认打开的spark.sql.parquet.enableVectorizedReader
spark属性控制
提示:要知道使用了表达式的部分,请为org.apache.spark.sql.execution.datasources.parquet.ParquetFileFormat
记录器启用DEBUG
日志记录级别
为了查看所有下推的过滤器,可以打开org.apache.spark.sql.execution.FileSourceScanExec
logger的INFO
logging级别。你应该:
我真的希望,如果它还没有接近一个确定的答案,它已经帮助了一点,有人拿起它,我停下来,使一个很快。希望最后消失:)这需要被打破
拼花地板代码是否从spark获得谓词(是)
然后,parquet是否尝试使用Hadoop文件系统seek()
+read()
或readFully(位置、缓冲区、长度)
调用有选择地只读取这些列?对
S3连接器是否将这些文件操作转换为高效的HTTP GET请求?在亚马逊EMR:是的。在ApacheHadoop中,需要在类路径上使用Hadoop2.8,并正确设置spark.Hadoop.fs.s3a.experimental.fadvise=random
,以触发随机访问
Hadoop 2.7和更早版本对文件的主动查找()处理得很糟糕,因为它们总是启动文件的GET offset结尾,对下一次查找感到惊讶,必须中止该连接,重新打开新的TCP/HTTPS 1.1连接(速度慢,CPU密集),重复执行。随机IO操作在大量加载.csv.gz之类的东西时会造成伤害,但对于获得ORC/拼花地板性能至关重要
在Hadoop2.7的HadoopAWS JAR上,您无法获得加速。如果您需要它,您需要更新hadoop*.jar和依赖项,或者在hadoop 2.8上从头开始构建Spark up
请注意,Hadoop 2.8+还有一个很好的小功能:如果在S3A文件系统客户机上的log语句中调用toString()
,它会打印出所有文件系统IO统计数据,包括在查找、中止TCP连接和c中丢弃的数据量。帮你
INFO Pushed Filters: [pushedDownFilters]