Spark HistoryServer之Jetty简单使用

这两天在看Spark HistoryServer的代码,发现里面使用了Jetty,下面简单描述下Jetty的使用

有两个Servlet:HelloServlet和WorldServlet

package com.luogankun.servlet;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class HelloServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;  

    private String msg = "hello";  

    public HelloServlet() {
    }  

    public HelloServlet(String msg) {
        this.msg = "hello: "+ msg;
    }  

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.getWriter().println(msg);
    }
}  
package com.luogankun.servlet;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class WorldServlet  extends HttpServlet{
    private static final long serialVersionUID = 1L;

    private String msg = "world";

    public WorldServlet() {
    }

    public WorldServlet(String msg) {
        this.msg = "world: " + msg;
    }

    protected void doGet(HttpServletRequest request,
            HttpServletResponse response) throws ServletException, IOException {
        response.getWriter().println(msg);
    }
}

Jetty客户端测试:

package com.luogankun.jetty;

import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.servlet.ServletContextHandler;
import org.eclipse.jetty.servlet.ServletHolder;
import com.luogankun.servlet.HelloServlet;
import com.luogankun.servlet.WorldServlet;

public class JettyServer {
    public static void main(String[] args) throws Exception {
        Server server = new Server(7798);  //指定jettyserver的启动端口

        ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS);
        context.setContextPath("/");  //设置访问路径
        server.setHandler(context);

        // http://localhost:8080/hello
        context.addServlet(new ServletHolder(new HelloServlet()), "/hello"); //当访问/hello时执行HelloServlet()
        // http://localhost:8080/hello/luogankun
        context.addServlet(new ServletHolder(new HelloServlet("luogankun")),"/hello/luogankun"); //当执行/hello/luogankun时执行HelloServlet

        // http://localhost:8080/world
        context.addServlet(new ServletHolder(new WorldServlet()), "/world"); //当执行/world时执行WorldServlet
        // http://localhost:8080/world/luogankun
        context.addServlet(new ServletHolder(new WorldServlet("luogankun")), "/world/luogankun"); //当执行/world/luogankun时执行WorldServlet

        server.start();
        server.join();
    }
}

总结:当request请求匹配到某个设定的路径时就执行某个指定的Servlet。

在浏览器中访问如下地址,注意观察执行结果

http://localhost:8080/hello

http://localhost:8080/hello/luogankun

http://localhost:8080/world

http://localhost:8080/world/luogankun

查看HistoryServer的代码

def initialize() {
    attachPage(new HistoryPage(this))
    attachHandler(createStaticHandler(SparkUI.STATIC_RESOURCE_DIR, "/static"))

    val contextHandler = new ServletContextHandler
    contextHandler.setContextPath(HistoryServer.UI_PATH_PREFIX)   //UI_PATH_PREFIX是history
    contextHandler.addServlet(new ServletHolder(loaderServlet), "/*")
    attachHandler(contextHandler)
}

private val loaderServlet = new HttpServlet {
    protected override def doGet(req: HttpServletRequest, res: HttpServletResponse): Unit = {
        val parts = Option(req.getPathInfo()).getOrElse("").split("/")
        if (parts.length < 2) {
            res.sendError(HttpServletResponse.SC_BAD_REQUEST, ......)}")
            return
        }

      val appId = parts(1)

      appCache.get(appId)
      res.sendRedirect(res.encodeRedirectURL(req.getRequestURI()))
    }
}

