Spark 简介与基本概念

目标

阅读完本文,你讲对 Hadoop,Spark 有个简单认识,并学习到 Spark 中的一些基础概念。

背景

因为业务需求,工程方需要将大量的 hive 数据导入缓存集群中,由于数据量比较大,MapReduce 计算模型已经不能满足我们的需求,于是决定使用 Spark 代替 MapReduce对数据进行处理。

但是在使用的过程中发现,功能是实现了,但是1亿的数据量要导2~3个小时,那还搞个线啊。根本原因还是对 Spark 的运行原理理解不深入,只停留在了表层使用,要对 Spark 进行 性能优化那是必须的,于是就有了今天的这篇入门文章。

讲一下,Hadoop

在早期的 Hadoop 中采用的是 MRv1版本的 MapReduce 编程模型。MRv1包括三个部分内容:

1. 运行时环境(JobTracker 和 TaskTracker)

2. 编程模型(MapReduce)

3. 数据处理引擎(Map 任务和 Reduce 任务)

MRv1的简单示意图如下:

MRv1简单示意图

具体一点就是(画图不易):

 MRv1框架结构

从上图中可以看出 MRv1的流程与设计思路:

1. 首先用户程序 (JobClient) 提交了一个 job,job 的信息会发送到 Job Tracker 中,Job Tracker 是 Map-reduce 框架的中心,他需要与集群中的机器定时通信 (heartbeat), 需要管理哪些程序应该跑在哪些机器上,需要管理所有 job 失败、重启等操作。

2. TaskTracker 是 Map-reduce 集群中每台机器都有的一个部分,他做的事情主要是监视自己所在机器的资源情况。

3. TaskTracker 同时监视当前机器的 tasks 运行状况。TaskTracker 需要把这些信息通过 heartbeat 发送给 JobTracker,JobTracker 会搜集这些信息以给新提交的 job 分配运行在哪些机器上。上图虚线箭头就是表示消息的发送 - 接收的过程。

MRv1 存在一些不足

1. 可扩展性差,JobTracker 职责过重,它即负责资源管理有负责任务调度,当集群繁忙时,JobTracker 可能成为系统瓶颈,也增加了 JobTracker fail 的风险,业界普遍总结出 MRv1只能支持4000节点主机的上线。

2. 可用性差,JobTracker 是 Map-reduce 的集中处理点,存在单点故障。

3. 在 TaskTracker 端,以 map/reduce task 的数目作为资源的表示过于简单,没有考虑到 cpu/ 内存的占用情况,如果两个大内存消耗的 task 被调度到了一块,很容易出现 OOM。

4. 资源利用率低,TaskTracker 使用 slot 等量划分节点上的资源量。啥意思,假设资源量总数的 slot 数为 n,task 必须获取到 slot 后才能有机会运行,如果某些 task 没有充分利用 slot,然而其他需要大量计算资源的 task 也无法获取这些空闲的资源。同时 slot 还分为 Map Slot 和 Reduce Slot 两种,作业刚启动的时候大部分的应该是 MapTask,此时 Reduce Task 都还没有调度,Reduce Slot 的资源就闲置了。

5. 不能支持多种 MapReduce 框架,无法通过可插拔方式将自身的 MapReduce 框架替换为其他实现,比如 Spark、Strom等。

技术在进步,分布式系统也在不断的变化,MRv1的框架已经不符合当前的要求了,从 0.23.0 版本开始,Hadoop 的 MapReduce 框架完全重构,发生了根本的变化。新的 Hadoop MapReduce 框架命名为 MRv2 或者叫 Yarn,Yarn 的架构图如下:

Yarn 架构

MRv2重用了 MRv1中的编程模型和数据处理引擎。但是运行时环境被重构了,JobTracker 被拆分成通用的资源调度平台ResourceManager(简称 RM),节点管理器NodeManager 和负责各个计算框架的任务调度模型 ApplicationMaster(简称 AM)。

ResourceManager 负责对整个集群的资源管理,但是在任务资源的调度方面只负责将资源封装成 Container 分配给 ApplicationMaster 的一级调度,二级调度的细节将交给 ApplicationMaster 去完成,这大大减轻了 ResourceManager 的压力。

NodeManager 负责对单个节点的资源管理,并将资源信息、Container 运行状态、健康状况等信息上报给 ResourceManager。ResourceManager 为了保证 Container 的利用率,会监控 Container,如果 Container 未在有限的时间内使用,ResourceManager 将命令 NodeManager “杀死”Container,以便将资源分配给其他任务。

