IBM-数据工程-I-笔记-全-

IBM 数据工程 I 笔记(全)

001:《数据工程毕业项目》🎓

概述

在本节课中,我们将要学习《数据工程毕业项目》的课程介绍。恭喜你坚持到现在。此时,你已经完成了数据工程专业证书项目中的全部12门课程,现在有机会展示你在学习过程中所掌握的技能。这个毕业项目为你提供了一个平台,用以展示你在跟随项目学习期间获得的所有实践性、动手操作的数据工程技能。

项目角色与挑战

作为毕业项目的一部分,你将扮演一名新加入某电子商务组织的助理数据工程师角色。

你将面临一个业务挑战,需要为零售数据分析构建一个数据平台。

项目核心任务

在这个毕业项目中,你将完成以下核心任务:

  • 设计一个使用 MySQL 作为OLTP数据库、MongoDB 作为NoSQL数据库的数据平台。
  • 设计并实现一个数据仓库,并从数据中生成报告。
  • 设计一个反映业务关键指标的报表仪表板。
  • 从OLTP和NoSQL数据库中提取数据,进行转换,然后加载到数据仓库中。
  • 创建一个ETL管道。
  • 最后,创建到数据仓库的Spark连接,并部署一个机器学习模型。

模块分解

上一节我们介绍了项目的整体目标,本节中我们来看看项目具体包含哪些模块。以下是六个模块的详细内容:

模块1:OLTP数据库设计

在模块1中,你将:

  • 为电子商务网站设计OLTP数据库。
  • 使用提供的数据填充OLTP数据库。
  • 将每日增量数据自动导出到数据仓库。

模块2:NoSQL数据库设置

在模块2中,你将:

  • 设置一个NoSQL数据库来存储电子商务网站的商品目录数据。
  • 将电子商务目录数据加载到NoSQL数据库中。
  • 查询NoSQL数据库中的电子商务目录数据。

模块3:数据仓库设计与实现

在模块3中,你将:

  • 基于OLTP和NoSQL数据库的模式,设计数据仓库的模式。
  • 创建该模式并将数据加载到事实表和维度表中。
  • 实现每日增量数据到数据仓库的自动插入。
  • 创建多维数据集(Cubes)和汇总表(Rollups)以简化报表生成。

模块4:数据可视化与仪表板

在模块4中,你将:

  • 创建一个指向数据仓库表的Cognos数据源。
  • 创建手机季度销售额的条形图。
  • 创建电子产品按类别划分的销售额饼图。
  • 创建2020年每月总销售额的折线图。

模块5:ETL管道构建

在模块5中,你将:

  • 将数据从OLTP和NoSQL(MongoDB)数据库提取为CSV格式。
  • 转换OLTP数据以匹配数据仓库模式。
  • 将转换后的数据加载到数据仓库中。
  • 验证数据是否正确加载。

模块6:大数据分析与机器学习

在第六个也是最后一个模块中,你将:

  • 运用大数据分析技能,创建到数据仓库的Spark连接。
  • 在Spark ML上部署一个用于销售预测的机器学习模型。

评估方式

每个模块都包含一个作为提交自检的评分检查清单,以及一个测试知识的小测验。你的评估将基于每个模块中的检查清单和测验。

对于最终提交,你需要完成所有作业,并上传所有任务的截图作为完成证明。你的同学将随后评审并为你的最终项目提交评分。你也需要为一位同学的项目进行同行评审。

开始学习

现在,请花几分钟时间探索课程网站。

  • 查看每周将涵盖的材料,并预览需要通过本课程所需完成的作业。
  • 探索论坛,在那里你可以与其他学习者以及课程团队讨论课程材料。
  • 如果你对课程内容有任何疑问,请在这些论坛中发帖,从课程社区中的其他人那里获得帮助。
  • 对于平台的技术问题,请访问帮助或支持中心。

总结与鼓励

当你成功完成本项目的所有课程后,你将获得数据工程专业证书。

我们很高兴你的加入,并希望你喜欢这门课程。祝你好运,让我们开始吧!

002:作业概述 🎯

在本节课中,我们将学习《数据工程毕业项目》第一个模块“数据平台架构与OLTP数据库”的作业概览。我们将了解需要完成的三个主要练习及其具体任务。

概述

本模块包含三个练习,每个练习由多个任务组成。在开始作业前,你需要首先启动MySQL服务器以检查实验环境是否就绪。

练习一:设计OLTP数据库模式

上一节我们介绍了模块的整体目标,本节中我们来看看第一个练习的具体内容。

第一个练习要求你为OLTP数据库设计模式。该数据库将存储销售数据,例如产品ID、客户ID、价格、数量和销售时间戳。

以下是该练习的核心概念:

  • OLTP数据库:用于处理日常事务的数据库,例如销售记录。
  • 数据库模式:定义了数据表的结构、字段类型和表之间的关系。

练习二:加载数据与查询

完成模式设计后,下一步是将数据加载到数据库中并进行初步查询。

在第二个练习中,你将把数据加载到OLTP数据库。具体任务包括:使用PHP MyAdmin将下载的CSV文件中的数据导入到数据表中。此外,你还需要列出数据库中的所有表,并编写一个查询语句来统计表中记录的数量。

以下是该练习的关键步骤:

  1. 使用PHP MyAdmin导入CSV数据。
  2. 执行SQL命令列出所有表:SHOW TABLES;
  3. 编写查询以获取记录数:SELECT COUNT(*) FROM table_name;

练习三:管理任务与数据导出

接下来,我们将进入最后一个练习,它侧重于数据库的管理和维护任务。

在第三个也是最后一个练习中,你将设置管理任务。首先,在时间戳字段上创建索引,然后列出该表上的所有索引。最后,你将编写一个bash脚本,将数据表中的所有行导出到SQL文件。

以下是该练习涉及的操作:

  • 创建索引CREATE INDEX idx_timestamp ON sales_data (timestamp);
  • 列出索引SHOW INDEX FROM sales_data;
  • 编写导出脚本:一个包含 mysqldump 命令的bash脚本。

作业提交要求

在执行每个任务后,你需要对所使用的命令和获得的输出进行截图,并为截图命名。

总结

本节课中我们一起学习了毕业项目第一个模块的作业概览。我们明确了三个核心练习:设计OLTP数据库模式、加载并查询数据,以及执行索引创建和数据导出等管理任务。现在,你可以开始着手完成这些练习了。祝你好运!

003:NoSQL数据库数据查询作业概述 📋

在本节课中,我们将学习如何在NoSQL数据库中进行数据查询。具体来说,我们将完成一个包含一系列任务的练习。这个练习将引导你使用MongoDB工具进行数据导入、查询和导出操作。

作业概述与准备 🛠️

在开始作业之前,你需要在实验环境中安装MongoDB的导入和导出工具,即 mongoimportmongoexport。安装完成后,你需要下载一个JavaScript对象表示法文件,即JSON文件。

以下是安装和准备步骤的简要说明:

  1. 在实验环境中安装 mongoimportmongoexport 工具。
  2. 下载指定的JSON数据文件。

核心任务分解 📝

上一节我们介绍了作业的准备工作,本节中我们来看看具体的任务要求。整个练习包含以下几个核心步骤。

任务一:数据导入与数据库查看

首先,你需要将下载的JSON文件导入到MongoDB服务器中。具体目标是将其导入到名为 catalog 的数据库下的 electronics 集合中。

导入完成后,你需要执行命令来列出服务器上的所有数据库,并进一步列出 catalog 数据库中的所有集合。

以下是此任务涉及的关键命令示例:

# 导入JSON文件到指定数据库和集合
mongoimport --db catalog --collection electronics --file your_data.json

# 连接到MongoDB并列出所有数据库
show dbs

# 切换到catalog数据库并列出其所有集合
use catalog
show collections

任务二:文档查询与数据统计

接下来,你需要对导入的数据进行查询。首先,列出 electronics 集合中的前五个文档。

然后,你需要编写查询语句来完成以下三项统计:

  1. 查找所有笔记本电脑(laptops)的数量。
  2. 查找屏幕尺寸为6英寸的智能手机(smartphones)的数量。
  3. 计算所有智能手机的平均屏幕尺寸。

以下是此任务涉及的关键查询示例:

