文章目录

  • 前言
  • 一、开启分布式运算
    • 1、单机运算
    • 2、分布式运算思路
    • 3、分布式运算代码示例
    • 4、spark运算
  • 总结

前言

Apache Spark 是专为大规模数据处理而设计的快速通用的计算引擎,在处理大量的数据时,采用分布式计算来加快运算速度。
        采用一些官方的解释,总会让人摸不到头脑,spark是用来计算的,但是计算啥呢?啥时候用呢?来一个"hello world"。如果有一个集合:
List(1,2,3,4)
计算集合中每个数值乘2得多少?这点数据瞬间即可口算出来。但是在遇到足够多的数据的时候,人脑无法一眼看出,并且单体的计算机运算起来也可能吃力起来。

此,采用简单例子入门spark,看不懂你打我。 spark理解起来很简单,还没学的小伙伴可以自信点。


一、开启分布式运算

1、单机运算

通过代码来实现List(1,2,3,4) 的运算(scala)

def main(args: Array[String]): Unit = {var data = List(1,2,3,4);val list = compute(data);list.foreach(println)}// 运算方法var compute=(list:List[Int])=>{list.map(logic);}// 逻辑方法var logic=(num:Int)=>{num*2}

如上例子,实现了将集合中的数据全部乘2然后返回。这个例子很简单,数据量又小,完全没有必要进行分布式计算,但是,可以引入分布式计算的新篇章。

2、分布式运算思路


(图 A)

如图所示,分布式计算时存在一个任务的发布者Driver,和任务的执行者Executor。任务发布者把要计算的数据按照按照一定的规则拆分,将拆分的数据和逻辑发送到执行者中执行,执行完毕返回。
        数据拆分的过程可以成为数据分区,拆分的结果可以称之为分片,按照如上的思路,即使再多的数据,都可以按照特有的规则进行数据分区,将每个分片发送到不同的机器执行,提高执行速度。

3、分布式运算代码示例

按照图A的思路的话,在进行任务的发布和执行过程中,应该有3台机器,此时可以假设ExecutorserverDriverclient,他们之间通过Socket来进行信息传输。

