热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

深入理解Spark——准备篇

跟踪源码spark-shell-spark-submit-spark-classspark-shellspark-submitspark-classSparkSubmit-r
跟踪源码

spark-shell -> spark-submit -> spark-class

《深入理解Spark——准备篇》 spark-shell
《深入理解Spark——准备篇》 spark-submit
《深入理解Spark——准备篇》 spark-class

SparkSubmit -> repl.Main -> ILoop ( SparkILoop ).process -> loadFiles ( initializeSpark ( createSparkSession ) ) -> printWelcome

《深入理解Spark——准备篇》 repl.Main
《深入理解Spark——准备篇》 ILoop.process
《深入理解Spark——准备篇》 SparkILoop.loadFiles
《深入理解Spark——准备篇》 SparkILoop.initializeSpark

Spark设计理念与基本架构

Hadoop MRv1

《深入理解Spark——准备篇》 MRv1 示意图

组成部分

1.运行环境:JobTracker 和 TaskTracker

2.编程模型:MapReduce

3.数据处理引擎:Map Task 和 Reduce Task

缺点

1.JobTracker 既负责 资源管理 又负责 任务调度,容易成为瓶颈。

2.单 Master,容易down。

3.TaskTracker 采用 slot 等量划分本节点上的资源量( CPU、内存 )。slot 分为 Map slot 和 Reduce slot , MapTask 只能用 Map slot,ReduceTask 只能用 Reduce slot。有时会 MapTask 较多时,而 Reduce Task 还没有被调度,这时 Reduce slot 会被闲置。

Hadoop MRv2

《深入理解Spark——准备篇》 MRv2 示意图

改进

1.JobTracker被拆分成了通用的资源调度平台(ResourceManager RM)和负责各个计算框架的任务调度模块(ApplicationMaster AM)。

2.MRv2 中核心不再是 MapReduce,而是Yarn,MapReduce 框架时可插拔的,可以用 Spark、Storm 替代。

缺点

对HDFS的频繁操作(包括计算结果持久化、数据备份以及 shuffle )导致磁盘 I/O 成为系统性能的瓶颈。只适合离线的数据处理,不具备实时处理的能力。

Spark

基本概念

RDD:弹性分布式数据集

Task:具体执行的任务。分为 ShuffleMapTask 和 ResultTask两种,两者分别对应与 Hadoop 中的 Map 和 Reduce。

Job:用户提交的作业。

Stage:Job分成的阶段。根据依赖划分 Stage 。

Partition:数据分区。一个RDD数据可以被划分成多个 Partition。

NarrowDependency:窄依赖,即子 RDD 依赖于 RDD 中固定的 Partition。分为OneToOneDependency 和 RangeDependency 两种。

ShuffleDependency:shuffle依赖,宽依赖。子 RDD 对父 RDD 中的所有 Partition 都有依赖。

DAG:有向无环图。反映各 RDD 之间的依赖关系。

核心功能

SparkContext

Driver Application 的执行与输出都是通过 SparkContext 来完成的。

①内置的 DAGScheduler 负责创建 Job,将 DAG 中的 RDD 划分到不同的 Stage,提交 Stage 等功能。

②内置的 TaskScheduler 负责资源的申请、任务的提交以及请求集群对任务的调度等工作。

存储体系

优先考虑使用各个节点的内存作为存储。Spark 还提供了以内存为中心的高容错的分布式文件系统 Tachyon 供用户进行选择。Tachyon 能够为 Spark 提供可靠的内存级的文件共享服务。

计算引擎

由 SparkContext 中的 DAGScheduler、RDD以及具体节点上的 Executor 负责执行的 Map 和 Reduce 任务组成。DAGScheduler 和 RDD 虽然位于 SparkContext 内部,但是在任务正式提交与执行之前会将 Job 中的 RDD 组成DAG,决定了执行阶段任务的数量、迭代计算、shuffle 等过程。

部署模式

