Apache Spark 是一个开源的统一分析引擎,用于大规模数据处理。它提供了一个简单且富有表现力的编程模型,支持多种语言,包括 Java、Scala、Python 和 R。Spark 的速度比 Hadoop MapReduce 快 100 倍,因为它在内存中执行计算,并优化了数据在集群中的移动方式。
Spark 核心概念
- RDD (Resilient Distributed Dataset,弹性分布式数据集): Spark 的核心抽象,表示一个不可变的、分区的数据集,可以并行操作。RDD 可以从外部数据源(如 HDFS、本地文件系统、数据库等)创建,也可以通过转换其他 RDD 创建。
- Transformation (转换): 对 RDD 进行的操作,例如 map、filter、reduceByKey 等。Transformation 是惰性求值的,只有在 Action 操作被触发时才会真正执行。
- Action (动作): 触发 RDD 计算的操作,例如 count、collect、saveAsTextFile 等。Action 会提交 Spark 作业并返回结果。
- Driver Program: Spark 应用程序的控制程序,负责创建 SparkContext、提交 Spark 作业以及收集结果。
- Cluster Manager: 负责管理和分配集群资源,例如 Yarn、Mesos、Standalone 等。
- Executor: 运行在 Worker 节点上的进程,负责执行 Driver Program 发送的任务。
- Stage (阶段): Spark 作业被划分为多个阶段,每个阶段包含一组可以并行执行的任务。
- Task (任务): Spark 作业的最小执行单元,每个任务处理 RDD 的一个分区。
Spark 工作流
- 用户编写 Spark 应用程序 (Driver Program)。
- Driver Program 连接到 Cluster Manager,请求资源。
- Cluster Manager 分配资源,启动 Executor 进程。
- Driver Program 将 Spark 作业转换为 DAG (Directed Acyclic Graph,有向无环图)。
- DAG 被划分为多个 Stage,每个 Stage 包含一组可以并行执行的任务。
- Executor 执行任务,并将结果返回给 Driver Program。
- Driver Program 收集所有结果并返回给用户。
大数据工程师2024-Spark应用
代码语言:python代码运行次数:0复制from pyspark.sql import SparkSession
# 初始化 SparkSession
spark = SparkSession.builder
.appName("Spark数据处理示例")
.getOrCreate()
# 读取数据
data = [("Alice", 25), ("Bob", 30), ("Charlie", 28)]
df = spark.createDataFrame(data, ["name", "age"])
# 数据处理
# 1. 使用filter过滤年龄大于28岁的数据
df_filtered = df.filter(df.age > 28)
# 2. 使用groupBy分组统计每个年龄的人数
df_grouped = df.groupBy("age").count()
# 3. 使用join连接两个DataFrame
data2 = [("Alice", "female"), ("Bob", "male"), ("David", "male")]
df2 = spark.createDataFrame(data2, ["name", "gender"])
df_joined = df.join(df2, on="name", how="inner")
# 显示结果
df_filtered.show()
df_grouped.show()
df_joined.show()
# 停止 SparkSession
spark.stop()
- 初始化 SparkSession: 创建 SparkSession 是 Spark 应用的入口,这里我们设置应用名为 "Spark数据处理示例"。
- 读取数据: 使用
spark.createDataFrame
从 Python 列表创建 DataFrame,DataFrame 是 Spark 中的数据抽象,类似于关系型数据库中的表。 - 数据处理:
- 使用
filter
过滤年龄大于 28 岁的数据。 - 使用
groupBy
按年龄分组,并使用count
统计每组人数。 - 使用
join
将两个 DataFrame 按照姓名进行内连接。
- 使用
- 显示结果: 使用
show()
方法展示处理后的 DataFrame 内容。 - 停止 SparkSession: 使用
spark.stop()
停止 SparkSession,释放资源。
spark-submit spark_data_processing.py
代码语言:bash复制 ------ ---
| name|age|
------ ---
| Bob| 30|
------ ---
--- -----
|age|count|
--- -----
| 25| 1|
| 30| 1|
| 28| 1|
--- -----
------ --- ------
| name|age|gender|
------ --- ------
| Bob| 30| male|
|Alice| 25|female|
------ --- ------
大数据工程师2024-数仓整体架构设计
1. 数仓概念
数据仓库 (Data Warehouse) 是一个面向主题的、集成的、随时间变化的、非易失的数据集合,用于支持管理决策。
- 面向主题: 数据以主题组织,例如客户、产品、销售等。
- 集成: 来自不同数据源的数据被整合到一起。
- 随时间变化: 数据存储历史数据和当前数据。
- 非易失: 数据一旦加载到数据仓库中就不会被删除或修改。
2. 数仓架构
2.1. 传统数仓架构
- ODS 层 (Operation Data Store,操作数据存储层): 存储来自业务系统的原始数据,通常以增量方式加载。
- DWD 层 (Data Warehouse Detail,数据仓库明细层): 对 ODS 层数据进行清洗、转换、去重等操作,提供更干净、更规范的数据。
- DWS 层 (Data Warehouse Service,数据仓库服务层): 对 DWD 层数据进行轻度汇总,为不同的业务主题提供服务。
- ADS 层 (Application Data Service,应用数据服务层): 存储面向特定业务场景的数据,例如报表、仪表盘等。
2.2. 现代数仓架构
随着大数据技术的兴起,现代数仓架构更加灵活和可扩展,例如:
- 湖仓一体 (Lakehouse): 将数据湖的灵活性和数据仓库的结构化特性结合起来。
- 数据中台: 提供数据采集、存储、加工、分析和服务等全链路能力。
3. 数仓建设流程
- 需求分析: 明确业务需求和数据需求。
- 架构设计: 设计数仓架构、数据模型和 ETL 流程。
- 数据采集: 从各个数据源采集数据到数据仓库。
- 数据存储: 选择合适的存储引擎存储数据,例如 Hadoop、Hive、HBase 等。
- 数据处理: 使用 ETL 工具对数据进行清洗、转换、加载等操作。
- 数据分析: 使用 BI 工具或机器学习算法对数据进行分析。
- 数据可视化: 使用报表、仪表盘等方式展示数据分析结果。
4. 数仓关键技术
- 数据建模: 设计数据仓库的数据模型,例如星型模型、雪花模型等。
- ETL 工具: 使用 ETL 工具进行数据抽取、转换和加载,例如 Sqoop、DataX、Spark 等。
- 数据存储: 选择合适的存储引擎存储数据,例如 Hadoop、Hive、HBase、Kudu 等。
- 数据分析: 使用 SQL、HiveQL、Spark SQL 等工具进行数据分析。
- 数据可视化: 使用 Tableau、Power BI、Superset 等工具进行数据可视化。
5. 数仓最佳实践
- 数据质量管理: 建立数据质量监控机制,确保数据准确性和一致性。
- 元数据管理: 建立元数据管理系统,管理数据仓库的元数据信息。
- 数据安全: 实施数据安全策略,保护数据仓库中的敏感数据。