首页 > 解决方案 > 如何在 Spark 应用程序的 EMR 主节点上运行 http 服务器

问题描述

我有一个在 AWS EMR 5.28.0 上运行的 Spark 流应用程序 (Spark 2.4.4)。在主节点上的驱动程序应用程序中,除了设置火花流作业外,我还运行了一个 http 服务器(Akka-http 10.1.6),它可以查询驱动程序应用程序的数据,我绑定到端口 6161,如下所示:

val bindingFuture: Future[ServerBinding] = Http().bindAndHandle(myapiroutes, "127.0.0.1", 6161)

try {
      bindingFuture.map { serverBinding =>
        log.info(s"AlertRestApi bound to ${serverBinding.localAddress}")
      }
    } catch {
      case ex: Exception  => {
        log.error(s"Failed to bind to 127.0.0:6161")
        system.terminate()
      }
    }

然后我开始火花流:

ssc.start()

当我在本地 spark 上测试这个时,我可以访问http://localhost:6161/myapp/v1/data并从 spark 流中获取数据,到目前为止一切都很好。

但是,当我在 AWS EMR 中运行此应用程序时,我无法访问端口 6161。我 ssh 进入驱动程序节点并尝试 curl 我的 url,它给了我错误消息:

[hadoop@ip-xxx-xx-xx-x ~]$ curl http://xxx.xx.xx.x:6161/myapp/v1/data

curl: (7) Failed to connect to xxx.xx.xx.x port 6161: Connection refused

当我查看驱动程序节点中的日志时,我确实看到端口已绑定(为什么主机显示 0:0:0:0:0:0:0:0?我不知道,这是在我的开发测试,它有效,我看到相同的日志并能够访问 url):

20/04/13 16:53:26 INFO MyApp: MyRestApi bound to /0:0:0:0:0:0:0:0:6161

所以我的问题是,我应该怎么做才能访问驱动节点上端口 6161 的 api?我意识到 Yarn 资源管理器可能会参与其中,但我对 Yarn 资源管理器一无所知,无法指出自己去哪里调查。

请帮忙。谢谢

标签: apache-sparkhttphadoop-yarnamazon-emr

解决方案


您提到 127.0.0.1 作为主机名还是 0.0.0.0?

127.0.0.1 将在您的本地系统中工作,但不能在 AWS中工作,因为它是环回地址。在这种情况下,您需要使用 0.0.0.0 作为主机名

还要确保端口已打开,并且从您的 IP 提供了访问权限。为此,请转到您的实例的入站规则并在自定义 TCP 规则下添加 6161(如果尚未完成)。

让我知道这是否有任何区别


推荐阅读