代码如下(server或者称为Executor):

 def main(args: Array[String]): Unit = {// 启动服务器,接收数据val server = new ServerSocket(9999)println("服务器启动,等待接收数据")// 等待客户端的连接val client: Socket = server.accept()val in: InputStream = client.getInputStreamval objIn = new ObjectInputStream(in)val task: SubTask = objIn.readObject().asInstanceOf[SubTask]val ints: List[Int] = task.compute()println("计算节点[9999]计算的结果为:" + ints)objIn.close()client.close()server.close()}

启动两个Executor,一个为端口为8888另一个端口为9999(代码一样)。来模拟两个执行者,等待Driver提交执行数据和逻辑。
代码如下(Driver或者称为Client):

// 注意Serializable关键字,否则socket传输会报错
class Task extends Serializable {val datas = List(1,2,3,4)//val logic = ( num:Int )=>{ num * 2 }val logic : (Int)=>Int = _ * 2
}
class SubTask extends Serializable {var datas : List[Int] = _var logic : (Int)=>Int = _// 计算def compute() = {datas.map(logic)}
}

import java.io.{ObjectOutputStream, OutputStream}
import java.net.Socketobject Driver {def main(args: Array[String]): Unit = {// 连接服务器val client1 = new Socket("localhost", 9999)val client2 = new Socket("localhost", 8888)val task = new Task()val out1: OutputStream = client1.getOutputStreamval objOut1 = new ObjectOutputStream(out1)// 获取发送给Executor1的数据和逻辑val subTask = new SubTask()subTask.logic = task.logicsubTask.datas = task.datas.take(2)objOut1.writeObject(subTask)objOut1.flush()objOut1.close()client1.close()val out2: OutputStream = client2.getOutputStreamval objOut2 = new ObjectOutputStream(out2)// 获取发送给Executor2的数据和逻辑val subTask1 = new SubTask()subTask1.logic = task.logicsubTask1.datas = task.datas.takeRight(2)objOut2.writeObject(subTask1)objOut2.flush()objOut2.close()client2.close()println("客户端数据发送完毕")}
}

输出:

Driver:
客户端数据发送完毕
Executor:
服务器启动,等待接收数据
计算节点[8888]得到数据:List(3, 4),计算的结果为:List(6, 8)
Executor2:
服务器启动,等待接收数据
计算节点[9999]得到数据:List(1, 2),计算的结果为:List(2, 4)

代码思路如下:

  1. 两个Executor启动服务等待客户端提交数据和逻辑。
  2. Driver将数据List(1,2,3,4)拆分为List(1,2)和List(3,4)
  3. Driver将分片分别发送到两个Executor执行。
  4. Executor收到数据和计算逻辑进行计算,计算结果打印。

4、spark运算

上面展示了最原始的分布式计算逻辑方式。但是spark为分布式计算框架,既然是框架,肯定会把很多公有的逻辑进行分装。通过spark实现如上功能
代码如下(scala示例):

  def main(args: Array[String]): Unit = {val spark = SparkSession.builder.master("local").appName("test").getOrCreate()val sc = spark.sparkContext;//上面代码暂时不需要理解,是spark的本地调试的固定写法。//创建RDD并且处理逻辑val value = sc.makeRDD(List(1, 2, 3, 4)).map(_*2);value.collect().foreach(println)sc.stop()

这点代码,spark即可帮我们完成数据的分区、数据和逻辑的发送、执行中异常的处理等等。
        为何spark这么强,因为spark有一个很强的数据结构RDD。
        RDD(Resilient Distributed Dataset)叫做弹性分布式数据集,是 Spark 中最基本的数据处理模型。代码中是一个抽象类,它代表一个弹性的、不可变、可分区、里面的元素可并行计算的集合。着重说下不可变是指计算的逻辑不可变,RDD中分装了计算逻辑是不允许改变的;可分区是指RDD的数据可以自行分区,分区之后才可以在不同的机器上并行执行。
        代码中的makeRDD是将List集合转换成了RDD数据结构,.map(_*2)方法简化版本的写法,意思是数据乘以2。
        虽然RDD帮我们做了那么多,有些时候还是需要更详细的看一看才会理解,比如它是按照什么规则分区呢?分几个区?数据又是如何划分呢?参考【spark】RDD分区解析


总结

虽然只是一个简单的例子,但是也足以了解spark的工作的思想。通过这一思想可以实现很多复杂的逻辑的计算。这样看来spark是如此的简单,但是现在又想说spark又是如此的复杂,因为spark封装了很多逻辑需要了解。
        比如spark的一个任务的某一个Execotor执行错误之后需要如何处理呢?比如发送的数据巨大,好几个G的时候,spark又是如何处理呢?spark集群又是如何工作呢?这里面也有太多太多需要学习的地方。

【spark】一文(10分钟)入门spark相关推荐

  1. 10分钟入门 ANSA API

      扫描下方二维码关注我的微信公众号 - CAE软件二次开发Lab阅读全文! 文章目录 10分钟入门 ANSA API Script Editor (脚本编辑器) Modules(模块) 在ANSA中 ...

  2. 教程 | 10分钟入门简笔画(哆啦A梦篇)

    多啦A梦主题曲 - 腾讯视频 从小就喜欢小叮当这个形象,不知道为什么后来改成了多啦A梦. 多啦A梦之歌,时常萦绕在耳旁: 心中有许多愿望,能够实现有多棒,只有哆啦a梦可以带着我实现梦想 可爱圆圆胖脸庞 ...

  3. 微信小程序怎么在wxml中插入多个图片_白云工商带你10分钟入门微信小程序开发...

    10分钟入门微信小程序开发 程序开发难吗? No!来白云工商带你10分钟入门微信小程序开发! 英语不好能学好程序开发吗? 当然能,程序开发常见的也就那几个单词,只要热爱,非常简单! 欣赏 首先,来欣赏 ...

  4. 教程 | 10分钟入门简笔画(彩色小插画)

    你好,色彩. BY:铃铛子 马克笔的笔触感觉: BY:铃铛子 由于大家写字的时候,为了笔锋,会起笔停顿一下,落笔再停顿一下,但是运行马克笔的时候不要这样,起笔确定了就画线,落笔除非必要,否则不停顿. ...

  5. 教程 | 10分钟入门简笔画12(创意小插画)

    我的一家 很多宝宝说想学创作,今天跟大家分享简笔画中的联想小插画. 所谓联想小插画,就是想到哪里画到哪里.首先确定一个主题,抓住主要元素,然后用装饰性字体.元素.花边来丰富画面.我尝试创作了一张My ...

  6. 教程 | 10分钟入门禅绕画 3

    禅绕装饰画是一种意识流装饰画,也是一种有趣随性的涂鸦,笔触可以天马星空随意走动. 禅绕画的构图技巧:重复.对称.均衡.重叠.勾线.肌理等.所有技巧的组合可以使得画面节奏和谐.疏密有度.节奏韵律恰如其分 ...

  7. 【Spark深入学习 -10】基于spark构建企业级流处理系统

    ----本节内容------- 1.流式处理系统背景 1.1 技术背景 1.2 Spark技术很火 2.流式处理技术介绍 2.1流式处理技术概念 2.2流式处理应用场景 2.3流式处理系统分类 3.流 ...

  8. 10分钟入门Pandas(添加一些个人见解)

    pandas十分钟入门(codedog翻译) 原文下载地址:https://download.csdn.net/download/qq_35189715/11392455 github地址:https ...

  9. SQL人的优势:实战大数据开发10分钟入门

    金色的九月,即将开启收获的篇章. 一早醒来,魔都湛蓝的天空,暑气未消的阳光,一扫前几日狂风暴雨的阴霾.品着自己煮的咖啡,吃上一口朱家角寄来的苏荷月饼,人生真赞! 这个礼拜将32G内存和M.2 SSD都 ...

最新文章

  1. SQL Server 2005 Express 版
  2. Java程序员常用工具集
  3. 相关方登记册模板_项目的主要相关方
  4. Java swing 代码例子
  5. 块元素和行内元素的说明及转换
  6. 删除下拉框只找23火星软件_删除下拉框速来火星下拉,删除下拉框就推92火星软件...
  7. 4.5 Frank 口语习语前7
  8. opencv 涂抹区域得方法
  9. 嵌入式车牌识别与称重系统
  10. DNS解析时发现域名和IP不一致,访问了该域名会如何(大厂真题)
  11. Flutter仿美团应用开发笔记-首页 (1)
  12. 【路径规划】基于matlab蚁群优化遗传算法机器人栅格地图最短路径规划【含Matlab源码 1581期】
  13. U型地埋管(地埋管换热器采用单孔双U管)仿真教程
  14. 卡尔曼滤波算法-Kalman Filter Algorithm
  15. Tecnomatix Plant Simulation 14 学习之路(二)
  16. Mac开发之获取设备名字、IP地址和MAC地址
  17. Word论文排版技巧
  18. 基于Godot 2.2 alpha的蘑菇塔游戏
  19. PostgreSQL创建库、表空间、角色、SCHEMA
  20. 一篇文章带你搞懂网络层(网际层)-- 地址篇

热门文章

  1. 反向传播算法推导、激活函数、梯度消失与爆炸
  2. @Aspect 用法
  3. 【图解】连狗子都能看懂的Python基础总结(二)什么是库、包、模块?
  4. 从CSDN转战博客园
  5. ESP32 擦除flash
  6. 安装ubuntu系统时硬盘分区方案
  7. git上传文件到gitee
  8. android开发中为MultiAutoCompleteTextView控件添加其他分隔符
  9. matlab中axis函数程序,matlab中axis函数
  10. 跟艾文学编程《零基础入门学Python》(4)Python 面向对象