SparkContext 的 TaskScheduler 组件中提供了对 Standalone 部署模式的实现和 Yarn、Mesos 等分布式资源管理系统的支持。除此之外,还提供了 Local 模式便于开发和调试。

编程模型

《深入理解Spark——准备篇》 代码执行过程

1.使用 SparkContext 提供的API 编写 Driver application程序。

2.使用 SparkContext 提交用户编写的 Driver application程序。具体:

①使用 BlockManager 和 BroadcastManager 将任务的 Hadoop 配置进行广播。

② DAGSchduler 将任务转换为 RDD 并组织成 DAG,DAG还将被划分为不同的Stage。

③ TaskSchduler 通过

ActorSystem
将任务提交给集群管理器(Cluster Manager)。

3.集群管理器(Cluster Manager)给任务分配资源,即将具体任务分配到 Worker上,Worker 创建 Executor 来处理任务的运行。Standalone、YARN、Mesos、EC2 等都可以作为 Spark 的集群管理器。

RDD计算模型

每个分区的数据只会在一个Task中计算。

基本架构

《深入理解Spark——准备篇》 Spark 基本架构

1.Cluster Manager

Spark 的集群管理器,主要负责资源的分配与管理。集群管理器分配的资源属于一级分配,它将各个 Worker 上的内存、CPU 等资源分配给应用程序(Driver application),但是并不负责对 Executor 的资源分配。Standalone、YARN、Mesos、EC2 等都可以作为 Spark 的集群管理器。

2.Worker

Spark的工作节点。其获得由集群资源(Cluster Manager)分配的资源,负责创建 Executor,将资源和任务进一步分配给 Executor,同步资源信息给 Cluster Manager。

3.Executor

执行计算任务的单元(

线程 or 进程?
),主要负责任务的执行以及与 Worker、Driver App的信息同步。

4.Driver App

客户端应用程序。用于将任务程序转换为 RDD 和 DAG,并与 Cluster Manager 进行通信与调度。


