Dockerized Apache Beam returns "No id provided"
Dockerized Apache Beam returns "No id provided"
我在使用 dockerized Apache Beam 时遇到了问题。当尝试 运行 容器时,我收到 "No id provided."
消息,仅此而已。这是代码和文件:
Docker 文件
FROM apache/beam_python3.8_sdk:latest
RUN apt update
RUN apt install -y wget curl unzip git
COPY ./ /root/data_analysis/
WORKDIR /root/data_analysis
RUN python3 -m pip install -r data_analysis/beam/requirements.txt
ENV PYTHONPATH=/root/data_analysis
ENV WORKER_ID=1
CMD python3 data_analysis/analysis.py
代码analysis.py
:
import apache_beam as beam
from apache_beam.options.pipeline_options import PipelineOptions
def run():
options = PipelineOptions(["--runner=DirectRunner"])
with beam.Pipeline(options=options) as p:
p | beam.Create([1, 2, 3]) | beam.Map(lambda x: x-1) | beam.Map(print)
if __name__ == "__main__":
run()
命令:
% docker build -f Dockerfile_beam -t beam .
[+] Building 242.2s (12/12) FINISHED
...
% docker run --name=beam beam
2021/09/15 13:44:07 No id provided.
我发现此错误消息很可能是由以下行生成的:https://github.com/apache/beam/blob/410ad7699621e28433d81809f6b9c42fe7bd6a60/sdks/python/container/boot.go#L98
但这是什么意思?这是哪个id我错过了什么?
此错误很可能是由于您的 Docker 图像基于 SDK 线束图像 (apache/beam_python3.8_sdk
) 而发生的。 SDK 线束图像用于可移植管道;当可移植 运行ner 需要执行必须以其原始语言执行的管道阶段时,它会启动一个带有 SDK harness 的容器,并将该管道阶段的执行委托给 SDK harness。因此,当 SDK harness 启动时,它期望启动它的 运行ner 提供各种配置详细信息,其中之一就是 ID。当你直接启动这个容器时,没有提供那些配置细节并且它崩溃了。
为了了解您的特定用例的上下文,让我首先绘制出运行宁可移植管道所涉及的不同过程。
Pipeline Construction <---> Job Service <---> SDK Harness
\--> Cross-Language SDK Harness
- 管道构建 - 您定义和运行管道的过程。它将您的管道定义发送到作业服务并接收管道结果。它不执行任何管道。
- 求职服务 - 适合您的运行选择的流程。这可能使用与原始管道构造不同的语言,因此不能 运行 用户代码,例如自定义 DoFns。
- SDK Harness - 执行用户代码的进程,由作业服务启动和管理。默认情况下,它位于 docker 容器中。
- Cross-Language SDK Harness 一个进程从不同于管道构造的语言执行代码。在你的例子中,Python 的 Kafka IO 使用跨语言,并且实际上是在 Java SDK harness 中执行的。
目前,您创建的 docker 容器是基于 SDK harness 容器的,这听起来不像您想要的。您似乎一直在尝试将您的管道构建代码容器化,但不小心将 SDK 线束容器化了。但是既然你描述了你希望 ReadFromKafka 消费者被容器化,听起来你需要的是作业服务器被容器化,除了它使用的任何 SDK 工具。
作业服务器容器化是可能的,而且可能已经完成了。例如,这里有一个 containerized Flink Job Server。容器化作业服务器可能会给您带来工件方面的一些麻烦,因为容器无法访问您本地计算机上的工件暂存目录,但可能有解决方法。
此外,您提到要避免让 SDK 工具在嵌套的 docker 容器中启动。如果您为 SDK harness 启动工作池 docker 容器并将其设置为 external environment,运行ner 假设它支持外部环境,将尝试连接到 URL 你提供而不是创建一个新的 docker 容器。如果在 Python SDK 中可行,您还需要为 Java 跨语言环境配置此项。此配置应通过 python 的管道选项完成。 --environment_type
和 --environment_options
是很好的起点。
我遇到了同样的问题,您可以像这样重写 ENTRYPOINT
:
docker run -it --rm --entrypoint /bin/sh <your-container-registry>/<your-image>/dataflow-worker-harness
从那里你将能够 /bin/sh
并尽情玩耍。
我在使用 dockerized Apache Beam 时遇到了问题。当尝试 运行 容器时,我收到 "No id provided."
消息,仅此而已。这是代码和文件:
Docker 文件
FROM apache/beam_python3.8_sdk:latest
RUN apt update
RUN apt install -y wget curl unzip git
COPY ./ /root/data_analysis/
WORKDIR /root/data_analysis
RUN python3 -m pip install -r data_analysis/beam/requirements.txt
ENV PYTHONPATH=/root/data_analysis
ENV WORKER_ID=1
CMD python3 data_analysis/analysis.py
代码analysis.py
:
import apache_beam as beam
from apache_beam.options.pipeline_options import PipelineOptions
def run():
options = PipelineOptions(["--runner=DirectRunner"])
with beam.Pipeline(options=options) as p:
p | beam.Create([1, 2, 3]) | beam.Map(lambda x: x-1) | beam.Map(print)
if __name__ == "__main__":
run()
命令:
% docker build -f Dockerfile_beam -t beam .
[+] Building 242.2s (12/12) FINISHED
...
% docker run --name=beam beam
2021/09/15 13:44:07 No id provided.
我发现此错误消息很可能是由以下行生成的:https://github.com/apache/beam/blob/410ad7699621e28433d81809f6b9c42fe7bd6a60/sdks/python/container/boot.go#L98
但这是什么意思?这是哪个id我错过了什么?
此错误很可能是由于您的 Docker 图像基于 SDK 线束图像 (apache/beam_python3.8_sdk
) 而发生的。 SDK 线束图像用于可移植管道;当可移植 运行ner 需要执行必须以其原始语言执行的管道阶段时,它会启动一个带有 SDK harness 的容器,并将该管道阶段的执行委托给 SDK harness。因此,当 SDK harness 启动时,它期望启动它的 运行ner 提供各种配置详细信息,其中之一就是 ID。当你直接启动这个容器时,没有提供那些配置细节并且它崩溃了。
为了了解您的特定用例的上下文,让我首先绘制出运行宁可移植管道所涉及的不同过程。
Pipeline Construction <---> Job Service <---> SDK Harness
\--> Cross-Language SDK Harness
- 管道构建 - 您定义和运行管道的过程。它将您的管道定义发送到作业服务并接收管道结果。它不执行任何管道。
- 求职服务 - 适合您的运行选择的流程。这可能使用与原始管道构造不同的语言,因此不能 运行 用户代码,例如自定义 DoFns。
- SDK Harness - 执行用户代码的进程,由作业服务启动和管理。默认情况下,它位于 docker 容器中。
- Cross-Language SDK Harness 一个进程从不同于管道构造的语言执行代码。在你的例子中,Python 的 Kafka IO 使用跨语言,并且实际上是在 Java SDK harness 中执行的。
目前,您创建的 docker 容器是基于 SDK harness 容器的,这听起来不像您想要的。您似乎一直在尝试将您的管道构建代码容器化,但不小心将 SDK 线束容器化了。但是既然你描述了你希望 ReadFromKafka 消费者被容器化,听起来你需要的是作业服务器被容器化,除了它使用的任何 SDK 工具。
作业服务器容器化是可能的,而且可能已经完成了。例如,这里有一个 containerized Flink Job Server。容器化作业服务器可能会给您带来工件方面的一些麻烦,因为容器无法访问您本地计算机上的工件暂存目录,但可能有解决方法。
此外,您提到要避免让 SDK 工具在嵌套的 docker 容器中启动。如果您为 SDK harness 启动工作池 docker 容器并将其设置为 external environment,运行ner 假设它支持外部环境,将尝试连接到 URL 你提供而不是创建一个新的 docker 容器。如果在 Python SDK 中可行,您还需要为 Java 跨语言环境配置此项。此配置应通过 python 的管道选项完成。 --environment_type
和 --environment_options
是很好的起点。
我遇到了同样的问题,您可以像这样重写 ENTRYPOINT
:
docker run -it --rm --entrypoint /bin/sh <your-container-registry>/<your-image>/dataflow-worker-harness
从那里你将能够 /bin/sh
并尽情玩耍。