如何在Spark应用程序的EMR主节点上运行http服务器

时间:2020-04-14 00:14:48

标签: apache-spark http yarn amazon-emr

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

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 Streaming中获取数据,到目前为止一切都很好。

但是,当我在AWS EMR中运行此应用程序时,无法访问端口6161。我将ssh插入驱动程序节点并尝试卷曲我的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:0?我不知道,那是开发测试中的方式,并且有效,我看到了相同的日志,并且能够访问url):

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

所以我的问题是,我应该怎么做才能访问驱动程序节点上端口6161上的api?我知道可能会涉及到纱线资源管理器,但是我对纱线资源管理器一无所知,无法指出要在哪里进行调查。

请帮助。谢谢

1 个答案:

答案 0 :(得分:0)

您提到的主机名是127.0.0.1或0.0.0.0 ??

127.0.0.1将在您的本地系统中运行,但在AWS中无法运行,因为它是回送地址。在这种情况下,您需要使用0.0.0.0作为主机名

还要确保端口是开放的,并且可以通过IP访问。为此,请转到您实例的入站规则,并在自定义TCP规则下添加6161(如果尚未完成)。

让我知道这是否有所不同

相关问题