可以看到当请求为: /history/*时交由loadServlet执行,该步骤在historyserver主页中点击查看某个app历史信息时触发;

此处的req.getPathInfo()的值为/app编号,形如:/app-20141105100235-0009

刚开始看代码时,不懂jetty,死活弄不明白怎么跳转过到具体的app信息页面的,了解下jetty后明白了是按照指定的请求路径进行转发的。

时间: 2024-10-20 16:21:25

Spark HistoryServer之Jetty简单使用的相关文章

spark historyserver 页面反应很慢 jvm堆调参

我们的spark historyserver 最近页面打开很慢 jstat -gcutil pid 1000 发现full gc 相当严重 查看堆大小,发现默认堆1G,打算修改到4G jps -lvm |grep pid 30283 org.apache.spark.deploy.history.HistoryServer -Xmx1g 步骤 vi spark-env.sh # 加添 export SPARK_DAEMON_MEMORY=4096m # 重启 historyserver服务 sb

Spark history-server 配置 !运维人员的强大工具

spark  history Server产生背景 以standalone运行模式为例,在运行Spark Application的时候,Spark会提供一个WEBUI列出应用程序的运行时信息:但该WEBUI随着Application的完成(成功/失败)而关闭,也就是说,Spark Application运行完(成功/失败)后,将无法查看Application的历史记录: Spark history Server就是为了应对这种情况而产生的,通过配置可以在Application执行的过程中记录下了

Spark Netty与Jetty (源码阅读十一)

spark呢,对Netty API又做了一层封装,那么Netty是什么呢~是个鬼.它基于NIO的服务端客户端框架,具体不再说了,下面开始. 创建了一个线程工厂,生成的线程都给定一个前缀名. 像一般的netty框架一样,创建Netty的EventLoopGroup: 在常用的netty框架中呢,会创建客户端辅助类,设置SocketChannel: Bootstrap b = new Bootstrap(); b.group(group).channel(NioSocketChannel.class

Spark HistoryServer服务迁移

由于目前spark的历史服务所在的机器内存不太够,导致spark的hisstory server经常卡死.所以决定将该服务迁移到一台内存稍微多点的机器上,并将historyserver内存由原来的3g调整为8g,下面开始记录一下本次操作过程的步骤,方便以后进行查阅. 我们的生产环境采用的是spark on yarn的模式. 1. 首先查看一下原本historyserver的启动用户:启动用户为hadoop, 所以后续的进程启动也应该是hadoop用户,这点绝对不能错 2. 将spark文件夹co

Spark本地安装和简单示例

sudo yum install java-1.7.0-openjdk.i686 sudo yum install maven-noarch maven-release-manager.noarch maven-release-plugin.noarch sudo yum install scala.noarch Spark是基于内存的大数据分析平台,由UC Berkely AMP lab发布的一大神器.相比Hadoop而言,其最大的优势是基于内存,这样可以极大提高其速度和通用性. 安装环境 在

Spark快速入门的简单程序案例

参考:官网的quick start 1.上传文件README 2.小程序 3.继续 4.继续

Spark 在Hadoop HA下配置HistoryServer问题

我的Spark机群是部署在Yarn上的,因为之前Yarn的部署只是简单的完全分布式,但是后来升级到HA模式,一个主NN,一个备NN,那么Spark HistoryServer的配置也需要相应的做修改,因为不做修改会报错 Exception in thread "main" java.lang.reflect.InvocationTargetException at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native

Spark调研笔记第3篇 - Spark集群相应用的调度策略简单介绍

Spark集群的调度分应用间调度和应用内调度两种情况,下文分别进行说明. 1. 应用间调度 1) 调度策略1: 资源静态分区 资源静态分区是指整个集群的资源被预先划分为多个partitions,资源分配时的最小粒度是一个静态的partition. 依据应用对资源的申请需求为其分配静态的partition(s)是Spark支持的最简单的调度策略. 我们已经知道,不同的应用有各自的Spark Context且占用各自的JVM和executor(s).依据Spark Job Scheduling文档的

Spark(十二) -- Spark On Yarn &amp; Spark as a Service &amp; Spark On Tachyon

Spark On Yarn: 从0.6.0版本其,就可以在在Yarn上运行Spark 通过Yarn进行统一的资源管理和调度 进而可以实现不止Spark,多种处理框架并存工作的场景 部署Spark On Yarn的方式其实和Standalone是差不多的,区别就是需要在spark-env.sh中添加一些yarn的环境配置,在提交作业的时候会根据这些配置加载yarn的信息,然后将作业提交到yarn上进行管理 首先请确保已经部署了Yarn,相关操作请参考: hadoop2.2.0集群安装和配置 部署完