apache-spark - 如何在 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 资源管理器一无所知,无法指出自己去哪里调查。
请帮忙。谢谢
解决方案
您提到 127.0.0.1 作为主机名还是 0.0.0.0?
127.0.0.1 将在您的本地系统中工作,但不能在 AWS中工作,因为它是环回地址。在这种情况下,您需要使用 0.0.0.0 作为主机名
还要确保端口已打开,并且从您的 IP 提供了访问权限。为此,请转到您的实例的入站规则并在自定义 TCP 规则下添加 6161(如果尚未完成)。
让我知道这是否有任何区别
推荐阅读
- javascript - 如何将子项中的状态链接回父项,父项又充当子项并将值返回给其父项?
- c# - 过滤实体框架 6 中包含的元素
- hive - Hive 保留字列表
- typescript - 如何避免在类型声明和类型保护中声明相同的字符串?
- python - 使用类方法访问类中的类变量
- java - 如何使用 Springdoc 在 OpenAPI 3.0 中创建链接?
- cognos - 在 Cognos 中压缩计划报告
- mysql - 如何在mysql中对没有分组的数据求和
- javascript - 如何在 ajax 登录后响应(JWT)中获取使用的 ID?
- python - 有没有办法在 Django 管理站点中显示(十六进制颜色)字段的颜色?