无法从Apache Beam中的本地仿真器读取发布/订阅消息

时间:2019-04-29 16:20:08

标签: docker apache-beam google-cloud-pubsub

我正在尝试使用DirectRunner运行一个简单的Apache Beam管道,该管道从Pub / Sub订阅中读取并将消息写入磁盘。

当我在GCP上运行它时,该管道运行良好,但是当我尝试在本地Pub / Sub仿真器上运行它时,它似乎没有任何作用。

我正在使用自定义的Options类,该类扩展了org.apache.beam.sdk.io.gcp.pubsub.PubsubOptions类。

public interface Options extends PubsubOptions {

  @Description("Pub/Sub subscription to read the input from")
  @Required
  ValueProvider<String> getInputSubscription();

  void setInputSubscription(ValueProvider<String> valueProvider);

}

管道非常简单

pipeline
        .apply("Read Pub/Sub Messages", PubsubIO.readMessagesWithAttributes()
        .fromSubscription(options.getInputSubscription()))

        .apply("Add a fixed window", Window.into(FixedWindows.of(Duration.standardSeconds(WINDOW_SIZE))))

        .apply("Convert Pub/Sub To String", new PubSubMessageToString())

        .apply("Write Pub/Sub messages to local disk", new WriteOneFilePerWindow());

使用以下选项执行管道

mvn compile exec:java \
-Dexec.mainClass=DefaultPipeline \
-Dexec.cleanupDaemonThreads=false \
-Dexec.args=" \
--project=my-project \
--inputSubscription=projects/my-project/subscriptions/my-subscription \
--pubsubRootUrl=http://127.0.0.1:8681 \
--runner=DirectRunner"

我正在使用this Pub / Sub仿真器docker映像,并通过以下命令执行它:

docker run --rm -ti -p 8681:8681 -e PUBSUB_PROJECT1=my-project,topic:my-subscription marcelcorso/gcloud-pubsub-emulator:latest

要进行这项工作是否需要更多配置?

2 个答案:

答案 0 :(得分:1)

结果表明,如果设置了GOOGLE_APPLICATION_CREDENTIALS环境变量,则Apache Beam管道无法从本地Pub / Sub仿真器读取。

一旦删除了这个指向GCP服务帐户的环境变量,管道就可以与本地Pub / Sub仿真器无缝协作。

答案 1 :(得分:0)

您可以通过向本地仿真器发出手动HTTP请求(通过curl)来对本地仿真器进行故障排除,例如:

$ curl -d '{"messages": [{"data": "c3Vwc3VwCg=="}]}' -H "Content-Type: application/json" -X POST localhost:8681/v1/projects/my-project/topics/topic:publish
{
  "messageIds": ["5"]
}
$ 

$ curl -d '{"returnImmediately":true, "maxMessages":1}' -H "Content-Type: application/json" -X POST localhost:8681/v1/projects/my-project/subscriptions/my-subscription:pull
{
  "receivedMessages": [{
    "ackId": "projects/my-project/subscriptions/my-subscription:9",
    "message": {
      "data": "c3Vwc3VwCg==",
      "messageId": "5",
      "publishTime": "2019-04-30T17:26:09Z"
    }
  }]
}
$

或通过将gcloud命令行工具指向它:

$ CLOUDSDK_API_ENDPOINT_OVERRIDES_PUBSUB=localhost:8681 gcloud pubsub topics list

此外,请注意,当模拟器启动时,它将从头开始创建主题和订阅,因此上面没有消息。如果您的管道希望立即在订阅上提取消息,那可以解释为什么它看起来“卡住了”。请注意,当您在GCP上运行管道时,在那里使用的主题和订阅可能已经在其上显示了消息。