// 查找前5个文档
db.electronics.find().limit(5)

// 统计笔记本电脑的数量
db.electronics.countDocuments({ type: "laptop" })

![](https://github.com/OpenDocCN/dsai-notes-pt1-zh/raw/master/docs/ibm-dtengi-1/img/b36ed5d37496646be6ab69a16931b9f6_11.png)

// 统计屏幕尺寸为6英寸的智能手机数量
db.electronics.countDocuments({ type: "smartphone", screen_size: 6 })

![](https://github.com/OpenDocCN/dsai-notes-pt1-zh/raw/master/docs/ibm-dtengi-1/img/b36ed5d37496646be6ab69a16931b9f6_12.png)

![](https://github.com/OpenDocCN/dsai-notes-pt1-zh/raw/master/docs/ibm-dtengi-1/img/b36ed5d37496646be6ab69a16931b9f6_13.png)

// 计算智能手机的平均屏幕尺寸
db.electronics.aggregate([
  { $match: { type: "smartphone" } },
  { $group: { _id: null, avgScreenSize: { $avg: "$screen_size" } } }
])

任务三:数据导出

最后,你需要从 electronics 集合中导出特定字段的数据。你需要导出的字段包括 _idtypemodel,并将它们保存为一个逗号分隔值文件,即CSV文件。

以下是此任务涉及的关键命令示例:

# 导出指定字段到CSV文件
mongoexport --db catalog --collection electronics --type=csv --fields _id,type,model --out exported_data.csv

作业提交要求 📤

在完成上述每一个任务后,你都需要对所使用的命令及其输出结果进行截图。请为每张截图起一个清晰、描述性的文件名,以便于区分和评审。

课程总结 🎯

本节课中我们一起学习了NoSQL数据库数据查询作业的完整流程。我们首先进行了环境准备,安装了必要的MongoDB工具。然后,我们逐步完成了数据导入、数据库与集合查看、文档查询、数据统计以及最终的数据导出任务。通过这个练习,你实践了使用MongoDB进行基本数据操作的核心技能,包括使用 mongoimportmongoexport 以及在Mongo Shell中执行查询和聚合操作。

004:数据仓库设计与设置作业概述 🗂️

在本节课中,我们将要学习“构建数据仓库”模块中的“数据仓库设计与设置”课程。我们将概述该模块包含的两个主要作业,并了解每个作业的具体任务和目标。

模块作业概述

上一节我们介绍了课程背景,本节中我们来看看具体的作业安排。在本模块中,你将完成两项作业。

以下是两项作业的简要说明:

  • 第一项作业(在本视频中介绍):你将使用 PG Admin 和 PostgreSQL 来设计和创建一个暂存数据仓库环境。
  • 第二项作业(在下一个视频中介绍):你将使用 IBM DB2 on Cloud 来部署用于报告目的的生产数据仓库

作业一:设计与创建暂存数据仓库

现在,让我们深入了解第一项作业的细节。这项作业要求你设计一个数据仓库。一家电子商务公司为你提供了样本数据,你将通过为仓库设计一个星型模式来启动项目。

以下是作业一的具体任务步骤:

  1. 设计星型模式:识别模式中各个维度表和事实表的列。你需要将数据库命名为 softcart
  2. 使用ERD工具设计表:使用 PG Admin 中的 ERD 设计工具来设计以下表结构:
    • softcart_dim_date:使用诸如 dateidmonthmonthname 等字段。公司希望具备按年、月、周、日生成报告的能力。
    • softcart_dim_category
    • softcart_dim_country
    • softcart_fact_sales
  3. 设计表关系:使用 ERD 设计工具设计所需的表关系,例如一对一、一对多等。
  4. 截图存档:完成每项任务后,对整个 ERD 进行截图,需清晰显示所有字段名、数据类型以及表之间的关系。

作业二:将数据加载到数据仓库

完成了数据仓库的设计后,下一步是将数据加载进去。你的高级数据工程师会审查你的设计,并对你的模式设计提出一些改进建议。

以下是作业二的具体任务步骤:

  1. 获取改进后的数据:根据改进后的模式,数据可通过一个链接获取。你需要下载该数据。
  2. 恢复数据到数据库:使用 PG Admin 工具,将下载的数据恢复到名为 staging 的数据库中。
  3. 截图确认:执行此任务后,截图显示数据恢复成功的状态。

祝你好运,让我们开始吧!

课程总结

本节课中我们一起学习了“数据仓库设计与设置”作业的概览。我们明确了本模块包含两项核心作业:第一项是使用 PostgreSQL 设计和搭建暂存环境;第二项是使用 DB2 on Cloud 部署生产环境。我们详细了解了第一项作业中设计星型模式、创建表结构以及第二项作业中加载数据的具体步骤和交付要求。

005:数据仓库报告作业概述

在本节课中,我们将学习“构建数据仓库”模块中关于数据仓库报告的作业。你将通过一系列实践练习,掌握如何将数据加载到数据仓库表中,并使用高级查询技术进行分析。

作业概述

本作业包含两个主要练习。在开始之前,你需要按照提供的链接说明,在云端创建一个IBM DB2实例。如果你在之前的课程中已经创建过DB2实例,可以继续使用它来完成练习。但请注意,如果数据库实例空间不足,你可能需要清理旧表。

练习一:加载数据

在第一个练习中,你需要将公司提供的CSV格式数据加载到数据库表中。以下是需要完成的任务步骤:

  1. 下载数据:从提供的链接下载数据文件。
  2. 加载数据:将下载的数据分别加载到以下表中:
    • D_date
    • D_category
    • D_country
    • factact_sales
  3. 记录结果:加载完成后,为每个表截取前五行的屏幕截图,并妥善命名截图文件。

练习二:查询与分析数据

上一节我们完成了数据的加载,本节中我们来看看如何查询和分析这些数据。在第二个练习中,你将使用已加载的数据执行查询。

首先,你需要使用 order_idcategoryprice_collected 这几列,创建以下三种类型的查询:

  • 分组集查询GROUPING SETS
  • 上卷查询ROLLUP
  • 立方体查询CUBE

最后,你需要创建一个名为 total_sales_per_country 的物化查询表,该表使用 countrytotal_sales 列。

完成每个任务后,请截取SQL语句及其输出结果的屏幕截图,并命名截图文件。

总结

本节课中我们一起学习了数据仓库报告作业的核心内容。你首先需要设置DB2环境并加载CSV数据到指定表中,然后运用GROUPING SETSROLLUPCUBE等高级分组查询技术对数据进行分析,最后创建了一个物化查询表来汇总销售数据。祝你顺利完成练习!

006:作业概述 📋

在本节课中,我们将学习毕业项目数据分析模块的作业概览。你将了解需要完成的几个核心练习及其具体任务。


概述

本次作业包含一系列练习,旨在让你实践数据加载、数据源配置以及数据可视化仪表板的创建。在开始作业前,你需要确保实验环境就绪。

环境准备 🛠️

在着手进行作业之前,你需要检查并确保能够访问IBM DB2数据库和IBM Cognos Analytics的云实例。

以下是环境准备的具体步骤:

  1. 确认你拥有IBM DB2数据库的云实例访问权限。
  2. 确认你拥有IBM Cognos Analytics的云实例访问权限。
  3. 从提供的链接下载本次作业所需的数据集。

完成上述步骤后,你的实验环境就已准备就绪。


练习一:加载数据至数据仓库 📥

上一节我们介绍了环境准备工作,本节中我们来看看第一个核心任务:将数据加载到数据仓库。

此练习要求你将下载的CSV文件数据导入到数据库表中,并验证数据加载成功。

以下是本练习的两个主要任务:

  • 任务1: 将CSV文件数据导入到IBM DB2数据库的一个表中。这通常涉及使用类似 LOADIMPORT 的SQL命令。
    -- 示例:将CSV文件加载到表中
    IMPORT FROM ‘your_data_file.csv’ OF DEL INSERT INTO your_table_name;
    
  • 任务2: 查询并列出该表中的前10行数据,以确认数据已正确加载。
    -- 示例:查询前10行数据
    SELECT * FROM your_table_name FETCH FIRST 10 ROWS ONLY;
    


练习二:在Cognos中创建数据源 🔗

完成了数据加载后,下一步是让分析工具能够访问这些数据。本节我们将学习如何在IBM Cognos Analytics中创建指向你数据库表的数据源。

此练习的目标是在Cognos Analytics中建立一个数据源连接,使其能够读取你在IBM DB2中创建的表。

你需要执行的操作是:在Cognos Analytics界面中,配置一个新的数据源,其连接指向你存放数据的IBM DB2数据库和特定表。


练习三:创建数据可视化仪表板 📊

在建立了数据源之后,我们就可以利用这些数据进行可视化分析了。本节我们将完成最终练习:创建一个包含多种图表的数据仪表板。

在最后的练习中,你将综合运用前面所学,在Cognos Analytics中创建一个仪表板。

以下是需要在该仪表板中完成的具体可视化任务:

  • 任务1: 创建一个展示手机季度销售额的条形图
  • 任务2: 创建一个展示电子产品按类别划分销售额的饼图
  • 任务3: 创建一个展示给定年份月度总销售额趋势的折线图

重要提示: 在完成每个任务后,请对你使用的操作命令(或配置步骤)以及生成的图表结果进行截图,并为每张截图命名,以便提交。


总结

本节课我们一起学习了毕业项目数据分析模块的完整作业流程。我们从环境准备开始,逐步完成了将数据加载到仓库、在分析工具中配置数据源,最终创建了一个包含条形图、饼图和折线图的数据可视化仪表板。现在,你可以开始动手实践了。祝你好运!

007:《数据工程毕业项目》|ETL作业概述 🧑‍💻

在本节课中,我们将学习ETL与数据管道模块中ETL部分的作业概述。你将了解需要完成的两个主要作业及其包含的练习,并明确开始前的准备工作。

概述

本模块包含两个作业。第一个作业(在本视频中介绍)要求你使用Python创建一个ETL管道,从WellTP数据库获取当日新数据并加载到数据仓库中。第二个作业(在后续视频中介绍)要求你使用Apache Airflow创建一个数据管道,以供给大数据集群。

在第一个作业中,你将完成四个练习。但在开始作业之前,你需要完成一些前置任务。

前置准备

在着手进行作业之前,你需要完成以下环境准备和数据导入任务:

  • 启动MySQL服务器从指定链接下载文件数据库
  • 将JSON文件中的数据导入到一个数据库的集合中。
  • 将SQL文件中的数据导入到MySQL服务器。
  • 验证你对IBM DB2服务器云实例的访问权限。

完成这些步骤后,你就可以开始进行作业中的练习了。

作业练习详解

以下是第一个作业中四个练习的具体内容。

练习一:数据提取

第一个练习要求你从MySQL的销售表中提取数据,并将其转换为CSV格式。

练习二:数据转换

在第二个练习中,你需要完成以下任务,将OLTP数据转换为适合数据仓库模式的结构:

  • 读取CSV格式的OLTP数据。
  • 根据数据仓库的模式,添加、编辑和删除列
  • 将转换后的数据保存到一个新的CSV文件中。

练习三:数据加载

第三个练习涉及将转换后的数据加载到数据仓库中,你需要执行以下任务:

  • 读取CSV格式的转换后数据。
  • 将数据加载到数据仓库。
  • 验证数据是否已正确加载。

练习四:流程自动化

最后一个练习要求你完成以下任务,实现每日增量数据的自动提取和加载:

  • 自动化提取每日增量数据,并将前一天的数据加载到数据仓库。
  • 从提供的链接下载Python脚本作为模板。
  • 编写一个能自动加载前一天数据的Python脚本。

任务提交要求

完成每个任务后,请对你使用的命令及其输出进行截图,并为截图文件命名。

总结

本节课我们一起学习了《数据工程毕业项目》中第一个ETL作业的完整概述。我们明确了作业包含的四个核心练习:数据提取、转换、加载和流程自动化,并了解了开始前必须完成的环境准备步骤。现在,你可以根据这些指引开始你的实践了。祝你好运!

008:《数据工程毕业项目》|使用Apache Airflow的数据管道作业概述 🚀

在本节课中,我们将学习如何使用Apache Airflow创建、运行和监控一个数据管道。这个管道将处理Web服务器日志数据,并将其加载到大数据集群中。课程内容分为两个主要练习:第一个练习专注于构建一个包含提取、转换和加载(ETL)任务的有向无环图(DAG);第二个练习则涉及让这个DAG投入运行并进行监控。


概述 📋

本作业属于“ETL与数据管道”模块。在开始实际操作之前,你需要先准备实验环境,包括启动Apache Airflow,并使用提供的链接将数据集从源位置下载到目标位置。

完成环境准备后,你将进行两个练习。第一个练习要求你创建一个每日运行的DAG,其中包含提取、转换和加载数据的任务。第二个练习则要求你保存这个DAG,并通过Airflow控制台使其运行、停止和监控。


练习一:创建数据管道DAG 🔄

在第一个练习中,你将执行一系列任务来创建一个每日运行的有向无环图(DAG)。DAG是Airflow中用于定义任务及其依赖关系的工作流。

以下是本练习需要完成的三个具体任务:

  1. 提取任务:从Web服务器日志文件中提取IP地址和日期字段,并将结果保存到一个CSV文件中。
    • 核心操作提取(日志文件) -> CSV文件

  1. 转换任务:将上一步得到的日期字段转换为“年-月-日”格式,并将输出保存到另一个CSV文件中。
    • 核心操作转换(日期格式) -> 新CSV文件

  1. 加载任务:将转换后的CSV文件进行归档,然后将其移动到下一个处理阶段。
    • 核心操作归档(CSV文件) -> 移动至目标位置

在进入下一个练习之前,你需要根据给定的详细说明,明确定义这三个任务之间的依赖关系,即任务管道


练习二:运行与监控DAG 📊

上一节我们介绍了如何构建一个ETL管道DAG。本节中,我们来看看如何让这个DAG真正运行起来。

在第二个练习中,你需要执行以下步骤来使DAG投入运行:

  1. 保存DAG:将定义好的DAG保存为一个.py(Python)文件。
  2. 提交与运行:通过Airflow控制台提交并启动这个DAG。
  3. 停止与监控:在Airflow控制台中停止DAG运行,并监控其执行状态和日志。

重要提示:在完成每个任务步骤后,请对你使用的命令及其输出进行截图,并妥善命名截图文件,以备查验。


总结 🎯

本节课中,我们一起学习了使用Apache Airflow构建数据管道的完整流程。我们从概述开始,明确了作业的两个主要部分:首先是创建包含提取、转换和加载任务的DAG;然后是实际操作,保存DAG文件并通过Airflow界面对其进行运行和监控。

通过本课的学习,你应该掌握了使用Apache Airflow设计和执行一个基本ETL管道的关键步骤。祝你顺利完成作业!

009:使用Spark进行大数据分析作业概述 🚀

在本节课中,我们将学习《数据工程毕业项目》课程中一个关键作业的概述。这个作业的核心是使用Apache Spark框架来分析电子商务网站的搜索数据,并利用预训练模型进行销售预测。

作业概述

欢迎再次来到“使用Spark进行大数据分析”的作业概述。

在这个作业中,你将执行一系列任务来分析电子商务Web服务器上的搜索词。你将在Watson Studio环境中的Jupyter Notebook里工作,对一个包含Web服务器数据的CSV文件进行分析。

核心任务步骤

以下是完成本作业需要执行的核心步骤:

  1. 数据加载与处理:你将把这个CSV文件加载到一个Spark数据框中。
  2. 数据查询与分析:你将运行查询语句来分析这个数据集,并打印查询结果。
  3. 模型应用与预测:接着,你将加载一个预训练的销售预测模型,并使用它来预测下一年的销售额。

作业提交要求

在执行完每个任务后,你需要对所使用的代码及其输出结果进行截图,并为截图文件命名。

祝你好运,让我们开始吧。😊

010:MapReduce简介 🗺️➡️📊

欢迎来到MapReduce简介课程。

在本节课中,我们将要学习MapReduce的核心概念。观看本视频后,你将能够解释MapReduce中的术语“Map”和“Reduce”,描述我们为何使用MapReduce,列举MapReduce的组成部分,并概述MapReduce的常见用例。

什么是MapReduce?🤔

MapReduce是一种编程模型,它能够在由数百或数千台服务器组成的Hadoop集群中实现大规模扩展,作为其处理组件。MapReduce是Apache Hadoop的核心。它是一种用于分布式计算的处理技术和程序模型,基于Java。

分布式计算是指一个系统或机器由位于不同机器上的多个组件构成。每个组件都有自己的任务,但这些组件相互通信,对最终用户而言如同运行在一个系统上。

MapReduce算法包含两个重要任务:MapReduce。许多MapReduce程序是用Java编写的,但它也可以用C++、Python、Ruby、R等语言编写。

Map与Reduce任务解析 ⚙️

正如其名称所示,MapReduce框架包含两个任务:Map和Reduce。

  • Map任务:接收一个输入文件,通过处理和提取重要的数据信息,将其转换为键值对,这些是初步的输出列表。在将初步输出发送给Reducer之前,还会进行一些重组工作。
  • Reduce任务:与多个Map函数协同工作,根据键来聚合这些键值对,以产生最终输出。

MapReduce通过创建唯一的键来跟踪其任务,确保所有进程都在解决同一个问题。

框架可视化流程 📈

上一节我们介绍了Map和Reduce的基本概念,本节中我们通过一个例子来看看它们是如何协同工作的。

首先,是Map步骤。它接收一组数据,并将其转换为另一组数据,其中单个元素被分解成键值对。键是名称,值是内容。输入数据是保存在Hadoop文件系统(HDFS)中的一个文件。

现在,假设我们有一个包含人名的输入文件,我们想统计每个唯一名字出现的次数。

  1. 数据首先被分割成以下四个文件。每个文件都以键值对的形式存在,并被单独处理。
  2. 例如,对于第一个分割行中的“Teju”和“Brianna”,我们得到两个键值对,每个文件中出现一次。它对所有键值对执行相同的操作。

然后,进入Reduce步骤。Reducer处理来自Map的数据,处理完成后,它会产生一组新的输出,这些输出将存储在HDFS中。

Reducer从Shuffling(混洗) 开始。Shuffling对键和值列表进行排序。例如,你会看到键“Teju”以及来自上一步的对应值列表。我们将得到 Teju: [1, 1, 1]。这是因为名字“Teju”在Map步骤中出现了三次。它对其余的名字也执行相同的操作,计算它们在Map步骤中出现的次数。

然后,Reducer层聚合列表中的值并保存它们。最终输出被保存到一个输出文件中。

MapReduce的优势 🏆

MapReduce的优势在于它能够在多个节点上实现高水平的并行作业。节点是Hadoop中用于处理和存储海量数据的独立计算机。在Hadoop中,我们有两种类型的节点:名称节点和数据节点。

以下是MapReduce的主要优势:

  • 高度并行:MapReduce允许通过分割每个任务来并行运行独立任务,从而节省时间。
  • 灵活处理数据:MapReduce非常灵活,可以处理表格化和非表格化形式的数据。因此,无论企业的数据结构如何,MapReduce都能为其提供商业价值。
  • 多语言支持与分析平台:它支持不同的编程语言,并为数据分析、数据仓库等提供了平台。

MapReduce的常见用例 🌐

MapReduce有多种应用场景。以下是其中一些展示:

以下是MapReduce在不同行业中的应用示例:

  • 社交媒体分析:如LinkedIn和Instagram等平台使用MapReduce来分析谁访问、查看并与你的个人资料或帖子互动。
  • 娱乐推荐:Netflix使用MapReduce,根据用户过去的观看记录和兴趣来推荐电影。
  • 金融风控:银行和信用卡公司等金融机构使用它来标记和检测用户交易中的异常。
  • 广告行为分析:广告行业用它来理解用户如何与广告互动,从而了解用户行为。Google Ads通过使用MapReduce来理解用户与广告的互动情况。

总结 📝

本节课中我们一起学习了MapReduce。MapReduce是一个用于并行计算的框架,它包含两个主要任务:Map和Reduce。Map任务将数据处理成键值对,并进行排序和组织。Reducer任务则聚合并计算一组结果,产生最终输出。它对所有数据类型(如结构化和非结构化数据)都非常灵活,并且可以应用于社交媒体、娱乐等多个行业。

011:Hadoop生态系统 🏗️

在本节课中,我们将要学习Hadoop生态系统的构成。我们将了解其核心组件与扩展组件,并按照数据处理的不同阶段,认识每个阶段中常用的工具及其作用。

概述 📋

Hadoop生态系统由一系列相互支持的组件构成,用于处理大数据。除了核心组件,还包括许多扩展的库和软件包。我们可以根据数据处理的四个主要阶段来审视这个生态系统:数据摄取数据存储处理与分析以及数据访问

Hadoop核心组件 ⚙️

上一节我们介绍了Hadoop生态系统的整体框架,本节中我们来看看它的核心基础。

Hadoop的核心组件为整个生态系统提供了基础支持,主要包括:

  • Hadoop Common:指支持其他Hadoop模块的通用工具和库。
  • Hadoop分布式文件系统 (HDFS):存储从摄取阶段收集的数据,并将数据分布在多个节点上。
  • MapReduce:通过在集群中处理数据,使大数据变得易于管理。
  • YARN (Yet Another Resource Negotiator):跨集群的资源管理器。

Hadoop扩展生态系统 🧩

扩展的Hadoop生态系统由通常与Hadoop核心一起使用或安装在其之上的库或软件包组成。

数据处理阶段与工具 🛠️

Hadoop生态系统可以基于数据处理的不同阶段进行划分。每个阶段都有特定的工具负责相应的工作。

1. 数据摄取阶段

数据摄取是大数据处理的第一阶段。当你处理大数据时,会从不同来源获取数据。

以下是此阶段常用的工具:

  • Flume:一个分布式服务,用于收集、聚合和传输大数据到存储系统。Flume基于流数据流,架构简单灵活,并采用可扩展的数据模型,支持在线分析应用。
  • Sqoop:一个开源工具,设计用于在关系型数据库系统和Hadoop之间批量传输数据。Sqoop会检查关系型数据库并总结其模式,然后根据需要生成MapReduce代码来导入和导出数据。Sqoop允许你快速开发其他使用存储在HDFS中的记录的MapReduce应用程序。

2. 数据存储阶段

在数据摄取之后,需要将数据存储起来。HDFS和HBase是此阶段的关键组件。

以下是此阶段涉及的技术:

  • HDFS:作为主要的分布式存储系统。
  • HBase:一个运行在HDFS之上的面向列的非关系型数据库系统。它提供对Hadoop文件系统的实时读写访问。HBase使用哈希表在索引中存储数据,并允许随机访问数据,这使得查找速度更快。
  • Cassandra:一个可扩展的NoSQL数据库,设计为没有单点故障。

3. 处理与分析阶段

数据存储后,需要被分发到像Pig和Hive这样的MapReduce框架中进行处理和分析,处理通过并行计算完成。

以下是此阶段的主要工具:

  • Pig:用于分析大量数据。Pig是一种过程式数据流语言和过程式编程语言,它遵循一系列命令的顺序执行。
  • Hive:主要用于创建报告,并在集群的服务端运行。Hive是一种声明式编程语言,这意味着它允许用户表达他们希望接收哪些数据。

4. 数据访问阶段

最后一个阶段是数据访问,用户在此阶段可以访问经过分析和提炼的数据。

以下是此阶段的常用工具:

  • Impala:一个可扩展的系统,允许非技术用户搜索和访问Hadoop中的数据。使用Impala不需要具备熟练的编程技能。
  • Hue (Hadoop User Experience):Hue允许你上传、浏览和查询数据。你可以在Hue中运行Pig作业和工作流。Hue还为Hive和MySQL等多种查询语言提供了SQL编辑器。

总结 🎯

本节课中我们一起学习了Hadoop生态系统的四个主要阶段:摄取存储处理与分析以及访问。我们还了解了与每个阶段相关的一些工具示例,例如Flume、Sqoop、HBase、Pig、Hive、Impala和Hue,并理解了每个阶段如何与其他阶段相互作用,共同完成大数据的处理流程。

012:Hadoop分布式文件系统(HDFS)详解 🗂️

在本节课中,我们将要学习Hadoop分布式文件系统(HDFS)。HDFS是Hadoop生态系统的核心存储层,专为存储和处理海量数据而设计。我们将了解其基本概念、关键特性、架构以及数据读写的工作原理。


HDFS概述

HDFS代表Hadoop分布式文件系统。分布式文件系统是一种分布在多个文件服务器上的文件系统,它允许程序员从任何网络或计算机访问或存储文件。HDFS是Hadoop的存储层,其工作原理是将文件分割成块,然后创建这些块的副本并将它们存储在不同的机器上。HDFS旨在无缝访问流数据,这意味着它在传输数据时提供恒定的比特率,而不是以波动的方式传输数据。HDFS使用命令行界面与Hadoop交互。

HDFS的关键特性

HDFS具有多个使其适合大数据处理的关键特性。

以下是HDFS的主要特性列表:

  • 成本效益:存储数据的商用硬件价格不高,因此降低了存储成本。
  • 海量存储:HDFS可以存储高达PB级别的海量数据,支持任何格式,包括结构化和非结构化数据。
  • 数据分块:它将海量数据分割成称为“块”的小块。
  • 容错性:HDFS能够复制数据,并在某个硬件单元发生故障时,最大限度地减少与数据丢失相关的成本。如果一台计算机发生数据丢失,数据可以在另一台计算机上找到,工作可以继续进行。
  • 高可扩展性:单个集群可以扩展到数百个节点。
  • 可移植性:HDFS设计为可以轻松地从一种平台迁移到另一种平台。

HDFS核心概念

为了熟悉Hadoop,需要了解几个核心概念。当HDFS接收文件时,文件会被分解成更小的块。

数据块

是可以读取或写入的最小数据量,它提供了容错能力。根据系统配置,默认块大小可以是64MB或128MB。

例如,如果我们有一个500MB的文件,默认块大小为128MB,那么该文件将被分成三个128MB的块和一个116MB的块。只有当文件大小是默认块大小的整数倍时,才会得到大小相等的分割。因此,每个存储的文件不一定占用预配置块大小的全部存储空间。

节点

让我们从节点开始。节点是负责存储和处理数据的单个系统,可以将其视为存储数据的一台机器或计算机。

HDFS遵循主从架构概念。HDFS有两种类型的节点:

  • 主节点(NameNode):管理客户端对文件的访问,并维护、管理和向从节点分配任务。
  • 从节点(DataNode):在HDFS中可以有数百个数据节点来管理存储系统。它们根据名称节点的指令执行读写请求。

机架感知

在执行读写等操作时,名称节点通过选择离自己最近的数据节点来最大化性能,这很重要。这可以通过选择同一机架或附近机架上的数据节点来实现。这称为机架感知

一个机架是大约40到50个使用相同网络交换机的数据节点的集合。机架感知用于减少网络流量并提高集群性能。为了实现机架感知,名称节点保存机架ID信息。

复制也通过机架感知完成。它通过确保数据节点的副本位于不同的机架上来实现。这样,如果一个机架宕机,你仍然可以从另一个机架获取数据。

数据复制

HDFS以优化复制而闻名。HDFS使用机架感知概念来创建副本,以确保数据可靠可用,并合理利用网络带宽。

复制是创建数据块的副本。当发生崩溃时,复制提供了数据块的备份。复制因子定义为复制数据块的次数。根据配置,可以设置所需的副本数量。

让我们看之前的500MB文件示例。如果我们的复制因子是2,它将为每个块创建两个副本。这意味着我们将有 4个块 * 2 = 8 个文件块副本用于备份。HDFS使用机架感知概念,将块保存在不同的机架中,以确保在另一个机架上有可用的副本。例如,你可以有四个机架,每个机架存放两个副本。如果其中一个机架宕机或崩溃,你仍然可以在不同的机架上有数据块的副本,并且仍然可以使用数据。

HDFS读写操作

另一个重要概念是HDFS中读写操作的执行方式。HDFS允许“一次写入,多次读取”操作。这意味着你无法编辑已存储在HDFS中的文件,但可以向其追加新数据。

读操作流程

让我们从读操作的工作原理开始。假设我们有一个文本文件。

  1. 客户端将向主节点(即名称节点)发送请求,以获取包含数据块的数据节点的位置。
  2. 名称节点将验证客户端是否具有正确的权限,并向客户端提供位置信息。HDFS中的客户端与主节点和从节点交互,以满足用户的请求。
  3. 然后,客户端将通过FSDataInputStream对象向最近的数据节点发送请求,通过调用read方法来读取所有文件。
  4. 当客户端完成后,客户端将使用close方法结束会话。

写操作流程

接下来,我们看看写操作的工作原理。

与读操作类似,名称节点确认客户端拥有正确的权限。名称节点确保检查系统中不存在该文件。如果文件已存在,客户端将收到一个IO异常。如果文件不存在,客户端将获得写入权限以及数据节点信息。一旦客户端完成,数据节点开始创建副本并向客户端发送确认。

HDFS架构

Hadoop遵循主从节点架构概念。主节点是名称节点。该架构的特点是每个集群有一个名称节点和多个数据节点(即从节点)。

在内部,一个文件被分割成一个或多个块,这些块存储在一组数据节点中。名称节点负责监督文件的打开、关闭、重命名等操作,并将文件块映射到数据节点。数据节点负责处理客户端的读写请求,并根据名称节点的指令执行文件块的创建、复制和删除。


总结

本节课中我们一起学习了Hadoop分布式文件系统(HDFS)。我们了解到HDFS的关键优势包括其成本效益、可扩展性、数据存储扩展能力和数据复制能力。是文件的最小单位。复制创建数据块的副本用于备份目的。机架感知有助于减少网络流量并提高集群性能。HDFS支持“一次写入,多次读取”操作。

013:Hive入门 🐝

在本节课中,我们将要学习Hive。Hive是Hadoop生态系统中的一个重要数据仓库工具,它使得使用类似SQL的语言处理大规模数据成为可能。我们将了解Hive的用途、核心特性、与传统数据库的区别以及其架构组成。

什么是Hive?📊

Hive是Hadoop内部的一个数据仓库软件,设计用于读取、写入和管理大规模的表格式数据,并进行数据分析。

数据仓库存储来自许多不同来源的历史数据,以便您可以对其进行分析并提取洞察。这些洞察通常用于生成报告。

Hive具有可扩展性和快速处理能力,因为它专为处理PB级别的数据而设计。如果您熟悉SQL,那么Hive将非常易于使用,因为Hive查询语言(HiveQL)基于SQL。这使得学习曲线更平缓,因为已经熟悉关系型数据库的用户可以轻松掌握其概念。

Hive支持多种文件格式,包括:

  • SequenceFile:由二进制键值对组成的文件。
  • RCFile:行列式文件,将表中的列存储在列式数据库中。
  • 文本文件或平面文件:常见的纯文本格式。

此外,Hive允许根据用户需求执行数据清洗和过滤任务。

Hive与传统RDBMS的区别 ⚖️

上一节我们介绍了Hive的基本概念,本节中我们来看看它与传统关系型数据库管理系统(RDBMS)有何不同。

RDBMS是一种专门为关系型数据库设计的数据库管理系统。关系型数据库以结构化的格式(即由行和列组成的表)存储数据。

以下是传统RDBMS与Hive之间的主要区别:

  • 用途与查询语言

    • 传统RDBMS用于维护数据库,并使用结构化查询语言(SQL)。
    • Hive用于维护数据仓库,并使用受SQL启发的Hive查询语言(HiveQL)。
  • 数据分析类型

    • 传统RDBMS适合实时数据分析,例如处理来自传感器的数据。
    • Hive适合静态数据分析。
  • 读写操作

    • 传统RDBMS允许用户执行所需的任意多次读写操作。
    • Hive基于“一次写入,多次读取”的方法论。
  • 数据规模

    • 传统RDBMS可以处理高达TB级别的数据。
    • Hive设计用于处理PB级别的数据。
  • 数据模式

    • 传统RDBMS强制要求在加载数据之前必须验证模式(Schema)。
    • Hive在加载数据时不强制验证模式。
  • 数据分区

    • 传统RDBMS可能并不总是内置对数据分区的支持。
    • Hive支持分区。分区意味着根据特定列(如日期或城市)的值将表划分为多个部分。

Hive架构 🏗️

了解了Hive与传统数据库的区别后,现在我们来深入探讨Hive的架构。Hive架构主要包含三个部分:Hive客户端、Hive服务以及Hive存储与计算。

以下是Hive架构的组成部分:

  • Hive客户端:Hive根据应用程序类型提供不同的驱动程序进行通信。例如,对于基于Java的应用程序,Hive使用JDBC驱动程序;其他类型的应用程序则使用ODBC驱动程序。这些驱动程序与服务器通信。

  • Hive服务:客户端交互通过Hive服务完成,所有查询操作都在这里进行。

    • 命令行界面:作为Hive服务的接口。
    • 驱动程序:接收通过命令行提交的查询语句,监控每个会话的进度和生命周期,并存储查询语句生成的元数据。
    • 元存储:存储元数据,即关于每个表的数据和信息,例如位置和模式。

  • Hive存储与计算:元存储、文件系统和作业客户端进而与Hive存储和计算进行通信,以执行操作。表的元数据信息存储在某种数据库中,而查询结果以及加载到表中的数据则存储在Hadoop集群或HDFS中。

Hive核心概念详解 🔍

让我们更详细地了解架构中的各个概念。

Hive客户端中的组件包括:

  • JDBC客户端:允许基于Java的应用程序连接到Hive。
  • ODBC客户端:允许基于ODBC协议的应用程序连接到Hive。

Hive服务部分负责执行查询:

  • Hive服务器:用于运行查询,并允许多个客户端提交请求。它构建为支持JDBC和ODBC客户端。
  • 编译器:驱动程序在启动会话后,将接收到的查询语句发送给编译器。
  • 优化器:对执行计划执行转换,并拆分任务以帮助提高速度和效率。
  • 执行器:在优化器拆分任务后,执行器执行这些任务。

元存储是元数据的存储库,元数据是关于表的信息。元存储负责将这些信息集中保存在一个地方。

总结 📝

本节课中,我们一起学习了Hive。你了解到Hive是一个用于读取、写入和管理数据集的数仓软件。尽管Hive的工作方式与传统RDBMS非常相似,但它们略有不同。Hive架构的三个主要部分是Hive客户端、Hive服务以及Hive存储与计算。掌握这些基础知识,是使用Hive处理大数据的重要第一步。

014:HBase入门 🗄️

在本节课中,我们将要学习HBase。HBase是一个运行在Hadoop分布式文件系统(HDFS)之上的列式非关系型数据库管理系统。我们将了解它的定义、核心特性、与HDFS的区别以及其基本架构。

概述

HBase是一个列式非关系型数据库管理系统,它运行在Hadoop分布式文件系统(HDFS)之上。它提供了一种容错的方式来存储稀疏数据集,并能很好地处理实时数据和对大数据进行随机读写访问。

HBase的定义与特性

HBase是一个列式、非关系型的数据库管理系统。其核心特性包括:

  • 容错性:指系统或计算机在不利条件下(如服务器崩溃)仍能继续工作的能力。
  • 实时数据处理:擅长处理实时数据和提供对大数据的随机读写访问。
  • 写密集型应用:用于存储海量数据、实时处理和分析。
  • 线性可扩展:支持线性和模块化两种形式的扩展。
  • MapReduce作业支持:可作为MapReduce作业的备份支持。
  • 高性能:提供一致的读写操作,满足高速需求。
  • 灵活的模式:没有固定的列,只通过列族来定义,模式灵活可变。
  • 易用的Java API:提供了易于使用的Java API供客户端访问。
  • 跨集群数据复制:支持跨集群的数据复制。

HBase核心概念:列与列族

在HBase中,代表一个对象的属性。例如,如果表存储医院心脏监护仪的传感器数据,每一行可能是一条日志记录,一个典型的列可能包含患者详情或记录时间等信息。

HBase允许将多个属性分组到列族中,使得列族中的所有元素都存储在一起。例如,患者姓名和患者年龄可以存储在名为patient_details的列族中。因此,HBase中的列看起来会像patient_details:namepatient_details:ageheart_ratetimestamp

在HBase中创建模式时,必须预定义表模式并指定列族。但可以随时向列族中添加新列,这使得模式能够灵活适应不断变化的应用程序需求。

HBase与HDFS的区别

上一节我们介绍了HBase的核心概念,本节中我们来看看HBase与HDFS的主要区别。虽然两者都用于存储海量数据,但存在关键差异:

  • 数据组织方式
    • HBase以表格的行列形式存储数据。
    • HDFS以分布式方式将数据存储在网络的不同节点上。
  • 架构灵活性
    • HBase允许动态变更。
    • HDFS架构相对固定,不允许轻易变更。
  • 适用场景
    • HBase适用于记录级别的读、写、更新和删除工作负载。
    • HDFS更底层,类似于文件系统属性,更适合“一次写入,批量读取”的工作负载。
  • 功能
    • HBase支持大数据的存储处理。
    • HDFS主要用于存储。

HBase架构

HBase架构主要包含四个核心组件,它们协同工作,使HBase能够高效运行在HDFS之上。

以下是HBase架构的主要组成部分:

  1. HMaster:主服务器。它监控Region Server实例,将区域分配给Region Server,向不同的Region Server分发服务,并管理对模式和元数据操作所做的任何更改。
  2. Region Server:区域服务器。它们接收来自客户端的读写请求,并将请求分配给特定列族所在的区域。它们负责服务和管理分布式集群中的区域,无需始终通过HMaster。Region Server可以直接与客户端通信以处理请求。
  3. Region:区域。它是HBase集群的基本构建元素和最小单元,由列族组成。一个区域包含多个存储区(每个列族一个),并有两个组件:HFile(存储实际数据)和MemStore(内存存储区)。
  4. ZooKeeper:一个集中式服务,用于维护配置信息、在节点间保持健康的连接、为分布式应用程序提供同步,并通过触发错误消息来跟踪服务器故障和网络分区,然后开始修复故障节点。

HDFS为存储提供了分布式环境,它将每个文件存储在多个块中,并通过在Hadoop集群中复制块来保持容错性。

总结

本节课中我们一起学习了HBase。我们了解到HBase是一个运行在HDFS之上的列式非关系型数据库管理系统。HBase的列由列族定义,它具有线性可扩展、高效的特点,并提供了易于使用的Java API供客户端访问。HBase与HDFS的一个关键区别在于,相较于HDFS的固定架构,HBase允许动态变更。HBase的架构主要由HMaster、Region Server、Region、ZooKeeper和底层的HDFS组成。

015:为什么使用Apache Spark 🚀

在本节课中,我们将学习Apache Spark的核心概念、分布式计算的基础知识,以及Spark相较于传统大数据工具(如MapReduce)的优势。课程目标是帮助你理解Spark的关键特性及其在大数据处理中的重要性。

什么是Apache Spark?💡

Apache Spark是一个开源的内存应用框架,用于对海量数据进行分布式数据处理和迭代分析。

让我们来解析这个定义中的关键词:

  • 开源:Spark完全开源,由Apache基金会管理,因此得名Apache Spark。
  • 内存:这意味着所有操作主要在内存(RAM)中进行,数据处理速度极快。
  • 分布式数据处理:Spark利用多台计算机协同工作来处理数据。
  • 海量数据集:Spark能够很好地扩展以处理大规模数据。

Spark主要使用Scala语言编写,这是一种支持面向对象和函数式编程的通用编程语言。Spark运行在Java虚拟机(JVM)上。

分布式计算简介 🔗

上一节我们介绍了Spark是一个分布式处理框架,本节中我们来看看什么是分布式计算。

分布式计算,顾名思义,是指一组计算机或处理器在幕后协同工作。

人们经常将分布式计算和并行计算这两个术语互换使用,因为这两种计算类型有许多相似之处。然而,它们在内存访问方式上有所不同:通常,并行计算共享所有内存,而在分布式计算中,每个处理器访问自己的内存。

分布式计算的优势 📈

以下是分布式计算的两个主要优势:

1. 可扩展性与模块化增长
分布式系统本质上是可扩展的,因为它们跨多台机器工作,并可以水平扩展。用户可以通过添加额外的机器来处理不断增加的工作负载,而不是反复升级单个系统,其可扩展性几乎没有上限。

2. 容错性与冗余
分布式系统需要容错性和冗余,因为它们使用的独立节点可能会发生故障。分布式计算不仅提供容错性,还提供冗余以确保业务连续性。例如,一个运行着8台机器集群的业务,即使单台或多台机器离线,也能继续运行。

Apache Spark的优势 ⚡

Spark完全具备了分布式计算的所有优势。它支持大规模数据处理和分析的计算框架,并在商用硬件上提供并行分布式数据处理能力、可扩展性和容错性。

此外,Spark还提供了内存处理,并创建了一个全面的统一框架来管理大数据处理。Spark通过易于使用的Python、Scala和Java API,实现了编程的灵活性。

Spark vs. MapReduce 🔄

那么,Apache Spark与更传统的大数据工具(如MapReduce)相比如何?

传统的MapReduce作业会创建需要读写磁盘或HDFS的迭代。这些读写操作通常非常耗时且成本高昂。

Apache Spark通过将大量所需数据保存在内存中,并避免昂贵的磁盘I/O操作,解决了MapReduce遇到的读写问题,从而将整体处理时间减少了数个数量级。

Spark的应用场景 🛠️

Spark为数据工程问题和数据科学挑战都提供了大数据解决方案。

  • 数据工程:数据工程师使用Spark工具,包括核心Spark引擎、集群和执行器及其管理、SparkSQL和数据帧。
  • 数据科学与机器学习:Spark还通过Spark MLlib和流处理等库支持数据科学和机器学习。

总结 📝

本节课中我们一起学习了:

  • Apache Spark 是一个用于海量数据分布式处理和迭代分析的开源内存应用框架。
  • 分布式计算 是一组在幕后协同工作的计算机或处理器。
  • 分布式系统和Apache Spark都具有固有的可扩展性和容错性
  • Apache Spark将大部分所需数据保存在内存中,避免了昂贵且耗时的磁盘I/O操作。

016:函数式编程基础 🧮

在本节课中,我们将要学习函数式编程的基础概念,包括其定义、核心思想、与Spark的关系以及Lambda函数的作用。

什么是函数式编程? 🤔

上一节我们介绍了课程概述,本节中我们来看看函数式编程的具体定义。

函数式编程是一种遵循数学函数形式的编程范式。回想代数课中的 f(x) 表示法。这种表示法本质上是声明式的,而非命令式的。

所谓声明式,是指代码或程序的重点在于解决方案的“做什么”,而不是解决方案的“如何做”。声明式语法抽象了实现细节,只强调最终输出,即“做什么”。在函数式编程中,我们使用表达式,如前文提到的 f(x) 表达式。

函数式编程的历史与语言 🕰️

了解了基本概念后,我们来看看函数式编程的发展历程。

历史上,LISP(列表处理语言)是第一个函数式编程语言,始于20世纪50年代。但如今已有许多函数式编程语言可供选择,包括 ScalaPythonRJava。Scala 是这个编程语言家族中最新的代表。

Apache Spark 主要用 Scala 编写,它将函数视为一等公民。这意味着在 Scala 中,函数可以作为参数传递给其他函数,可以被其他函数返回,也可以像变量一样使用。

以下是一个简单的函数式程序示例,它将数字加一:

我们定义函数 f(x) = x + 1

函数式编程的优势:声明式与并行化 ⚡

我们已经看到了一个简单示例,现在来探讨函数式编程的核心优势。

我们可以将此函数应用于一个大小为4的列表,如图所示。程序会将列表中的每个元素加一。这就是使用函数式编程的优势:你可以直接将函数应用于整个列表或数组。

如果你使用命令式范式的过程代码执行相同的任务,你将构建一个 for 循环来遍历数组,并将每个元素加一。这种编程范式与前面的示例不同,它明确列出了要执行的所有步骤,包括“遍历每个元素”、“将每个元素加一”。这段代码强调的是“如何做”。

请对比这个传统的编程示例与强调解决方案“做什么”部分的函数式编程示例。

并行化是函数式编程的主要好处之一。考虑之前的例子,程序将数组元素加一。以下是一个从1到9的更大数组。

你可以将任务拆分为三个不同的计算块,这些块可以称为节点。然后并行运行这三个任务或节点。这种方法的美妙之处在于,你不需要更改任何函数定义或代码。你需要做的只是并行运行多个任务实例。

通过应用隐式并行化的函数式编程能力,你可以通过添加更多计算和资源来将算法扩展到任何规模,而无需修改程序或代码。结果与函数仅在单个节点上运行相同。然而,在这种情况下,函数并行运行了三次,且无需对函数或代码进行任何更改。

Lambda函数与Spark 🚀

函数式编程应用了一个称为 Lambda演算 的数学概念。为了简化解释,Lambda演算基本上指出,每个计算都可以表示为一个应用于数据集的匿名函数

Lambda函数(或运算符)是用于编写函数式编程代码的匿名函数。以下是使用Lambda函数和运算符以函数式编程风格编写的代码,用两种流行语言实现两个数字相加:左侧是 Scala,右侧是 Python

请注意,这两种代码在流程上如何相似,并直接抽象出结果,这是声明式编程范式的标志。

以下是代码示例:

Scala:

val add = (x: Int, y: Int) => x + y

Python:

add = lambda x, y: x + y

Apache Spark 能够通过Lambda函数在工作节点之间分配工作并进行并行化计算,从而快速处理大数据。所有以这种方式实现的Spark程序本质上都是并行的。

因此,无论你分析1千字节还是1拍字节的数据,都没有关系。只需向Spark集群添加额外的资源即可完成。

总结 📝

本节课中我们一起学习了函数式编程的基础知识。

在本视频中,你学到了:

  • 函数式编程遵循一种声明式编程模型,强调“做什么”而不是“如何做”,并使用表达式。
  • Lambda函数(或运算符)是实现函数式编程的匿名函数。
  • Spark 使用 Lambda演算 来并行化计算。
  • 所有函数式的Spark程序本质上都是并行的。

017:使用弹性分布式数据集进行并行编程 🚀

在本节课中,我们将要学习Apache Spark的核心数据结构——弹性分布式数据集(RDD),并了解如何利用RDD进行并行编程。

什么是弹性分布式数据集(RDD)?

弹性分布式数据集,简称RDD,是Spark的主要数据抽象概念。

一个RDD是一个容错的元素集合,这些元素被分区在集群的各个节点上,能够进行并行操作。此外,RDD是不可变的,这意味着一旦创建,数据集就不能被改变。

Spark应用程序的构成

每个Spark应用程序都包含一个驱动程序,该程序运行用户的主函数,并在集群上执行多个并行操作。

RDD支持的数据源

RDD支持多种文件类型和数据源,这使其非常灵活。

以下是RDD支持的主要数据源类型:

  • 文件类型:文本文件、序列文件、Avro、Parquet以及Hadoop输入格式文件。
  • 存储系统:本地文件系统、Cassandra、HBase、HDFS、Amazon S3。
  • 数据库:多种关系型数据库和NoSQL数据库。

创建RDD的三种方法

上一节我们介绍了RDD的概念和支持的数据源,本节中我们来看看如何实际创建一个RDD。

以下是创建RDD的三种主要方法:

  1. 从外部文件系统创建:可以从Hadoop支持的文件系统(如HDFS、Cassandra、HBase或Amazon S3)中的外部或本地文件创建RDD。
  2. 并行化现有集合:在驱动程序中对一个现有集合应用 parallelize 函数。驱动程序可以使用Python、Java或Scala等高级API。以下代码片段展示了如何使用Scala和Python从列表创建RDD:
    // Scala 示例
    val data = Array(1, 2, 3, 4, 5)
    val rdd = sc.parallelize(data)
    
    # Python 示例
    data = [1, 2, 3, 4, 5]
    rdd = sc.parallelize(data)
    
    为并行集合设置分区数是一个重要参数。Spark会为集群中的每个分区运行一个任务。通常,你希望为集群中的每个CPU核心设置2到4个分区。Spark会尝试根据集群自动设置分区数,但你也可以通过向 parallelize 函数传递第二个参数来手动设置。
  3. 转换现有RDD:通过对一个已有的RDD应用转换操作来创建新的RDD。

什么是并行编程?

在了解了如何创建RDD后,我们来定义并行编程。

并行编程,类似于分布式编程,是指同时使用多个计算资源来解决一个计算任务。它将任务分解为离散的部分,然后使用多个处理器并发地解决这些部分。这些处理器访问一个共享的内存池,其中内置了控制和协调机制。

RDD如何实现并行编程?

RDD的设计天然支持并行操作。

以下是一个RDD实现并行编程的示例,类似于创建RDD的过程:通过并行化一个对象数组或将数据集分割成分区来创建RDD。节点接收这些分布式分区。Spark根据RDD的创建方式,为集群的每个分区运行一个任务,从而实现对RDD的并行操作。

RDD如何提供弹性(容错性)?

RDD通过不可变性缓存机制在Spark中提供弹性。

首先,由于数据是不可变的,RDD总是可以恢复的。另一个关键的Spark能力是能够在内存中持久化缓存数据集。缓存是容错的,并且总是可恢复的,因为RDD是不可变的,并且Hadoop数据源本身也是容错的。

当你持久化一个RDD时,每个节点将其计算出的分区存储在内存中,并在对该数据的其他操作中重用这些分区。持久化允许未来的操作快得多,通常能加速10倍以上。持久化或缓存是迭代算法和快速交互式使用的关键工具。

总结

本节课中我们一起学习了弹性分布式数据集(RDD)的核心概念。

我们了解到,可以通过三种方式创建RDD:从Hadoop支持的外部文件、从现有集合、或从另一个RDD转换而来。RDD是不可变的,并且总是可恢复的。并行编程是同时使用多个计算资源来解决计算任务。RDD能够在内存中持久化或缓存数据集,这极大地加速了迭代操作。

018:Apache Spark中的数据并行扩展 🚀

在本节课中,我们将要学习Apache Spark的核心架构及其如何通过数据并行性来处理大规模数据。我们将了解Spark的主要组件,并解释其扩展机制。


Apache Spark架构概述 🏗️

Apache Spark架构由三个主要组件构成。

以下是这三个核心组件:

  1. 数据存储:数据集从数据存储加载到内存中。任何与Hadoop兼容的数据源均可接受。
  2. 高级编程API:这是第二个组件。Spark提供了Scala、Python和Java的API。
  3. 集群管理框架:这是最后一个组件,它负责处理Spark的分布式计算方面。Spark的集群管理框架可以作为独立服务器、Mesos或YARN(另一种资源协调器)存在。集群管理框架对于扩展大数据处理至关重要。

这三个部分的简单可视化关系是:来自Hadoop文件系统的数据流入计算接口或API,然后流入不同的节点以执行分布式并行任务。


Spark核心引擎 ⚙️

上一节我们介绍了Spark的整体架构,本节中我们来看看其核心引擎。

通常所说的“Spark”指的是其基础引擎,正式名称为Spark Core。具备容错能力的Spark Core是进行大规模并行和分布式数据处理的基础引擎。

Spark Core负责管理内存和任务调度。它还包含了用于定义RDD(弹性分布式数据集)和其他数据类型的API。此外,Spark Core将元素的分布式集合在集群中进行并行化处理。


Spark应用架构与扩展机制 📈

为了理解Spark如何随大数据扩展,让我们回顾一下Spark应用架构。

Spark应用由驱动程序执行器程序组成。执行器程序运行在工作节点上。如果工作节点有足够的内存和核心可用,Spark可以在其上启动额外的执行器进程。同样,执行器也可以占用多个核心以进行多线程计算。

Spark将RDD分布在各个执行器之间。驱动程序和执行器之间会进行通信。驱动程序包含应用程序需要运行的Spark作业,并将作业拆分为任务提交给执行器。当执行器完成任务后,驱动程序接收任务结果。

我们可以用一个比喻来理解:如果将Apache Spark比作一个大公司,那么驱动程序代码就像是公司的管理层,负责决策工作分配、资源获取等。初级员工就是执行器,他们使用提供的资源完成分配给他们的工作。而工作节点则对应员工所在的实体办公场所。

您可以通过增加额外的工作节点来逐步扩展大数据处理能力。


总结 📝

本节课中我们一起学习了Apache Spark的架构和扩展原理。

总结要点如下:

  • Apache Spark架构由三个主要部分组成:数据计算输入管理
  • 具备容错能力的Spark Core基础引擎执行大规模并行和分布式数据处理,管理内存,调度任务,并包含定义RDD的API。
  • Spark驱动程序与集群通信,并将RDD分布到各个工作节点上。

019:DataFrame与SparkSQL 🚀

在本节课中,我们将要学习SparkSQL和DataFrame的核心概念。我们将了解它们是什么、如何工作以及它们带来的优势。通过本教程,你将能够定义SparkSQL和DataFrame,理解查询的组成部分,并解释为何在数据处理中它们如此重要。

概述:什么是SparkSQL? 🧠

SparkSQL是Spark中用于结构化数据处理的模块。

你可以通过SQL查询和DataFrame API与SparkSQL进行交互。SparkSQL支持Java、Scala、Python和R等多种编程语言的API。重要的是,SparkSQL使用相同的执行引擎来计算结果,无论你使用哪种API或语言进行计算。这使得开发者可以选择最自然的方式来表达特定的数据转换操作。

以下是一个使用Python的SparkSQL查询示例:

# 假设`people`已被注册为一个表视图
spark.sql("SELECT * FROM people")

在这个例子中,SELECT * FROM people就是通过SparkSQL运行的SQL查询语句。

SparkSQL的优化特性 ⚙️

与基础的Spark RDD API不同,SparkSQL包含了基于成本的优化器列式存储代码生成等技术。这些优化为Spark提供了关于数据结构计算过程的额外信息,从而能够执行更高效的优化。

深入理解DataFrame 📊

那么,什么是DataFrame呢?

一个DataFrame是一个被组织成命名列的数据集合。在概念上,DataFrame等同于关系型数据库中的一张表,也类似于R或Python中的DataFrame,但Spark的DataFrame拥有更丰富的优化功能。

DataFrame构建在SparkSQL的RDD API之上,它利用RDD来执行关系型查询。

以下是一个简单的Python代码片段,演示了如何从JSON文件读取数据并创建一个DataFrame:

# 从JSON文件创建DataFrame
df = spark.read.json("path/to/people.json")
# 将DataFrame注册为一个临时视图,以便使用SQL查询
df.createOrReplaceTempView("people")

DataFrame的优势 🌟

DataFrame提供了许多显著的优势:

  • 高度可扩展性:其处理能力可以从单台笔记本电脑上的几千字节,扩展到大型机器集群上的数PB数据。
  • 广泛的数据格式支持:支持多种数据格式和存储系统。
  • 强大的优化能力:通过Catalyst优化器提供查询优化和代码生成功能。
  • 开发者友好:通过Spark与大多数大数据工具集成,并为Python、Java、Scala和R提供了API。

实践:多种查询方式 🔄

DataFrame的灵活性体现在它支持多种查询方式。以下代码片段展示了如何运行相同的SQL查询并获得结果,目标都是显示DataFrame中的name列。

第一种是传统的SQL查询方式:

spark.sql("SELECT name FROM people").show()

而接下来的两个例子则使用了DataFrame的Python API来完成相同的任务:

# 使用DataFrame API的select方法
df.select("name").show()
# 使用DataFrame API的col方法(更面向对象)
from pyspark.sql.functions import col
df.select(col("name")).show()

这三种方式最终达到的效果是完全一致的。

同样地,要查询DataFrame中年龄大于21岁的人员,也有不同的方法。

第一种是SQL查询:

spark.sql("SELECT * FROM people WHERE age > 21").show()

第二种是使用DataFrame API:

df.filter(df.age > 21).show()

这两种方法都能有效地筛选出符合条件的数据。

总结 📝

本节课中,我们一起学习了SparkSQL和DataFrame。

我们了解到,SparkSQL是Spark中用于结构化数据处理的模块,它提供了一个名为DataFrame的编程抽象,并且本身也可以作为一个分布式SQL查询引擎。

DataFrame在概念上等同于关系型数据库中的表,或R/Python中的DataFrame,但得益于Spark的架构,它具备了更强大的优化能力。

掌握SparkSQL和DataFrame,是高效进行大规模结构化数据处理的关键一步。

posted @ 2026-03-26 08:50  布客飞龙II  阅读(0)  评论(0)    收藏  举报