Spark——为数据分析处理提供更为灵活的赋能
本文来自网易云社区
作者:王佳楠
一、概述
现如今在大规模数据处理分析的技术领域中,Hadoop及其生态内的各功能组件占据了绝对的统治地位。Hadoop原生的MapReduce计算框架由于任务抽象简单、计算流程固定、计算的中间结果写入磁盘引起大量读写开销等短板,正逐步的被基于内存的分布式计算框架Spark代替,应用于各类大规模数据处理分析的场景中,其优势主要体现在以下5个方面:
1、更快的计算速度。采用计算中间结果的内存缓存机制和基于DAG的数据处理过程优化策略,进一步提升数据处理速率。
2、简单易用的分布式计算。将大规模数据处理任务,抽象为RDD的处理变换操作,将并行实现的分布式计算任务拆分为各自独立的串行计算过程。
3、适合丰富的应用场景。Spark内部集成了SQL、机器学习、流计算、图运算等多种类型计算模型,满足多种大规模数据分析的场景需求。
4、兼容多样的存储系统。满足对包括HDFS、HBase、Hive、S3等多种大规模数据存储系统的高效读写需求,轻松处理TB级以上规模以上的数据。
5、资源管理与高可靠性。结合Yarn、Mesos等多种类型的资源管理器,监控协调各计算子任务的运行状态,失败重启机制确保分布式作业的可靠性。
二、RDD计算模型原理
Spark将数据处理过程抽象为对内存中RDD(弹性分布式数据集)的操作,RDD的可以通过从数据源直接读取和集合数据类型封装两种方式创建。针对RDD的操作,根据其结果主要分为如map、flatMap、mapPartition、filter等生成新的RDD的transformation(转换)操作和collect、reduce、foreach等生成集合数据类型或结果写入的action(行为)操作两大类。
上图中描述了一个典型的Spark作业基于RDD实现数据的处理过程。其中,Spark对RDD的处理过程是惰性的,只有调用对RDD的action操作才能启动对RDD的计算过程,连续的调用多个transformation操作是无法使数据处理过程真正的执行。在触发RDD计算过程后,根据Spark内置的DAG(有向无环图)引擎将多个对RDD的操作执行策略进行优化。
为满足对大规模数据的处理需要,Spark将RDD划分为多个partition(分区),以partition为单位将数据分散到集群上的各个节点中。针对RDD的action操作和transformation操作间的本质区别就是生成的结果是否为RDD。
三、基于Yarn实现资源管理
由于Hadoop的HDFS与Spark的RDD抽象读写具有较为完备的兼容性,各版本Spark均提供对应当前Hadoop版本的安装包。同样,Spark也可以使用Hadoop中的Yarn作为自身的资源管理器,用以完成对Spark集群中是作业管理和任务计算资源调度分配等工作。
在Spark作业的执行过程中,Yarn将在集群中的物理节点上的Executor的JVM进程封装为独立的Container,并提供独立的临时文件目录以及内存和CPU资源。同时,Spark还提供了共享文件依赖的机制将Spark作业执行过程中,各Executor所需的如jar包、.so动态库、py文件及其他格式类型的文件依赖资源与Spark作业自身的执行文件分发到各Container中,使得Spark作业能够具备更为灵活的拓展性。
四、技术栈
现如今,Spark作业支持Java、Scala、Python以及R四种语言编写,Spark自身提供了SQL、机器学习、流计算以及图运算四种类型的计算功能组件,开发人员可根据实际的应用需求和相应组件的功能特性完成Spark作业的开发。但是,其中如GraphX等部分功能组件仅支持Java及Scala语言的调用。
SQL:基于对内存中RDD操作和DAG引擎优化,Spark能够实现比基于原生MapReduce的Hive SQL更高效的计算过程。同时,采用DataFrame封装Spark作业能够以函数调用的方式完成SQL操作。
机器学习:Spark基于内存实现RDD操作,能够满足使用大规模数据集完成机器学习建模时进行迭代运算的需要。其自身提供的MLlib组件包中提供了大量常用的机器学习算法模型,同时,Intel基于Spark开发的BigDL使Spark能够完成深度学习的建模计算过程。
流计算:Spark Streaming将数据源抽象为DStream,将各时间窗内持续产生的实时数据切分为不同的RDD,以RDD为单位完成对时间窗内实时数据的处理,但其计算模式仍存在批处理的特性。
图运算:Spark中自带的图运算引擎GraphX采用由并行超步与全局同步组成的Bulk Synchronous Parallell(整体同步并行)模式,将图运算过程抽象为各步的迭代直至符合收敛停止条件。
五、应用场景
在网易大数据开发计算平台Mammut中,作业流任务中已支持Spark类型的计算节点。在原有SQL类型节点的基础上,通过上传Spark作业对应的jar包并完成相对应类型参数的配置,即可完成更多更为灵活的ETL过程,弥补Hive原生udf函数和SQL语句无法完成某些特殊要求计算的短板。
为实现更加通用性更广的服务,基于组件化的方式将常用的非SQL的批处理计算过程实现为通用的功能组件包,通过传入特定的参数实现功能的调用,从而为后续的开发过程节约成本。
网易云免费体验馆,0成本体验20+款云产品!
更多网易研发、产品、运营经验分享请访问网易云社区。
相关文章:
【推荐】 互联网金融中的数据挖掘技术应用
【推荐】 AndroidTV开发(1)
Spark——为数据分析处理提供更为灵活的赋能的更多相关文章
- Spark 实践——用 Scala 和 Spark 进行数据分析
本文基于<Spark 高级数据分析>第2章 用Scala和Spark进行数据分析. 完整代码见 https://github.com/libaoquan95/aasPractice/tre ...
- 大数据学习:Spark是什么,如何用Spark进行数据分析
给大家分享一下Spark是什么?如何用Spark进行数据分析,对大数据感兴趣的小伙伴就随着小编一起来了解一下吧. 大数据在线学习 什么是Apache Spark? Apache Spark是一 ...
- 使用Index()+Match()函数实现更为灵活的VLookUp()
上一篇 http://www.cnblogs.com/-SANG/p/8407017.html 文章中已经介绍了vlookup的用法. 今天要使用index+match实现更为灵活的vlookup 先 ...
- Python3实战Spark大数据分析及调度 (网盘分享)
Python3实战Spark大数据分析及调度 搜索QQ号直接加群获取其它学习资料:715301384 部分课程截图: 链接:https://pan.baidu.com/s/12VDmdhN4hr7yp ...
- Python3实战spark大数据分析及调度 ☝☝☝
Python3实战spark大数据分析及调度 ☝☝☝ 一.实例分析 1.1 数据 student.txt 1.2 代码 二.代码解析 2.1函数解析 2.1.1 collect() RDD的特性 在 ...
- Python3实战spark大数据分析及调度✍✍✍
Python3实战spark大数据分析及调度 整个课程都看完了,这个课程的分享可以往下看,下面有链接,之前做java开发也做了一些年头,也分享下自己看这个视频的感受,单论单个知识点课程本身没问题,大 ...
- Spark高级数据分析——纽约出租车轨迹的空间和时间数据分析
Spark高级数据分析--纽约出租车轨迹的空间和时间数据分析 一.地理空间分析: 二.pom.xml 原文地址:https://www.jianshu.com/p/eb6f3e0c09b5 作者:II ...
- 详细解读Spark的数据分析引擎:Spark SQL
一.spark SQL:类似于Hive,是一种数据分析引擎 什么是spark SQL? spark SQL只能处理结构化数据 底层依赖RDD,把sql语句转换成一个个RDD,运行在不同的worker上 ...
- Apache Spark大数据分析入门(一)
摘要:Apache Spark的出现让普通人也具备了大数据及实时数据分析能力.鉴于此,本文通过动手实战操作演示带领大家快速地入门学习Spark.本文是Apache Spark入门系列教程(共四部分)的 ...
随机推荐
- Javaoo学习数组
- Java运算符——通过示例学习Java编程(6)
作者:CHAITANYA SINGH 来源:https://www.koofun.com/pro/kfpostsdetail?kfpostsid=17 运算符是表示动作的字符,例如+是表示加法的算 ...
- netty-socketio即时通讯
jar包和依赖包在360云盘中:所有文件 > 学习 > jar包 > netty-socketio-1.7.10以及依赖 原文链接:http://www.cnblogs.com/al ...
- JS添加事件和解绑事件:addEventListener()与removeEventListener()
作用: addEventListener()与removeEventListener()用于处理指定和删除事件处理程序操作. 它们都接受3个参数:事件名.事件处理的函数和布尔值. 布尔值参数是true ...
- Yii2中多表关联查询(with、join、joinwith)
表结构 现在有客户表.订单表.图书表.作者表, 客户表Customer (id customer_name) 订单表Order (id order_name custome ...
- JS 字符串 时间 数字函数操作 事件
字符串 操作 var s="abcdefg" s.tolowerCase() 转小写 s.toupperCase() 转大写 s.substring(2,5) 索引下 ...
- C# 分支语句 练习题
1.“请输入年份:”(1-9999) “请输入月份:”(1-12) “请输入日期:”(要判断大小月,判断闰年) 判断输入的时间日期是否正确 bool dateISOK = false;//放置日期是否 ...
- echarts getAttribute”的值: 对象为 null 或未定义 错误解决方法,
echarts.js引用放在head中或者放在body中HTML代码的前面了,造成加载时阻塞后面的html. 解决方法就是将echarts.js的引用放在</body>之前就可以了,完美解 ...
- Ubuntu下Postgres安装与配置
postgres8.4安装配置:1.安装postgres8.4~$ sudo apt-get install postgresql 2.修改超级管理员postgres密码:以系统用户运行psql~$ ...
- struts2默认拦截器defaultStack
第一次使用Struts2.3.20,前台页面向后台传值,怎么总是提示值为null,查找半天原来是struts配置文件的action中忘记引入defaultStack拦截器了,所以即使Action中万事 ...