SuperAPI AI 工具集

apache-spark-data-processing

数据与分析

查看项目

更新于 10-15 10:10

技能介绍

用途

Apache Spark 数据处理技能用于掌握 Spark 的分布式数据处理能力,从基础 RDD 操作到高级流处理、SQL 和机器学习工作流。适用于需要处理单机无法承载的大规模数据(TB 至 PB 级)、执行集群并行计算、实时流处理、复杂数据分析、大规模机器学习训练、ETL/ELT 管道构建、交互式大数据探索,以及统一批流处理的场景。

不适合的场景包括:小于 100 GB 且可放入单机内存的小数据集、简单 CRUD 操作、要求低于 10ms 的超低延迟处理,以及需要跨分布式数据强 ACID 事务的工作流。

核心概念

RDD(弹性分布式数据集):Spark 的基础数据抽象,不可变、分布式的对象集合。具备容错性(通过血统追踪)、分布式分区、不可变性、惰性求值和内存计算特性。操作分为转换(map、filter、flatMap、reduceByKey 等惰性操作)和动作(collect、count、reduce、saveAsTextFile 等触发计算的操作)。适用于需要底层控制数据分布、自定义分区、处理非结构化数据或迁移旧版 Spark 代码的场景。

DataFrame 和 Dataset:DataFrame 是按命名列组织的分布式数据集合,支持自动查询优化(Catalyst)、跨语言(Python、Scala、Java、R)和丰富的类 SQL API。Dataset 仅支持 Scala/Java,提供编译时类型安全。相比 RDD,DataFrame 具备查询优化、Tungsten 执行、列式存储和代码生成等优势。

惰性求值:转换构建有向无环图(DAG),动作触发执行,优化器分析整个 DAG 并生成优化执行计划。

分区:数据划分为分区以并行处理,支持默认分区、哈希分区、范围分区和自定义分区。一般建议每个 CPU 核心 2-4 个分区,可用 repartition() 或 coalesce() 调整。

缓存与持久化:对多次使用的数据、迭代算法、交互式分析可缓存。支持 MEMORY_ONLY、MEMORY_AND_DISK、DISK_ONLY、MEMORY_ONLY_SER 等存储级别。仅使用一次的数据、超出集群内存的超大数据集、持续接收新数据的流应用不宜缓存。

广播变量与累加器:广播变量为只读变量,缓存在每个节点,适合共享大型只读数据(查找表、ML 模型)。累加器为只写变量,用于跨任务聚合计数和求和,仅驱动端可读取最终值。

Spark SQL

Spark SQL 允许使用 SQL 或 DataFrame API 查询结构化数据,支持将 DataFrame 注册为临时视图、连接 Hive 元数据、支持 Parquet、ORC、JSON、CSV、JDBC 等多种数据源。性能特性包括 Catalyst 优化器、Tungsten 执行引擎、自适应查询执行(AQE)和动态分区裁剪。

DataFrame 创建:可从结构化数据、JSON/Parquet/CSV 文件、JDBC 源创建。

DataFrame 操作:包括 select、filter/where、withColumn、groupBy、agg、orderBy、join、union 等。

SQL 查询:通过 createOrReplaceTempView 注册视图后使用 spark.sql() 执行查询,支持复杂查询、分组、聚合和排序。

数据源:Parquet(推荐用于分析,列式存储、优秀压缩和查询性能、支持谓词下推和列裁剪)、ORC(类似 Parquet,略优压缩,适合 Hive 集成)、JSON(可读性好但效率较低,适合嵌套数据)、CSV(兼容性好但慢)。

窗口函数:支持 row_number、rank、dense_rank、lag、lead、sum、avg 等,通过 Window.partitionBy().orderBy() 定义窗口规范。

UDF:支持 Python UDF(因序列化开销较慢)和 Pandas UDF(向量化,大数据集更快)。性能建议:优先使用内置 Spark 函数,优先 Pandas UDF 而非 Python UDF,Scala UDF 性能最佳。

转换与动作

常见转换包括 map、filter、flatMap、reduceByKey、groupByKey(尽量避免,用 reduceByKey 替代)、join、distinct、coalesce/repartition。常见动作包括 collect(仅用于小数据集)、count、first/take、reduce、foreach、saveAsTextFile、show。

结构化流处理

使用 DataFrame API 处理连续数据流。流式 DataFrame 是持续增长的无界表,支持与批处理 DataFrame 相同的操作,采用微批处理(默认)或连续处理。输入源包括文件、Kafka、Socket、Rate 源和自定义源。输出模式有 Append、Complete、Update。输出接收器包括文件、Kafka、Console、Memory 和 Foreach/ForeachBatch。

基本示例:通过 spark.readStream 读取流,进行转换后通过 writeStream 写入,需指定 checkpointLocation 和 outputMode,最后调用 start() 和 awaitTermination()。

限制

关于 MLlib 和生产部署的具体内容,当前资料暂未提供详细说明。