Spark使用三层架构代码,分解复杂度,工程化管理代码
三层架构分为控制层、服务层、持久化层
具体实现如下(以wordcount为案例):
一、application包
application包是管理应用程序的包。
这些类包含了应用程序的业务逻辑和功能实现。这些类通常会调用DAO层和Service层的方法,以完成具体的业务功能,,Application包通常位于应用层中,用于实现具体的业务逻辑和功能,提供给用户使用。
WordCountApplication.scala
package com.hadoop.spark.core.framework.application
import com.hadoop.spark.core.framework.common.TApplication
import com.hadoop.spark.core.framework.controller.WordCountController
object WordCountApplication extends App with TApplication{
// 启动应用程序
start(){
val controller = new WordCountController()
controller.dispatch()
}
}
在Scala中,App类是预定义的类,用于在应用程序的入口点执行代码。它是一个没有参数的特质(trait),可以用于在Scala程序中定义主函数。
使用App特质,可以将主函数和相关的代码组织在一起,并且不需要显式地定义main方法。当Scala程序运行时,App特质中的代码会被自动执行。
二、controller包
controller管理控制层的代码。Controller层是管理整个Spark集群的控制器,它可以控制和监视整个集群的运行状态,包括节点的管理、任务的管理、资源的分配等。
这里主要就是执行操作。
WordCountController.scala
package com.hadoop.spark.core.framework.controller
import com.hadoop.spark.core.framework.common.TController
import com.hadoop.spark.core.framework.service.WordCountService
/**
* 控制层
*/
class WordCountController extends TController {
private val wordCountService = new WordCountService()
// 调度
def dispatch(): Unit = {
// TODO 执行业务操作
val array = wordCountService.dataAnalysis()
array.foreach(println)
}
}
三、service包
service包是管理服务层的代码包,service包是一个用于存放业务逻辑代码的包。
WordCountService.scala
package com.hadoop.spark.core.framework.service
import com.hadoop.spark.core.framework.common.TService
import com.hadoop.spark.core.framework.dao.WordCountDao
import org.apache.spark.rdd.RDD
/**
* 服务层
*/
class WordCountService extends TService {
private val wordCountDao = new WordCountDao()
// 数据分析
def dataAnalysis() = {
val lines = wordCountDao.readFile("datas/word.txt")
val words: RDD[String] = lines.flatMap(_.split(" "))
val wordToOne = words.map(word=>(word,1))
val wordToSum: RDD[(String, Int)] = wordToOne.reduceByKey(_+_)
val array: Array[(String, Int)] = wordToSum.collect()
array
}
}
四、dao包
dao包是管理持久层的代码包,DAO包是一种数据访问对象(Data Access Object)的包,它通常用于封装数据访问层的代码,位于业务逻辑层和持久化数据层之间。
DAO包通常位于持久化层中,用于与数据库进行交互,实现数据的持久化操作。
WordCountDao .scala
package com.hadoop.spark.core.framework.dao
import com.hadoop.spark.core.framework.common.TDao
// 持久层
class WordCountDao extends TDao{
}
五、common包
common包是一个用于存放公共代码的包,common包里的代码通常由公共类(共同、重复属性被抽取)和工具类组成,这些类和工具类被其他层和模块共享使用,以提供公共的功能和服务。
TApplication.scala
package com.hadoop.spark.core.framework.common
import com.hadoop.spark.core.framework.controller.WordCountController
import com.hadoop.spark.core.framework.util.EnvUtil
import org.apache.spark.{SparkConf, SparkContext}
trait TApplication {
def start(master:String ="local[*]", app:String = "Application")( op : => Unit ): Unit = {
val sparConf = new SparkConf().setMaster(master).setAppName(app)
val sc = new SparkContext(sparConf)
EnvUtil.put(sc)
try {
op
} catch {
case ex => println(ex.getMessage)
}
// TODO 关闭连接
sc.stop()
EnvUtil.clear()
}
}
TController.scala
package com.hadoop.spark.core.framework.common
trait TController {
def dispatch(): Unit
}
TService.scala
package com.hadoop.spark.core.framework.common
trait TService {
def dataAnalysis():Any
}
TDao.scala
package com.hadoop.spark.core.framework.common
import com.hadoop.spark.core.framework.util.EnvUtil
trait TDao {
def readFile(path:String) = {
EnvUtil.take().textFile(path)
}
}
六、util包
util包是一个用于存放工具类的包,它通常用于提供一些常用的工具和函数,以方便开发人员在程序中使用(区别common包:util包在哪都能用)。util包里的工具类通常包括日期处理、字符串操作、数组操作、集合操作等。
EnvUtil.scala
package com.hadoop.spark.core.framework.util
import org.apache.spark.SparkContext
object EnvUtil {
private val scLocal = new ThreadLocal[SparkContext]()
def put( sc : SparkContext ): Unit = {
scLocal.set(sc)
}
def take(): SparkContext = {
scLocal.get()
}
def clear(): Unit = {
scLocal.remove()
}
}
七、bean包
bean包存放的是一些实体类,规范要求这些类必须具有一个无参构造方法,所有的属性必须用getter和setter方法来访问。
以上通过学习和阅读网上资料,对你们的不一定能起到帮助,但是可以给你们提供参考。如有雷同,请联系!!!