Sparkラーニング(masterノードで外部サービスを提供)
Sparkでデータの処理を行った後、結果をクライアントに返す必要があります.1つの方法は、処理した結果を保存し、クライアントがこの結果にアクセスすることです.このモードは計算量が比較的大きく,結果が比較的安定で,リアルタイム性が高くない場合に適している.もう1つの方法は、SparkContextでクライアントに直接サービスを提供することです.JavaWebで行うのはオプションです.ここではScalaを利用してプログラミングし、httpサービスを外部に提供します.返される結果はJson形式で、次はコードです.
本質的にはJavaを利用してhttpサービスを行っていますが、この方式ではScalaと組み合わせると便利で、リアルタイム性が高いものに適しています.
より簡単なオープンソーススキームはたくさんありますが、小規模なアプリケーションでは、このような直接的な方法も時々良い選択です.
import javax.servlet.http.{HttpServletRequest, HttpServletResponse}
import org.apache.tools.ant.taskdefs.Java
import org.mortbay.jetty.{HttpStatus, Request}
import org.mortbay.jetty.{HttpStatus, Request, Server}
import org.mortbay.jetty.handler._
import org.apache.spark.sql.hive._
import org.apache.spark.{SparkContext,SparkConf}
/**
* Created by tsq on 2016-10-04.
*/
object MainThread extends AbstractHandler {
var _server: Server = null
override def handle(target: String,
request: HttpServletRequest,
response: HttpServletResponse,
dispatch: Int): Unit = {
val url = request.getRequestURI
url.substring(url.lastIndexOf("/") + 1, url.length) match {
case "getData" => {
response.setContentType("text/html;charset=utf-8")
response.setStatus(HttpStatus.ORDINAL_200_OK)
response.getWriter().println(getData(request))
request.asInstanceOf[Request].setHandled(true)
response.getWriter.close()
}
case "stop" => {
response.setContentType("text/html;charset=utf-8")
response.setStatus(HttpStatus.ORDINAL_200_OK)
response.getWriter().println(" ")
request.asInstanceOf[Request].setHandled(true)
response.getWriter.close()
StopThreadEx()
}
case _ => {
response.setStatus(HttpStatus.ORDINAL_404_Not_Found);
request.asInstanceOf[Request].setHandled(true)
}
}
}
def StopThreadEx(): Unit = {
var theRunable = new StopThread(_server)
theRunable.start()
}
def getData(request: HttpServletRequest): String = {
var theParams = request.getParameterMap
var theRet = ""
var theKeys = theParams.keySet().toArray()
for (theKey
本質的にはJavaを利用してhttpサービスを行っていますが、この方式ではScalaと組み合わせると便利で、リアルタイム性が高いものに適しています.
より簡単なオープンソーススキームはたくさんありますが、小規模なアプリケーションでは、このような直接的な方法も時々良い選択です.