Google 数据流 - 使用数据存储选项连接到数据存储时出错
Google dataflow - Connecting to datastore using datastore options gives error
我们正在尝试通过在 java 中编写的数据流作业连接到数据存储服务,但由于数据存储 SDK 错误,我们遇到了问题。
我们正在 运行 使用 eclipse 在本地机器上使用 directrunner 的工作。
代码:
import java.net.SocketTimeoutException;
import org.apache.beam.sdk.options.PipelineOptions;
import com.google.cloud.datastore.Datastore;
import com.google.cloud.datastore.DatastoreOptions;
public class StarterPipeline {
public interface StarterPipelineOption extends PipelineOptions {
}
@SuppressWarnings("serial")
public static void main(String[] args) throws SocketTimeoutException {
Datastore datastore = DatastoreOptions.getDefaultInstance().getService();
}
}
错误:
Exception in thread "main" java.lang.IllegalArgumentException: java.net.URISyntaxException: Illegal character in path at index 45: https://datastore.googleapis.com/v1/projects/<!DOCTYPE html>
at com.google.datastore.v1.client.DatastoreFactory.validateUrl(DatastoreFactory.java:122)
at com.google.datastore.v1.client.DatastoreFactory.buildProjectEndpoint(DatastoreFactory.java:108)
at com.google.datastore.v1.client.DatastoreFactory.newRemoteRpc(DatastoreFactory.java:115)
at com.google.datastore.v1.client.DatastoreFactory.create(DatastoreFactory.java:65)
at com.google.cloud.datastore.spi.v1.HttpDatastoreRpc.<init>(HttpDatastoreRpc.java:71)
at com.google.cloud.datastore.DatastoreOptions$DefaultDatastoreRpcFactory.create(DatastoreOptions.java:61)
at com.google.cloud.datastore.DatastoreOptions$DefaultDatastoreRpcFactory.create(DatastoreOptions.java:55)
at com.google.cloud.ServiceOptions.getRpc(ServiceOptions.java:512)
at com.google.cloud.datastore.DatastoreOptions.getDatastoreRpcV1(DatastoreOptions.java:179)
at com.google.cloud.datastore.DatastoreImpl.<init>(DatastoreImpl.java:56)
at com.google.cloud.datastore.DatastoreOptions$DefaultDatastoreFactory.create(DatastoreOptions.java:51)
at com.google.cloud.datastore.DatastoreOptions$DefaultDatastoreFactory.create(DatastoreOptions.java:45)
at com.google.cloud.ServiceOptions.getService(ServiceOptions.java:499)
at purplle.datapipeline.StarterPipeline.main(StarterPipeline.java:234)
Caused by: java.net.URISyntaxException: Illegal character in path at index 45: https://datastore.googleapis.com/v1/projects/<!DOCTYPE html>
at java.net.URI$Parser.fail(Unknown Source)
at java.net.URI$Parser.checkChars(Unknown Source)
at java.net.URI$Parser.parseHierarchical(Unknown Source)
at java.net.URI$Parser.parse(Unknown Source)
at java.net.URI.<init>(Unknown Source)
at com.google.datastore.v1.client.DatastoreFactory.validateUrl(DatastoreFactory.java:120)
... 13 more
我们使用的是以下版本的 SDK,我认为这些版本是最新的。
<!-- https://mvnrepository.com/artifact/com.google.cloud/google-cloud-storage -->
<dependency>
<groupId>com.google.cloud</groupId>
<artifactId>google-cloud-storage</artifactId>
<version>1.37.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.google.cloud/google-cloud-datastore -->
<dependency>
<groupId>com.google.cloud</groupId>
<artifactId>google-cloud-datastore</artifactId>
<version>1.37.1</version>
</dependency>
<dependency>
<groupId>com.google.cloud.dataflow</groupId>
<artifactId>google-cloud-dataflow-java-sdk-all</artifactId>
<version>2.5.0</version>
</dependency>
在寻找 google 解决方案时,我们发现下面的线程表明此问题已在 2 月得到解决,但我正面临此问题。
https://github.com/GoogleCloudPlatform/google-cloud-java/issues/2440
联系了 google 云支持,他们说 运行 在本地开发管道时,我们必须通过环境变量手动提供项目 ID。
以下是 google 支持人员的回复。
您收到的错误来自 1,并在“未提供服务器或凭据”时抛出。在您的情况下,您在构建客户端时没有指定凭据
数据存储数据存储 = DatastoreOptions.getDefaultInstance().getService();
客户端库尝试通过环境变量 GOOGLE_APPLICATION_CREDENTIALS 查找凭据,但失败了,因为该作业未 运行 在 Compute Engine、Kubernetes Engine、App Engine 或 Cloud Functions 上运行. 3 and 4 - 运行 在 Compute/App 引擎中]。我相信您的代码应该适用于 Dataflow运行ner。请确认是否是这样。
要运行本地代码,您可以手动创建和获取服务帐户凭据5, For more detailed example, please check 4 or 6。
所以我在连接到数据存储时下载了服务帐户凭据 API 并且成功了!
我们正在尝试通过在 java 中编写的数据流作业连接到数据存储服务,但由于数据存储 SDK 错误,我们遇到了问题。
我们正在 运行 使用 eclipse 在本地机器上使用 directrunner 的工作。
代码:
import java.net.SocketTimeoutException;
import org.apache.beam.sdk.options.PipelineOptions;
import com.google.cloud.datastore.Datastore;
import com.google.cloud.datastore.DatastoreOptions;
public class StarterPipeline {
public interface StarterPipelineOption extends PipelineOptions {
}
@SuppressWarnings("serial")
public static void main(String[] args) throws SocketTimeoutException {
Datastore datastore = DatastoreOptions.getDefaultInstance().getService();
}
}
错误:
Exception in thread "main" java.lang.IllegalArgumentException: java.net.URISyntaxException: Illegal character in path at index 45: https://datastore.googleapis.com/v1/projects/<!DOCTYPE html>
at com.google.datastore.v1.client.DatastoreFactory.validateUrl(DatastoreFactory.java:122)
at com.google.datastore.v1.client.DatastoreFactory.buildProjectEndpoint(DatastoreFactory.java:108)
at com.google.datastore.v1.client.DatastoreFactory.newRemoteRpc(DatastoreFactory.java:115)
at com.google.datastore.v1.client.DatastoreFactory.create(DatastoreFactory.java:65)
at com.google.cloud.datastore.spi.v1.HttpDatastoreRpc.<init>(HttpDatastoreRpc.java:71)
at com.google.cloud.datastore.DatastoreOptions$DefaultDatastoreRpcFactory.create(DatastoreOptions.java:61)
at com.google.cloud.datastore.DatastoreOptions$DefaultDatastoreRpcFactory.create(DatastoreOptions.java:55)
at com.google.cloud.ServiceOptions.getRpc(ServiceOptions.java:512)
at com.google.cloud.datastore.DatastoreOptions.getDatastoreRpcV1(DatastoreOptions.java:179)
at com.google.cloud.datastore.DatastoreImpl.<init>(DatastoreImpl.java:56)
at com.google.cloud.datastore.DatastoreOptions$DefaultDatastoreFactory.create(DatastoreOptions.java:51)
at com.google.cloud.datastore.DatastoreOptions$DefaultDatastoreFactory.create(DatastoreOptions.java:45)
at com.google.cloud.ServiceOptions.getService(ServiceOptions.java:499)
at purplle.datapipeline.StarterPipeline.main(StarterPipeline.java:234)
Caused by: java.net.URISyntaxException: Illegal character in path at index 45: https://datastore.googleapis.com/v1/projects/<!DOCTYPE html>
at java.net.URI$Parser.fail(Unknown Source)
at java.net.URI$Parser.checkChars(Unknown Source)
at java.net.URI$Parser.parseHierarchical(Unknown Source)
at java.net.URI$Parser.parse(Unknown Source)
at java.net.URI.<init>(Unknown Source)
at com.google.datastore.v1.client.DatastoreFactory.validateUrl(DatastoreFactory.java:120)
... 13 more
我们使用的是以下版本的 SDK,我认为这些版本是最新的。
<!-- https://mvnrepository.com/artifact/com.google.cloud/google-cloud-storage -->
<dependency>
<groupId>com.google.cloud</groupId>
<artifactId>google-cloud-storage</artifactId>
<version>1.37.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.google.cloud/google-cloud-datastore -->
<dependency>
<groupId>com.google.cloud</groupId>
<artifactId>google-cloud-datastore</artifactId>
<version>1.37.1</version>
</dependency>
<dependency>
<groupId>com.google.cloud.dataflow</groupId>
<artifactId>google-cloud-dataflow-java-sdk-all</artifactId>
<version>2.5.0</version>
</dependency>
在寻找 google 解决方案时,我们发现下面的线程表明此问题已在 2 月得到解决,但我正面临此问题。
https://github.com/GoogleCloudPlatform/google-cloud-java/issues/2440
联系了 google 云支持,他们说 运行 在本地开发管道时,我们必须通过环境变量手动提供项目 ID。
以下是 google 支持人员的回复。
您收到的错误来自 1,并在“未提供服务器或凭据”时抛出。在您的情况下,您在构建客户端时没有指定凭据
数据存储数据存储 = DatastoreOptions.getDefaultInstance().getService();
客户端库尝试通过环境变量 GOOGLE_APPLICATION_CREDENTIALS 查找凭据,但失败了,因为该作业未 运行 在 Compute Engine、Kubernetes Engine、App Engine 或 Cloud Functions 上运行. 3 and 4 - 运行 在 Compute/App 引擎中]。我相信您的代码应该适用于 Dataflow运行ner。请确认是否是这样。
要运行本地代码,您可以手动创建和获取服务帐户凭据5, For more detailed example, please check 4 or 6。
所以我在连接到数据存储时下载了服务帐户凭据 API 并且成功了!