Sparkラーニング(masterノードで外部サービスを提供)

2268 ワード

Sparkでデータの処理を行った後、結果をクライアントに返す必要があります.1つの方法は、処理した結果を保存し、クライアントがこの結果にアクセスすることです.このモードは計算量が比較的大きく,結果が比較的安定で,リアルタイム性が高くない場合に適している.もう1つの方法は、SparkContextでクライアントに直接サービスを提供することです.JavaWebで行うのはオプションです.ここではScalaを利用してプログラミングし、httpサービスを外部に提供します.返される結果はJson形式で、次はコードです.
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と組み合わせると便利で、リアルタイム性が高いものに適しています.
より簡単なオープンソーススキームはたくさんありますが、小規模なアプリケーションでは、このような直接的な方法も時々良い選択です.