我正在尝试使用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
要进行这项工作是否需要更多配置?
答案 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上运行管道时,在那里使用的主题和订阅可能已经在其上显示了消息。