Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache spark Spark是否支持S3中实木地板文件的真列扫描?_Apache Spark_Amazon S3_Apache Spark Sql_Parquet - Fatal编程技术网

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的拼花地板阅读器就像其他任何输入格式一样

  • 没有任何inputFormat对S3有任何特殊的功能。输入格式可以从LocalFileSystem、Hdfs和S3中读取,无需为此进行特殊优化

  • 拼花输入格式取决于您要求的列,将有选择地为您读取列

  • 如果您想完全确定(尽管push-down谓词在最新的spark版本中工作),请手动选择列并编写转换和操作,而不是依赖SQL


  • 否,不完全支持谓词下推。当然,这取决于:

    • 特定用例
    • 星火版
    • S3连接器类型和版本
    为了检查您的特定用例,您可以在Spark中启用调试日志级别,并运行查询。然后,您可以查看在S3(HTTP)请求期间是否存在“搜索”,以及实际发送了多少个请求。大概是这样的:

    
    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]