首页 > 解决方案 > 无法在 Docker 容器中启动 Spark 驱动程序

问题描述

我有一个 docker 容器,其中包含一个启动 spark 驱动程序的 java 应用程序。它连接到一个火花集群并提交一个结构化的流应用程序。

当我使用--network host参数或参数在主机模式下运行 docker 时,--hostname 10.X.X.X一切正常。但是,由于我使用弹性 beanstalk 来运行应用程序,我无法修改用于启动容器的 docker 命令。此外,没有选项可以使用弹性 beanstalk 更改网络模式或主机名。

当我在没有这些参数的情况下运行 docker 时,docker 无法启动并出现以下异常:

Caused by: java.net.BindException: Cannot assign requested address: Service 'sparkDriver' failed after 16 retries (starting from 37878)! Consider explicitly setting the appropriate port for the service 'sparkDriver' (for example spark.ui.port for SparkUI) to an available port or increasing spark.port.maxRetries.
at sun.nio.ch.Net.bind0(Native Method) ~[na:1.8.0_172]
at sun.nio.ch.Net.bind(Unknown Source) ~[na:1.8.0_172]
at sun.nio.ch.Net.bind(Unknown Source) ~[na:1.8.0_172]
at sun.nio.ch.ServerSocketChannelImpl.bind(Unknown Source) ~[na:1.8.0_172]
at io.netty.channel.socket.nio.NioServerSocketChannel.doBind(NioServerSocketChannel.java:128) ~[news-ml-IT-148-2.jar:IT-148-2]
at io.netty.channel.AbstractChannel$AbstractUnsafe.bind(AbstractChannel.java:558) ~[news-ml-IT-148-2.jar:IT-148-2]
at io.netty.channel.DefaultChannelPipeline$HeadContext.bind(DefaultChannelPipeline.java:1283) ~[news-ml-IT-148-2.jar:IT-148-2]
at io.netty.channel.AbstractChannelHandlerContext.invokeBind(AbstractChannelHandlerContext.java:501) ~[news-ml-IT-148-2.jar:IT-148-2]
at io.netty.channel.AbstractChannelHandlerContext.bind(AbstractChannelHandlerContext.java:486) ~[news-ml-IT-148-2.jar:IT-148-2]
at io.netty.channel.DefaultChannelPipeline.bind(DefaultChannelPipeline.java:989) ~[news-ml-IT-148-2.jar:IT-148-2]
at io.netty.channel.AbstractChannel.bind(AbstractChannel.java:254) ~[news-ml-IT-148-2.jar:IT-148-2]
at io.netty.bootstrap.AbstractBootstrap$2.run(AbstractBootstrap.java:364) ~[news-ml-IT-148-2.jar:IT-148-2]
at io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java:163) ~[news-ml-IT-148-2.jar:IT-148-2]
at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:403) ~[news-ml-IT-148-2.jar:IT-148-2]
at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:463) ~[news-ml-IT-148-2.jar:IT-148-2]
at io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:858) ~[news-ml-IT-148-2.jar:IT-148-2]
at io.netty.util.concurrent.DefaultThreadFactory$DefaultRunnableDecorator.run(DefaultThreadFactory.java:138) ~[news-ml-IT-148-2.jar:IT-148-2]
at java.lang.Thread.run(Unknown Source) ~[na:1.8.0_172]

我尝试了以下方法:

  1. 更新 /etc/hosts
  2. 更新 /etc/hostname
  3. 设置 spark.driver.host
  4. 设置 spark.driver.port
  5. 设置 $HOSTNAME 环境变量
  6. 设置 $SPARK_LOCAL_IP 环境变量
  7. 设置 $SPARK_PUBLIC_DNS 环境变量
  8. 几乎所有上述组合。

不幸的是,我无法使用hostname命令设置主机名,因为这需要 SYS_ADMIN 功能(docker 容器在没有该功能的情况下运行)。我无法添加该功能,因为我无法更改用于运行 docker 容器的命令(即使可以,我也不想这样做)。我意识到在弹性豆茎中运行火花驱动器有点愚蠢。但是,我想保持这一点,以最大限度地减少需要进行的更改(并尽快将其解决) - 我该怎么做才能使其正常工作?

标签: dockerapache-sparkamazon-elastic-beanstalk

解决方案


推荐阅读