用Nginx扩展Spark Master Web UI
2018-12-29 本文已影响0人
苦咖啡JerryKFC
0 背景
公司最近迁移 Hadoop 集群到堡垒机内部,内部机器不能直接访问了,spark master web UI 的 8080 端口被映射出来使用。
用过 spark 的童鞋该都知道,它的 master 和 worker 都有自己的页面,master 的端口是 8080, worker 的端口是8081,每个 job 也有页面,端口从 4040 开始,这么多端口我们要一一映射出来吗?而且即使我们都建立了映射,从 master 的页面看到(从开发者工具可以看到)的都是内部 IP,并不能点击了直接链接过去。
Spark Master Web UI1 目的
这里就有两个要解决的问题: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 配置文件,基本的思路是:
- 用 subs_filter 替换原页面中的链接,使指向其他节点的链接转到 master 上;
- 再用 location 拦截这些链接改回原样;
- 最后用 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(链接地址已修改)