用Nginx扩展Spark Master Web UI

0 背景

公司最近迁移 Hadoop 集群到堡垒机内部,内部机器不能直接访问了,spark master web UI 的 8080 端口被映射出来使用。

用过 spark 的童鞋该都知道,它的 master 和 worker 都有自己的页面,master 的端口是 8080, worker 的端口是8081,每个 job 也有页面,端口从 4040 开始,这么多端口我们要一一映射出来吗?而且即使我们都建立了映射,从 master 的页面看到(从开发者工具可以看到)的都是内部 IP,并不能点击了直接链接过去。

Spark Master Web UI

1 目的

这里就有两个要解决的问题:1. 能不能在不建立端口映射的情况下看到所有页面;2. 从 8080 端口可以链接到这些页面(原生就是这么操作的)

2 方案

  • 修改 spark 的页面生成机制(谷歌了一把没有看到类似的操作,笔者对 Java 也不是很熟,就不对 spark 动刀子了)
  • 利用 spark 的 REST 服务 Apache Livy 构建自己的管理页面(工程量有点大,暂时不考虑)
  • 利用 nginx 的 proxy_pass 反向代理和 subs_filter 替换功能修改页面

3 解决

proxy_pass 是 nginx 的自带命令,subs_filter 则是一个模块,不包含在官方发布的二进制文件当中(官方发布的 docker 也不包含),但是 Debian 或者 Ubuntu 发布的版本中是自带的,具体可以通过 nginx -V 命令查看(注意红字):

没有的话就需要自行编译了。

然后就是写 nginx 配置文件,基本的思路是:

  1. 用 subs_filter 替换原页面中的链接,使指向其他节点的链接转到 master 上;
  2. 再用 location 拦截这些链接改回原样;
  3. 最后用 proxy_pass 反向代理到内网中的其他节点。

最后 nginx 配置文件如下:

server {
    listen  8090;

    location ~ /!/(172\.\d*\.\d*\.\d*:\d*)(.*) {
        proxy_pass        http://$1$2;
        proxy_set_header  Accept-Encoding "";

        set $proxy_host $1;  # 后面的 subs_filter 中不能用 location 中的 $1,如果要用先保存成其他变量
        subs_filter  'a href="/' 'a href="/!/$proxy_host/';  # 修改其他节点中的链接
    }
    location / {
        proxy_pass        http://127.0.0.1:8080;
        proxy_set_header  Accept-Encoding "";  # 关闭 gzip 压缩

        subs_filter  http://(172\.\d*\.\d*\.\d*):8081 /!/$1:8081 ir;  # 8081 是 worker 的端口
        subs_filter  http://(172\.\d*\.\d*\.\d*:\d*) /!/$1/jobs/ ir;  # 其他端口都认为是 job 的
    }
}

效果图:

链接地址已修改
Worker Web UI (链接地址已修改)
Job Web UI(链接地址已修改)

你可能感兴趣的:(用Nginx扩展Spark Master Web UI)