Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Google cloud storage 来自S3的云存储传输服务卡在";“此传输正在开始”;_Google Cloud Storage_Google Cloud Data Transfer - Fatal编程技术网

Google cloud storage 来自S3的云存储传输服务卡在";“此传输正在开始”;

Google cloud storage 来自S3的云存储传输服务卡在";“此传输正在开始”;,google-cloud-storage,google-cloud-data-transfer,Google Cloud Storage,Google Cloud Data Transfer,我们应用程序的一部分通过存储传输服务API启动从Amazon S3到Google云存储的传输。我们已经成功安装并运行了几个月,直到昨天我们的传输停止工作。我们可以在控制台中看到传输已启动,但它无限期挂起,只有一个历史记录项声明:“此传输正在启动…”我们有一个后台进程轮询传输状态,我们看到该状态返回“transfer_calculating” 在尝试调试此问题时,我们通过设置了一个传输。我们使用了应用程序使用的相同AWS访问密钥id/机密访问密钥,传输成功完成。这使我们相信问题与传输服务API或启

我们应用程序的一部分通过存储传输服务API启动从Amazon S3到Google云存储的传输。我们已经成功安装并运行了几个月,直到昨天我们的传输停止工作。我们可以在控制台中看到传输已启动,但它无限期挂起,只有一个历史记录项声明:“此传输正在启动…”我们有一个后台进程轮询传输状态,我们看到该状态返回“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>

com.google.api-client
谷歌api客户端
1.19.1
com.google.api
谷歌api服务bigquery
v2-rev191-1.19.1
com.google.api
谷歌api服务存储
v1-rev26-1.19.1
com.google.api
google api服务storagetransfer
v1-rev3-1.19.1
com.google.oauth-client
谷歌oauth客户端
1.19.0
com.google.http-client
谷歌http客户端
1.19.0
com.google.http-client
google-http-client-jackson2
1.19.0
在我们的开发环境中,我们已经升级了1.21.0版本,但是传输仍然停留在“此传输正在开始…”的状态


在这一点上,我们陷入了困境,还有其他人遇到了这个问题吗?

我也遇到了这个问题。通过Google存储网页传输提交内容是可行的,但通过api传输提交内容已经完全停止


我甚至尝试使用Google Storage Oauth网页尝试提交,但同样失败。

根据@mayur deshpande在Google提供的反馈(谢谢!),我们的问题源于传递给setStartTimeOfDay()的时间值需要使用UTC。到目前为止,我们已经使用了US/Pacific,这在以下来自

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

今天的javadoc for setStartTime()确实指出了使用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)

请注意,在API中,StartTimeOfDay引用UTC(请参阅API引用:)。您通过电子邮件向我们发送的请求指定了过去基于UTC的一小时。请指定UTC格式的StartTimeOfDay。如果只想立即开始一次性作业运行,只需将StartTimeOfDay字段留空即可


还请注意,谷歌云用户界面允许客户在本地时区指定StartTimeOfDay,这与API不同

我发现存储传输服务很难开始工作。有许多细微差别。这将是非常有帮助的清理文件,并获得所有的信息在一个容易找到的地方在一个明确的方式

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

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&RetryHttpInitializerRapper

    3b)创建Storagetransfer客户端,需要 google api服务storagetransfer jar,用于连接您的机密 JSON文件

  • 3c)创建TransferJob对象以提交作业,这是您 设置至少需要设置的projectId和Schedule 日期和时间为空,以便立即提交,但您可以 需要创建一个时间表吗

    3d)创建一个TransferSpec对象,该对象将包含大部分 配置选项。选项的映射不清楚。你 将需要使用JSON API文档, 并匹配JavaAPI中的名称。至少,您需要
    填充:AWS存储桶和凭证、地面军事系统接收器等。。。样本 给你这个。但你也会想要设置 ObjectConditions.setIncludePrefixes与字符串列表相同 通过用户界面,您可以使用这种方式

4) 甚至不必费心去理解主页cloud.google.com/storage/transfer/create-client,只需阅读一次即可。这对真正让它工作没有多大帮助


HTH?

我们对遇到的困难表示歉意,并正在调查此问题。请将您的项目ID和确切查询发送至:gs-team@google.com这样我们就可以调查你的案子了?谢谢-谢谢你的提示,我们没有意识到可以让StartTimeOfDay空着立即转会(这当然是我们想要的)。我们已经更新了代码并成功地测试了它。这很好,因为它还消除了创建/发送请求和传输服务接收请求之间的时间差。正如我在下面的回答中所指出的,我们根据《创建传输开发指南》中的示例代码使用了US/Pacific。
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)