package org.apache.spark
import java.text.SimpleDateFormatimport java.util.concurrent.ScheduledFutureimport java.util.Dateimport java.util.concurrent.TimeUnitimport org.apache.spark.internal.Loggingimport org.apache.spark.util.{ThreadUtils, Utils}
import org.apache.spark.rpc.{RpcCallContext, RpcEndpoint, RpcEnv, ThreadSafeRpcEndpoint}
/**
* Created by cloud on 18/1/18.
*/classZsparkRpcServer(
override val rpcEnv: RpcEnv,
val conf : SparkConf) extendsThreadSafeRpcEndpointwithLogging{
val scheduledThread = ThreadUtils.newDaemonSingleThreadScheduledExecutor("echo-thread")
var scheduledThreadFuture : ScheduledFuture[_] = _
overridedefonStart(): Unit = {
scheduledThreadFuture = scheduledThread.scheduleWithFixedDelay(newRunnable {
overridedefrun(): Unit = {
val simpleTime = newSimpleDateFormat("yy-MM-dd HH:mm:ss")
logInfo(simpleTime.format(newDate()))
}
},3000L,2000L,TimeUnit.MILLISECONDS)
}
overridedefreceive: PartialFunction[Any, Unit] = {
caseZRequest(command) => logInfo(command.toUpperCase)
}
overridedefreceiveAndReply(context: RpcCallContext): PartialFunction[Any, Unit] = {
caseZRequest(command) => context.reply(ZResponse(command.reverse))
case _ => context.reply(ZResponse("ECHO".reverse))
}
overridedefonStop(): Unit = {
if(scheduledThreadFuture != null){
scheduledThreadFuture.cancel(true)
}
scheduledThread.shutdownNow()
}
}
objectZsparkRpcServer{
valSN="z-cloud-echo"valEN="z-cloud-echo-ser"defmain(args : Array[String]): Unit = {
val conf = newSparkConf()
val securityManager = newSecurityManager(conf)
val rpcEnv = RpcEnv.create(SN,Utils.localHostName(),23456,conf,securityManager)
rpcEnv.setupEndpoint(EN,newZsparkRpcServer(rpcEnv,conf))
rpcEnv.awaitTermination()
}
}
caseclassZRequest(command : String)caseclassZResponse(result : String)
Client端示例代码
object ZsparkRpcClient{
def main(args: Array[String]): Unit = {
val host=Utils.localHostName()
val port=23456val sparkConf =new SparkConf()
val securityManager =new SecurityManager(sparkConf)
val rpcEnv = RpcEnv.create(ZsparkRpcServer.SN,host,host,port,sparkConf,securityManager,true)
val rpcEnvRef = rpcEnv.setupEndpointRef(RpcAddress(host,port),ZsparkRpcServer.EN)
/*//异步获取response的方式val res=rpcEnvRef.ask[ZResponse](ZRequest("cli-echo"))
res.onComplete {
case Success(v) => println(v)
case Failure(e) => println(e)
}(ThreadUtils.sameThread)
//发送不需要Server端回复的消息
rpcEnvRef.send(ZRequest("non-response"))
*//** 同步获取response的方式
**/for (i <- args){
rpcEnvRef.send(ZRequest(i))
val rpcTimeout=new RpcTimeout(FiniteDuration(3000L,TimeUnit.MILLISECONDS),"timeout")
val res = rpcEnvRef.askSync[ZResponse](ZRequest(i),rpcTimeout)
println(res.result)
}
}
}
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步