3

我们应用程序的一部分通过存储传输服务 API 发起从 Amazon S3 到 Google Cloud Storage 的传输。我们已经成功启动并运行了几个月,直到昨天我们的传输停止工作。我们可以看到在控制台中启动了传输,但它无限期挂起,并显示一个历史项目:“此传输正在开始......”我们有一个后台进程轮询传输状态,我们看到返回状态“transfer_calculating”

在尝试调试此问题时,我们通过存储控制台设置了传输。我们使用了与我们的应用程序相同的 AWS 访问密钥 ID/秘密访问密钥,并且传输成功完成。这使我们相信问题与传输服务 API 或我们启动 API 调用的代码无关。

转移工作代码:

TransferJob tjob = new TransferJob()
    .setDescription(description)
    .setStatus('ENABLED')
    .setProjectId(transferGoogleProject)
    .setTransferSpec(
    new TransferSpec()
        .setGcsDataSink(new GcsData().setBucketName(googleStorageBucket))
        .setAwsS3DataSource(
        new AwsS3Data()
            .setBucketName(s3Bucket)
            .setAwsAccessKey(new AwsAccessKey().setAccessKeyId(transferAwsKey).setSecretAccessKey(transferAwsSecret)))
        .setObjectConditions(new ObjectConditions().setIncludePrefixes(s3Keys))
        .setTransferOptions(
        new TransferOptions()
            .setDeleteObjectsFromSourceAfterTransfer(false)
            .setOverwriteObjectsAlreadyExistingInSink(true)
            .setDeleteObjectsUniqueInSink(false)))
    .setSchedule(
    new Schedule()
        .setScheduleStartDate(date)
        .setScheduleEndDate(date)
        .setStartTimeOfDay(time))

tjob = storagetransfer.transferJobs().create(tjob).execute()

库配置:

<dependency>
    <groupId>com.google.api-client</groupId>
    <artifactId>google-api-client</artifactId>
    <version>1.19.1</version>
</dependency>
<dependency>
    <groupId>com.google.apis</groupId>
    <artifactId>google-api-services-bigquery</artifactId>
    <version>v2-rev191-1.19.1</version>
</dependency>
<dependency>
    <groupId>com.google.apis</groupId>
    <artifactId>google-api-services-storage</artifactId>
    <version>v1-rev26-1.19.1</version>
</dependency>
<dependency>
    <groupId>com.google.apis</groupId>
    <artifactId>google-api-services-storagetransfer</artifactId>
    <version>v1-rev3-1.19.1</version>
</dependency>
<dependency>
    <groupId>com.google.oauth-client</groupId>
    <artifactId>google-oauth-client</artifactId>
    <version>1.19.0</version>
</dependency>
<dependency>
    <groupId>com.google.http-client</groupId>
    <artifactId>google-http-client</artifactId>
    <version>1.19.0</version>
</dependency>
<dependency>
    <groupId>com.google.http-client</groupId>
    <artifactId>google-http-client-jackson2</artifactId>
    <version>1.19.0</version>
</dependency>

我们已经在我们的开发环境中将版本提高到 1.21.0,但传输仍然卡在“此传输正在开始...”

在这一点上我们被卡住了,还有其他人遇到这个问题吗?

4

4 回答 4

3

根据 Google 的 @mayur-deshpande 提供的反馈(谢谢!),我们的问题源于传递给 setStartTimeOfDay() 的时间值需要采用 UTC。到目前为止,我们已经使用了 US/Pacific,这是在创建转移开发指南的以下片段中规定的

/**
 * Specify times below using US Pacific Time Zone.
 */
private static final String START_DATE = "YYYY-MM-DD";
private static final String START_TIME = "HH:MM:SS";

由于时差,我们发送请求的时间已经过去,所以传输一直处于启动状态,直到我们的时间到达第二天。当请求最终完成时,我们看到了这种情况。

当天 setStartTime() 的 javadoc 确实指出需要使用 UTC:

/**
 * The time in UTC at which the transfer will be scheduled to start in a day. Transfers may start
 * later than this time. If not specified, transfers are scheduled to start at midnight UTC.
 * @param startTimeOfDay startTimeOfDay or {@code null} for none
 */
public Schedule setStartTimeOfDay(TimeOfDay startTimeOfDay)

上面引用的示例代码应该反映了这个要求,所以我将在 github repo 中提出问题。

此外,由于我们只进行一次传输,因此我们确保将开始时间设置为未来一分钟,以解决服务器之间细微的时间差异:

DateTime now = new DateTime().plusMinutes(1)
Date date = new Date().setDay(now.dayOfMonth).setMonth(now.monthOfYear).setYear(now.year)
TimeOfDay time = new TimeOfDay().setHours(now.hourOfDay).setMinutes(now.minuteOfHour).setSeconds(0)
于 2016-03-16T16:55:50.137 回答
2

请注意,在 API 中,StartTimeOfDay 参考 UTC(请参阅 API 参考:https ://cloud.google.com/storage/transfer/reference/rest/v1/transferJobs#Schedule )。您通过电子邮件发送给我们的请求指定了过去基于 UTC 的一个小时。请以 UTC 格式指定 StartTimeOfDay。如果您只想立即开始一次性作业,只需将 StartTimeOfDay 字段留空即可。

另请注意,Google Cloud UI 允许客户在本地时区指定 StartTimeOfDay,这与 API 不同。

于 2016-03-16T18:20:44.450 回答
0

我发现 Storage Transfer Service 很难开始工作。有很多细微差别。清理文档并以清晰的方式将所有信息放在一个易于查找的位置将非常有帮助。

在我之后的任何人的概述:

1) 创建服务帐号

2) 通过 IAM,为服务帐户赋予 Project->Editor 角色

3) 从 github.com/GoogleCloudPlatform/java-docs-samples/blob/master/storage/storage-transfer/src/main/java/com/google/cloud/storage/storagetransfer/samples/ 上的示例代码开始

  • 3a) 只需要关心三个类:AwsRequester、TransferJobUtils & RetryHttpInitializerWrapper

    3b) 创建一个 Storagetransfer 客户端,需要 google-api-services-storagetransfer jar,以连接您的秘密 JSON 文件

  • 3c) 创建一个 TransferJob 对象以提交作业,这是您设置 projectId 和 Schedule 的地方,您至少需要设置日期并将时间留空以立即提交,但您确实需要创建一个时间表

    3d) 创建一个 TransferSpec 对象,该对象将包含您的大部分配置选项。与选项的映射不明确。您将需要使用 JSON API 文档https://cloud.google.com/storage/transfer/reference/rest/v1/TransferSpec并匹配 Java API 中的名称。至少,您将需要
    填充:AWS 存储桶和凭证、GCS 接收器等......该示例为您提供了这个。但是您还需要使用字符串列表设置 ObjectConditions.setIncludePrefixes,就像通过 UI 一样。

4) 不要费心去理解主页,cloud.google.com/storage/transfer/create-client,只读一次。它只是没有帮助真正让它发挥作用。

HTH?

于 2017-01-20T22:45:51.057 回答
0

我也有这个问题。通过 Google Storage 网页传输提交工作但通过 api 已完全停止工作。

我什至尝试使用 Google Storage Oauth 网页尝试提交,但以同样的方式失败。

于 2016-03-15T18:29:18.947 回答