spark ORC原理

orc历史

  ORC的全称是(Optimized Row Columnar),ORC文件格式是一种Hadoop生态圈中的列式存储格式,它的产生早在2013年初,最初产生自Apache Hive,用于降低Hadoop数据存储空间和加速Hive查询速度。

orc结构–----hdfs上的物理视图

  

orc结构----逻辑视图

orc存储结构解析

    orc文件有如下结构快:block,stripe,row_group,stream,index data,Row data,fileFooter,postscript

    orc在hdfs上存储,为适应hdfs区块存储思想会将orc文件划分成block块,orc的block块大小一般和hdfs的block块大小一致通过配置( hive.exec.orc.default.block.size 默认256M)指定。每个block块中包含多个stipe,stipe大小通过参数( hive.exec.orc.default.stripe.size 默认64M)指定。应尽量避免strip跨hdfs:block存储,否则在解析stipe时会存在IO跨节点的数据请求,从而增加了系统资源开销。所以,一般orc:block块大小是orc:stripe大小的整数倍。但是,在有些情况下还是会出现block块不能够被整数个stipe完整填满,需要关闭跨hdfs:block的数据存储,需要指定(hive.exec.orc.default.block.padding=false)关闭块存储。另外需要指定最小磁盘利用空间( hive.exec.orc.block.padding.tolerance 默认0.05,例如orc:block=256M,256*0.05=12.5M),hdfs:block块剩余磁盘空间低于此值将放弃使用。

orc on spark

   1. 在spark上如何使用配置调优

        df.write.option(“”,””).orc(“path”)

        df.write.format(“”).option(“”,””).save(“path”)

        df.write.format(“”).option(“”,””).saveAsTable(“”)

       

       create table tablename(

           col1 STRING,

           col2 STRING

       )stored as orc tblproperties ("orc.compress"="NONE");

   2.在spark环境下可用的调优配置    

 

Orc配置

Hive别名

默认值

描述

orc.stripe.size

 hive.exec.orc.default.stripe.size

 64M

Stripe大小

orc.block.size

&

### Spark SQL 的底层原理解析 #### 1. 查询执行的四个阶段 Spark SQL 的查询执行过程可以分为四个主要阶段:Parse(解析)、Analyze(分析)、Optimize(优化)和 Generate Physical Plan(生成物理计划)。每个阶段都对应特定的功能模块,以下是对这些阶段的详细说明: - **Parse 阶段** 在此阶段,SQL 语句被解析为抽象语法树(AST),并进一步转换为未解析的逻辑计划(Unresolved Logical Plan)。这一过程通过 Antlr4 工具实现,基于 `SqlBase.g4` 定义的语法规则生成语法解析器和词法解析器[^4]。 - **Analyze 阶段** 未解析的逻辑计划会被传递到 Analyzer 模块进行处理。Analyzer 使用一组预定义的规则对逻辑计划进行绑定操作,例如解析表名、列名以及数据类型等信息。此外,它还会利用 `SessionCatalog` 管理元数据信息,确保逻辑计划中的所有元素都被正确解析[^5]。 - **Optimize 阶段** 经过解析和绑定后,逻辑计划进入 Optimizer 模块进行优化。Optimizer 是 Catalyst 查询优化器的核心部分,能够执行多种优化策略,如谓词下推、投影消除和列剪裁等[^3]。这些优化策略旨在减少不必要的计算开销,从而提升查询性能。 - **Generate Physical Plan 阶段** 最终,优化后的逻辑计划会被转换为物理计划。物理计划描述了实际的执行步骤,包括数据分区、Shuffle 操作以及具体的算子实现方式。QueryExecution 负责根据物理计划生成可执行的任务,并提交给 Spark 引擎运行[^1]。 #### 2. Catalyst 查询优化器 Catalyst 是 Spark SQL 的核心组件之一,负责查询计划的优化工作。它采用了一种基于规则的优化方法,并结合成本模型来选择最佳执行计划。以下是 Catalyst 的几个关键特性: - **规则驱动的优化** Catalyst 提供了一系列内置规则,用于对逻辑计划进行转换。例如,`PushDownPredicate` 规则实现了谓词下推功能,将过滤条件尽可能地靠近数据源,从而减少不必要的数据读取[^2]。 - **自定义扩展** 用户可以通过编写自定义规则来扩展 Catalyst 的功能。这使得 Spark SQL 能够适应不同的应用场景和数据源特性。 - **动态分区裁剪** 在处理分区表时,Catalyst 可以根据查询条件自动裁剪掉不相关的分区,进一步减少扫描的数据量。 #### 3. 数据源集成与格式支持 Spark SQL 支持多种数据源格式,包括 Parquet、ORC、JSON 和 Avro 等。每种格式都有其特定的优化机制,例如 Parquet 格式支持高效的列式存储和压缩算法,而 ORC 格式则提供了更强大的索引功能[^1]。 以下是一个使用 Parquet 格式加载数据的示例: ```python df = spark.read.format("parquet").load("hdfs://path/to/data") df.createOrReplaceTempView("table_name") result = spark.sql("SELECT * FROM table_name WHERE column > 10") result.show() ``` #### 4. 性能优化技术 除了 Catalyst 查询优化器外,Spark SQL 还采用了其他多项技术来提升性能,例如: - **Broadcast Join** 当参与 Join 操作的小表可以完全放入内存时,Spark SQL 会优先选择 Broadcast Join 策略。这种方式避免了 Shuffle 操作,显著降低了计算开销[^2]。 - **Code Generation** Spark SQL 利用 Whole-Stage Codegen 技术将多个算子合并为一个大任务,并生成高效的字节码。这种方法减少了函数调用的开销,提高了运行效率[^1]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值