Spark 学习之 分布式计算模拟案例

Spark分布式计算模拟案例:

三个JVM

	Client、Executor1、Executor2

案例流程:

	启动两个服务器之后,客户端发送数据进行运算后得出结果

案例所建立的类:

	 Driver:     客户端,进行数据的发送
	Executor1:   服务器1,作为第一个计算节点来计算客户端发来的数据
	Executor2:   服务器2,作为第二个计算节点来计算客户端发来的数据
	  Task:      数据结构,里面存放完整数据以及数据的逻辑
	SubTask:     计算任务,每个节点所处理的数据以及计算操作

案例的详细实现:

Driver.scala

import java.io.{ObjectOutput, ObjectOutputStream, OutputStream}
import java.net.Socket

object Driver {
  def main(args: Array[String]): Unit = {

    // 连接服务器
    val client1  = new Socket("localhost", 1111)
    val client2  = new Socket("localhost", 2222)

    val task = new Task()

    val out1: OutputStream = client1.getOutputStream
    val objOut1 = new ObjectOutputStream(out1)

    val subTask = new SubTask()
    subTask.logic = task.logic
    subTask.datas = task.datas.take(2)

    objOut1.writeObject(subTask)
    objOut1.flush()
    objOut1.close()
    client1.close()

    val out2: OutputStream = client2.getOutputStream
    val objOut2 = new ObjectOutputStream(out2)

    val subTask2 = new SubTask()
    subTask2.logic = task.logic
    subTask2.datas = task.datas.takeRight(2)

    objOut2.writeObject(subTask2)
    objOut2.flush()
    objOut2.close()
    client2.close()



    println("客户端已将数据发送完!!!")
  }
}

Executor1.scala

import java.io.{InputStream, ObjectInputStream}
import java.net.{ServerSocket, Socket}

object Executor1 {

  def main(args: Array[String]): Unit = {

    // 启动服务器,接收数据
    val server = new ServerSocket(1111)
    println("服务器[1111]启动,等待接收客户端发来的数据。。。")

    // 等待客户端的链接
    val client: Socket = server.accept()
    val in: InputStream = client.getInputStream
    val objIn = new ObjectInputStream(in)
    val subTask: SubTask = objIn.readObject().asInstanceOf[SubTask]
    val ints: List[Int] = subTask.compute()

    println("节点[1111]计算出的结果为: " + ints)

    objIn.close()
    client.close()
    server.close()
  }
}

Executor2.scala

object Executor2 {

  def main(args: Array[String]): Unit = {

    // 启动服务器,接收数据
    val server = new ServerSocket(8888)
    println("服务器[2222]启动,等待接收客户端发来的数据。。。")

    // 等待客户端的链接
    val client: Socket = server.accept()
    val in: InputStream = client.getInputStream
    val objIn = new ObjectInputStream(in)
    val subTask: SubTask = objIn.readObject().asInstanceOf[SubTask]
    val ints: List[Int] = subTask.compute()

    println("节点[2222]计算出的结果为: " + ints)

    objIn.close()
    client.close()
    server.close()
  }
}

Task.scala

class Task extends Serializable {

  val datas = List(2,4,8,16)

  val logic: Int => Int = _ * 2

}

SubTask.scala

class SubTask extends Serializable{

  var datas: List[Int] = _

  var logic: Int => Int = _

  // 计算
  def compute() = {
    datas.map(logic)
  }
}

案例的运行结果:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

顺其自然的济帅哈

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值