spark实践

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Spark最佳实践
--云化报表
-
2017/6/6
01
为什么选spark 数据从哪里来 数据到哪里去 应用可视化 漫漫调优路 MLlib &GRAPHX
CONTENTS
02 03 04 05
目录
06
01
SPARK
为什么选spark
Apache Spark 是专为大规模数据处理而设计的快速通用的计算引擎
Driver 运行在 Worker
执行流程描述:
Driver 运行在 Client
1. .客户端启动后直接运行用户程序,启动Driver 2. Driver进程生成一系列task 3. Driver向Master申请资源 4. Master让调度的Worker启动Exeuctor 5. Exeuctor启动后向Driver注册。 6. Driver将task调度到Exeuctor执行。 7. Executor执行结果写入文件或返回Driver
宽依赖是指父RDD的每个分区都可能被多个 子RDD分区所使用,子RDD分区通常对应所 有的父RDD分区(O(n),与数据规模有关)
01
1.
为什么选spark_运行基本流程
DAG
如果一个有向图无法从任意顶点出发经 过若干条边回到该点,则这个图是一个 有向无环图(DAG图)
Spark运行基本流程
构建Spark Application的运行环境 (启动SparkContext), SparkContext向资源管理器(可以 是Standalone、Mesos或YARN)注 册并申请运行Executor资源; 2. 资源管理器分配Executor资源并启 动StandaloneExecutorBackend, Executor运行情况将随着心跳发送 到资源管理器上; SparkContext构建成DAG图,将 DAG图分解成Stage,并把Taskset 发送给Task Scheduler。Executor向 SparkContext申请Task,Task Scheduler将Task发放给Executor运 行同时SparkContext将应用程序代 码发放给Executor。 Task在Executor上运行,运行完毕 释放所有资源。
01
RDD
为什么选spark_RDD介绍
create
创建
transforma ntion
转换
action
动作
是一个容错的、并行的数据 结构,可以让用户显式地将 数据存储到磁盘和内存中, 并能控制数据的分区的只读 数据结构
• • •
集合转换 • 从文件系统输入 从父RDD转换
得到一个新的 RDD