推荐阅读
  • 在Cisco IOS XR系统中,存在提供服务的服务器和使用这些服务的客户端。本文深入探讨了进程与线程状态转换机制,分析了其在系统性能优化中的关键作用,并提出了改进措施,以提高系统的响应速度和资源利用率。通过详细研究状态转换的各个环节,本文为开发人员和系统管理员提供了实用的指导,旨在提升整体系统效率和稳定性。 ... [详细]
  • IOS Run loop详解
    为什么80%的码农都做不了架构师?转自http:blog.csdn.netztp800201articledetails9240913感谢作者分享Objecti ... [详细]
  • MySQL 5.7 学习指南:SQLyog 中的主键、列属性和数据类型
    本文介绍了 MySQL 5.7 中主键(Primary Key)和自增(Auto-Increment)的概念,以及如何在 SQLyog 中设置这些属性。同时,还探讨了数据类型的分类和选择,以及列属性的设置方法。 ... [详细]
  • 开机自启动的几种方式
    0x01快速自启动目录快速启动目录自启动方式源于Windows中的一个目录,这个目录一般叫启动或者Startup。位于该目录下的PE文件会在开机后进行自启动 ... [详细]
  • 在《Cocos2d-x学习笔记:基础概念解析与内存管理机制深入探讨》中,详细介绍了Cocos2d-x的基础概念,并深入分析了其内存管理机制。特别是针对Boost库引入的智能指针管理方法进行了详细的讲解,例如在处理鱼的运动过程中,可以通过编写自定义函数来动态计算角度变化,利用CallFunc回调机制实现高效的游戏逻辑控制。此外,文章还探讨了如何通过智能指针优化资源管理和避免内存泄漏,为开发者提供了实用的编程技巧和最佳实践。 ... [详细]
  • Python错误重试让多少开发者头疼?高效解决方案出炉
    ### 优化后的摘要在处理 Python 开发中的错误重试问题时,许多开发者常常感到困扰。为了应对这一挑战,`tenacity` 库提供了一种高效的解决方案。首先,通过 `pip install tenacity` 安装该库。使用时,可以通过简单的规则配置重试策略。例如,可以设置多个重试条件,使用 `|`(或)和 `&`(与)操作符组合不同的参数,从而实现灵活的错误重试机制。此外,`tenacity` 还支持自定义等待时间、重试次数和异常处理,为开发者提供了强大的工具来提高代码的健壮性和可靠性。 ... [详细]
  • Python多线程编程技巧与实战应用详解 ... [详细]
  • Python 伦理黑客技术:深入探讨后门攻击(第三部分)
    在《Python 伦理黑客技术:深入探讨后门攻击(第三部分)》中,作者详细分析了后门攻击中的Socket问题。由于TCP协议基于流,难以确定消息批次的结束点,这给后门攻击的实现带来了挑战。为了解决这一问题,文章提出了一系列有效的技术方案,包括使用特定的分隔符和长度前缀,以确保数据包的准确传输和解析。这些方法不仅提高了攻击的隐蔽性和可靠性,还为安全研究人员提供了宝贵的参考。 ... [详细]
  • C++ 异步编程中获取线程执行结果的方法与技巧及其在前端开发中的应用探讨
    本文探讨了C++异步编程中获取线程执行结果的方法与技巧,并深入分析了这些技术在前端开发中的应用。通过对比不同的异步编程模型,本文详细介绍了如何高效地处理多线程任务,确保程序的稳定性和性能。同时,文章还结合实际案例,展示了这些方法在前端异步编程中的具体实现和优化策略。 ... [详细]
  • Web开发框架概览:Java与JavaScript技术及框架综述
    Web开发涉及服务器端和客户端的协同工作。在服务器端,Java是一种优秀的编程语言,适用于构建各种功能模块,如通过Servlet实现特定服务。客户端则主要依赖HTML进行内容展示,同时借助JavaScript增强交互性和动态效果。此外,现代Web开发还广泛使用各种框架和库,如Spring Boot、React和Vue.js,以提高开发效率和应用性能。 ... [详细]
  • 本文介绍了如何利用 Delphi 中的 IdTCPServer 和 IdTCPClient 控件实现高效的文件传输。这些控件在默认情况下采用阻塞模式,并且服务器端已经集成了多线程处理,能够支持任意大小的文件传输,无需担心数据包大小的限制。与传统的 ClientSocket 相比,Indy 控件提供了更为简洁和可靠的解决方案,特别适用于开发高性能的网络文件传输应用程序。 ... [详细]
  • 在开发过程中,我最初也依赖于功能全面但操作繁琐的集成开发环境(IDE),如Borland Delphi 和 Microsoft Visual Studio。然而,随着对高效开发的追求,我逐渐转向了更加轻量级和灵活的工具组合。通过 CLIfe,我构建了一个高度定制化的开发环境,不仅提高了代码编写效率,还简化了项目管理流程。这一配置结合了多种强大的命令行工具和插件,使我在日常开发中能够更加得心应手。 ... [详细]
  • 如何高效启动大数据应用之旅?
    在前一篇文章中,我探讨了大数据的定义及其与数据挖掘的区别。本文将重点介绍如何高效启动大数据应用项目,涵盖关键步骤和最佳实践,帮助读者快速踏上大数据之旅。 ... [详细]
  • 本文总结了一些开发中常见的问题及其解决方案,包括特性过滤器的使用、NuGet程序集版本冲突、线程存储、溢出检查、ThreadPool的最大线程数设置、Redis使用中的问题以及Task.Result和Task.GetAwaiter().GetResult()的区别。 ... [详细]
  • 为了确保iOS应用能够安全地访问网站数据,本文介绍了如何在Nginx服务器上轻松配置CertBot以实现SSL证书的自动化管理。通过这一过程,可以确保应用始终使用HTTPS协议,从而提升数据传输的安全性和可靠性。文章详细阐述了配置步骤和常见问题的解决方法,帮助读者快速上手并成功部署SSL证书。 ... [详细]
author-avatar
英英2502927137
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有