Spark

前面说了这么多 hadoop,终于到 Spark 了。

Spark 特点

Spark 看到了 MRv1的问题,对 MapReduce 做了大量优化,总结如下:

1. 减少磁盘 I/O: MapReduce 会将计算中间结果存储到 HDFS 上,后续计算再从 HDFS 上读取数据计算,这样势必造成磁盘 I/O 成为瓶颈。Spark 将内容存储在内存中,减少了磁盘I/O,但是确增加了对内存的大量需求。

2. 增加并行度: Spark 任务划分为不同的 stage,允许多个 stage 即可以串行执行,又可以并行执行。

3. 避免重新计算: 当 stage 中某个分区的 Task 执行失败后,会重新对此 stage调度,但在重新杜调度的时候回过滤已经执行成功的分区任务,避免重复计算和资源浪费。

4. 可选的 Shuffle 排序: Hadoop MapReduce 在 Shuffle 之前有着固定的排序操作,而 Spark 则可以根据不同场景选择在 map 端排序还是 reduce 端排序。

5. 灵活的内存管理策略: Spark 将内存分为堆上的存储内存、堆外的存储内存、堆上的执行内存、堆外的执行内存4个部分。执行内存与存储内存并不是有明显的边界,而是"软"边界,执行内存和存储内存的任意一方在资源不足时都可以借用另一方的内存。

6. 其他特点: 检查点支持、易于使用、支持交互、支持 SQL、支持流式计算、可用性高、丰富的数据源支持和丰富的文件格式支持。

Spark 基础概念

1. RDD(resillient distributed dataset): 弹性分布式数据集。通过 Spark 的 转换 API 可以将 RDD 封装成一系列具有血缘关系的 RDD,也就是 DAG。只有通过 Spark 的 动作 API 才会将 RDD 及其 DAG 提交到 DAGScheduler。RDD 的祖先一定是一个跟数据源相关的 RDD,负责从数据源迭代读取数据。

2. DAG(Directed Acycle Graph): 有向无环图。Spark 使用 DAG 来反映各 RDD 之间的依赖或血缘关系。

3. Partition: 数据分区,即一个 RDD 的数据可以划分为多少个分区。Spark 根据 Partition 的数量来确定 Task 的数量。

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

5. ShuffleDependency: Shuffle 依赖,也称为宽依赖,即子 RDD 对父 RDD 中的所有 Patition 都可能产生依赖。子 RDD 对父 RDD 各个 Partition 的依赖将取决于分区计算器(Partitioner)的算法。

6. Job: 用户提交的作业。当 RDD 及其 DAG 被提交给 DAGScheduler 调度后,DAGScheduler 会将所有 RDD 中的转换及动作视为一个 Job。一个 Job 有一个到多个 Task 组成。

7. Stage: Job 的执行阶段。DAGScheduler 按照ShuffleDependency 作为 Stage 的划分节点对 RDD的 DAG 进行 Stage 划分(上游的 Stage 将为 ShuffleMapStage)。因此一个 Job 可能被划分为一到多个 Stage。Stage 分为 ShuffleMapStage 和 ResultStage 两种。

8. Task: 具体执行任务。一个 Job 在每个 Stage 内都会按照 RDD 的 Partition 数量,创建多个 Task。Task 分为 ShuffleMapTask 和 ResultTask 两种。ShuffleMapStage中的 Task 为 ShuffleMapTask,而 ResultStage 中的 Task 为 ResultTask。ShuffleMapTask 和 ReduceTask 类似于 Hadoop 中的 Map 任务和 Reduce 任务。

9. Shuffle: Shuffle 是所有MapReduce 计算框架的核心执行阶段,Shuffle 用于打通 Map 任务(在 Spark 中就是 ShuffleMapTask)的输出与 reduce 任务(在 Spark 中就是 ResultTask)的输入,map 任务的中间结果按照指定的分区策略(例如:按照 key 哈希)分配给处理某个分区的 reduce 任务。

这么多概念,搞不懂,没图你说个 JB 啊,大家结合一下

RDD 计算模型


DAG 调度
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,117评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,328评论 1 293
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,839评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,007评论 0 206
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,384评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,629评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,880评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,593评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,313评论 1 243
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,575评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,066评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,392评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,052评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,082评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,844评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,662评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,575评论 2 270

推荐阅读更多精彩内容