得到一个值,或 者一个结果
内存列存储
SparkSQL的表数据在内存中存 储不是采用原生态的JVM对象 存储方式,而是采用内存列存 储
1.SQL语句经过SqlParse解析成UnresolvedLogicalPlan; 2.使用analyzer结合数据数据字典(catalog)进行绑定, 生成resolvedLogicalPlan; 3.使用optimizer对resolvedLogicalPlan进行优化,生成 optimizedLogicalPlan; 4.使用SparkPlan将LogicalPlan转换成PhysicalPlan; 5.使用prepareForExecution()将PhysicalPlan转换成可执行 物理计划; 6.使用execute()执行可执行物理计划; 7.生成SchemaRDD
英文名:Resilient Distributed Dataset 中文名:弹性分布式数据集
作用于RDD上的Operation分为转换(transformantion)和动作(action)。 Spark中的所有“转换”都是惰性的,在执行“转换”操作,并不会提 交Job,只有在执行“动作”操作,所有operation才会被提交到cluster中 真正的被执行。这样可以大大提升系统的性能。
宽依赖
窄依赖是指父RDD的每个分区只被子RDD的 一个分区所使用,子RDD分区通常对应常数 个父RDD分区(O(1),与数据规模无关)
窄依赖
相比于宽依赖,窄依赖对优化很有利
窄依赖允许在一个集群节点上以流水线的方式(pipeline)计算 所有父分区。例如,逐个元素地执行map、然后filter操作;而宽 依赖则需要首先计算好所有父分区数据,然后在节点之间进行 Shuffle。 窄依赖能够更有效地进行失效节点的恢复,即只需重新计算丢 失RDD分区的父分区,而且不同节点之间可以并行计算;而对 于一个宽依赖关系的Lineage图,单个节点失效可能导致这个 RDD的所有祖先丢失部分分区,因而需要整体重新计算。
stage
3.
TaskScheduler
实现将Spark作业分解成一到多个Stage, 每个Stage根据RDD的Partition个数决定 Task的个数,然后生成相应的Task set放 到TaskScheduler中
DAGScheduler
每个Job会被拆分很多组Task,每组任务 被称为Stage,也可称TaskSet,一个作业 分为多个阶段 spark划分stage的整体思路是:从后往前 推,遇到宽依赖就断开,划分为一个 stage;遇到窄依赖就将这个RDD加入该 stage中
Master和Worker是standalone的角色,Driver和Executor是Spark的角色。 Master负责分配资源,分配Driver和Executor,让Worker启动driver和
executor,只管理到executor层,不涉及任务 Driver负责生成task,并与executor通信,进行任务的调度和结果跟踪, 不涉及资源
Spark也会自动持久化一些shuffle操作(如reduceByKey)中的中间数据, 即使用户没有调用persist方法。这样的好处是避免了在shuffle出错情况 下,需要重复计算整个输入。如果用户计划重用计算过程中产生的 RDD,我们仍然推荐用户调用persist方法
01
为什么选spark_RDD依赖
03
ห้องสมุดไป่ตู้
数据到哪里去_SparkSql性能
Scala代码优化
SparkSQL在使用Scala编写代码的时 候,尽量避免低效的、容易GC的 代码;尽管增加了编写代码的难度, 但对于用户来说,还是使用统一的 接口,没受到使用上的困难
字节码生成技术
SELECT a + b FROM table val a: Int = inputRow.getInt(0) val b: Int = inputRow.getInt(1) val result: Int = a + b resultRow.setInt(0, result)
02
数据从哪里来
Spark Streaming
SparkStreaming是一个对实时数据流进行高通量、容错处理的流式处理系统, 可以对多种数据源(如Kdfka、Flume、Twitter、Zero和TCP 套接字)进行类 似Map、Reduce和Join等复杂操作,并将结果保存到外部文件系统、数据库 或应用到实时仪表盘
01 02
01
为什么选spark
A 运行速度快
官方提供的数据表明,如果数据由磁盘读取,速度是Hadoop MapReduce的10倍以上,如果数据从内存中读取,速度可以高达 100多倍
B
C D
易用性好
Spark不仅支持Scala编写应用程序,而且支持Java和Python等语言 进行编写,特别是Scala是一种高效、可拓展的语言,能够用简洁 的代码处理较为复杂的处理工作
4.
实现Task分配到Executor上执行
01
为什么选spark_STANDALONE
执行流程描述:
1.客户端把作业发布到Master 2.Master让一个Worker启动Driver,并将作业推送给Driver 3. Driver进程生成一系列task 4.Driver向Master申请资源 5.Master让调度的Worker启动Exeuctor 6. Exeuctor启动后向Driver注册。 7.Driver将task调度到Exeuctor执行。 8. Executor执行结果写入文件或返回Driver
定义 内存 scala
Spark是UC Berkeley AMP lab (加州大学伯克利分校的AMP实验室)所开源的类Hadoop MapReduce的通用并行框 架,Spark,拥有Hadoop MapReduce所具有的优点;但不同于MapReduce的是Job中间输出结果可以保存在内存 中,从而不再需要读写HDFS,因此Spark能更好地适用于数据挖掘与机器学习等需要迭代的MapReduce的算 法 Spark 启用了内存分布数据集,除了能够提供交互式查询外,它还可以优化迭代工作负载,Spark 在某些工作 负载方面表现得更加优越
优点
Spark框架的高效和低延迟保证了Spark Streaming操作的 准实时性。 利用Spark框架提供的丰富API和高灵活性,可以精简 地写出较为复杂的算法。 编程模型的高度一致使得上手Spark Streaming相当容易, 同时也可以保证业务逻辑在实时处理和批处理上的复 用
03
数据到哪里去_SparkSql
MEMORY_ONLY
groupByKey 使用mapPartitions替代普通map 使用foreachPartitions替代foreach 使用filter之后进行coalesce操作 。。。
MEMORY_AND_DISK
MEMORY_ONLY_SER
和MEMORY_ONLY_SER类似,但不是在每 MEMORY_AND_DISK_SER 次需要时重复计算这些不适合存储到内存中 的分区,而是将这些分区存储到磁盘中。 DISK_ONLY MEMORY_ONLY_2, MEMORY_AND_DISK_2, etc. OFF_HEAP (experimental) 仅仅将RDD分区存储到磁盘中 和上面的存储级别类似,但是复制每个分区 到集群的两个节点上面 以序列化的格式存储RDD到Tachyon中。相 对于MEMORY_ONLY_SER,OFF_HEAP减 少了垃圾回收的花费,允许更小的执行者共 享内存池。
03
数据到哪里去_dataframe
Spark 是在 Scala语言中实现的,它将 Scala 用作其应用程序框架。与 Hadoop 不同,Spark 和 Scala 能够紧密集 成,其中的 Scala 可以像操作本地集合对象一样轻松地操作分布式数据集
01
为什么选spark
Run programs up to 100x faster than Hadoop MapReduce in memory, or 10x faster on disk
通用性强
Spark生态圈即BDAS(伯克利数据分析栈)包含了Spark Core、 Spark SQL、Spark Streaming、MLLib和GraphX等组件,能够无缝的 集成并提供一站式解决平台。
随处运行
Spark具有很强的适应性,能够读取HDFS、Cassandra、HBase、S3 和Techyon为持久层读写原生数据,能够以Mesos、YARN和自身 携带的Standalone作为资源管理器调度job,来完成Spark应用程序 的计算
02
数据从哪里来
Spark Streaming+Kafka
将Spark Streaming集群与Kafka集群对接, Spark Streaming从Kafka集群中获取流量 日志并进行处理。Spark Streaming会实 时地从Kafka集群中获取数据并将其存 储在内部的可用内存空间中。当每一个 batch窗口到来时,便对这些数据进行 处理
01
为什么选spark_RDD操作
Storage Level Meaning
将RDD作为非序列化的Java对象存储在jvm 中。这是系统默认的存储级别。 将RDD作为非序列化的Java对象存储在jvm 中。 将RDD作为序列化的Java对象存储(每个分 区一个byte数组)
使用高性能的算子
使用reduceByKey/ combineByKey替代
相关文档
最新文档